synops/migrations/019_mixer_channels.sql
vegard fcc9e671a5 Backend for SpacetimeDB-migrering: berikede WS-events + mixer-API
Fase M2 (oppgave 22.2): Portvokteren sender nå full raddata i
WebSocket-events (ikke bare ID), slik at frontend kan oppdatere
stores direkte uten ekstra API-kall.

Endringer:
- ws.rs: Berik node/edge/access-events med full PG-data etter NOTIFY
- ws.rs: Ny mixer_channel_changed event-type + initial_sync inkluderer mixer
- ws.rs: Resync ved lag (broadcast overflow)
- mixer.rs: Nye HTTP-endepunkter som erstatter STDB-reducers
  (create_mixer_channel, set_gain, set_mute, toggle_effect, set_mixer_role)
- 019_mixer_channels.sql: PG-tabell + NOTIFY-trigger for mixer-tilstand
2026-03-18 12:16:36 +00:00

56 lines
1.8 KiB
PL/PgSQL

-- 019_mixer_channels.sql
-- Mixer-kanaler for delt lydmixer-tilstand mellom deltakere i LiveKit-rom.
--
-- Migrert fra SpacetimeDB til PostgreSQL som del av Fase M2 (oppgave 22.2).
-- Portvokteren sender endringer via WebSocket til tilkoblede klienter.
BEGIN;
-- =============================================================================
-- mixer_channels: Delt mixer-tilstand per deltaker per rom.
-- =============================================================================
CREATE TABLE IF NOT EXISTS mixer_channels (
room_id TEXT NOT NULL,
target_user_id TEXT NOT NULL,
gain DOUBLE PRECISION NOT NULL DEFAULT 1.0,
is_muted BOOLEAN NOT NULL DEFAULT false,
active_effects TEXT NOT NULL DEFAULT '{}', -- JSON-streng med effekttilstand
role TEXT NOT NULL DEFAULT 'editor',
updated_by TEXT NOT NULL DEFAULT '',
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
PRIMARY KEY (room_id, target_user_id)
);
-- =============================================================================
-- notify_mixer_channel_change: NOTIFY ved endringer i mixer_channels.
-- =============================================================================
CREATE OR REPLACE FUNCTION notify_mixer_channel_change()
RETURNS trigger AS $$
DECLARE
payload json;
target_row mixer_channels%ROWTYPE;
BEGIN
IF TG_OP = 'DELETE' THEN
target_row := OLD;
ELSE
target_row := NEW;
END IF;
payload := json_build_object(
'op', TG_OP,
'room_id', target_row.room_id,
'target_user_id', target_row.target_user_id
);
PERFORM pg_notify('mixer_channel_changed', payload::text);
RETURN target_row;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER mixer_channels_notify
AFTER INSERT OR UPDATE OR DELETE ON mixer_channels
FOR EACH ROW EXECUTE FUNCTION notify_mixer_channel_change();
COMMIT;