Plasseringsrelasjon som sporer hvor meldinger vises på tvers av kontekster (chat, kanban, storyboard, kalender, notes). Grunnmuren for universell overføring mellom verktøy-paneler. Tre deler: - PG-migrasjon 016: message_placements tabell med UNIQUE constraint og indekser for kontekst- og meldingsoppslag - SpacetimeDB: MessagePlacement tabell + place_message, remove_placement, move_on_canvas reducers for sanntids UI-oppdatering - Maskinrommet: STDB-klientmetoder for de tre reducerne Avvik fra spec: FK refererer nodes(id) i stedet for messages(id) siden meldinger er noder (node_kind = 'melding'). Spec oppdatert tilsvarende. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
33 lines
1.9 KiB
PL/PgSQL
33 lines
1.9 KiB
PL/PgSQL
-- 016_message_placements.sql
|
|
-- Plasseringsrelasjon: sporer hvor meldinger vises på tvers av kontekster.
|
|
-- En melding (node) kan ha plasseringer i flere kontekster samtidig
|
|
-- (chat, kanban, storyboard, kalender, notes).
|
|
--
|
|
-- Ref: docs/features/universell_overfoering.md § 2
|
|
|
|
BEGIN;
|
|
|
|
CREATE TABLE message_placements (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
message_id UUID NOT NULL REFERENCES nodes(id) ON DELETE CASCADE,
|
|
context_type TEXT NOT NULL, -- 'chat', 'kanban', 'storyboard', 'calendar', 'notes'
|
|
context_id UUID NOT NULL, -- channel_id, board_id, episode_id, calendar_id, note_id
|
|
entered_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
position JSONB, -- kontekst-spesifikk posisjon (se § 2.2)
|
|
UNIQUE (message_id, context_type, context_id)
|
|
);
|
|
|
|
-- Oppslag: alle meldinger i en gitt kontekst, sortert etter ankomst
|
|
CREATE INDEX idx_placements_context ON message_placements(context_type, context_id, entered_at);
|
|
|
|
-- Oppslag: alle plasseringer for en gitt melding
|
|
CREATE INDEX idx_placements_message ON message_placements(message_id);
|
|
|
|
COMMENT ON TABLE message_placements IS 'Plasseringsrelasjon — sporer hvor meldinger vises. Ref: docs/features/universell_overfoering.md § 2';
|
|
COMMENT ON COLUMN message_placements.message_id IS 'Meldingens node-id (node_kind = melding)';
|
|
COMMENT ON COLUMN message_placements.context_type IS 'Konteksttype: chat, kanban, storyboard, calendar, notes';
|
|
COMMENT ON COLUMN message_placements.context_id IS 'ID til kontekstnoden (kanal, brett, episode, etc.)';
|
|
COMMENT ON COLUMN message_placements.entered_at IS 'Når meldingen ankom denne konteksten (ikke created_at)';
|
|
COMMENT ON COLUMN message_placements.position IS 'Kontekst-spesifikk posisjon som JSONB. null=sortert etter entered_at (chat). {x,y}=canvas (storyboard). {column_id,position}=kanban. {date,all_day}=kalender. {position}=notes.';
|
|
|
|
COMMIT;
|