synops/migrations/016_message_placements.sql
vegard 8bf82a78d9 Implementer message_placements (oppgave 20.1)
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>
2026-03-18 07:59:07 +00:00

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;