feat(P5A.T1): conversation_watch_sessions table with RLS + realtime

This commit is contained in:
byGalax
2026-05-16 21:16:38 +02:00
parent d1193142ae
commit ad239ec549
@@ -0,0 +1,63 @@
-- Phase 5A: per-conversation synchronized YouTube playback.
--
-- conversation_watch_sessions: one row per Watch-Together session. The bubble
-- in the chat is a normal `messages` row whose plaintext payload is
-- `{v:1, type:'watch_together', session_id:<id>}`. The owner's player drives
-- current_state (jsonb {playing, position_seconds, updated_at_ms}); other
-- joiners reconcile via realtime postgres_changes UPDATE when local drift
-- exceeds 2 seconds.
create table if not exists public.conversation_watch_sessions (
id uuid primary key default gen_random_uuid(),
conversation_id uuid not null references public.conversations(id) on delete cascade,
owner_user_id uuid not null references auth.users(id) on delete cascade,
video_id text not null,
started_at timestamptz not null default now(),
ended_at timestamptz null,
current_state jsonb not null default '{"playing":false,"position_seconds":0,"updated_at_ms":0}'::jsonb,
constraint conversation_watch_sessions_video_id_len check (length(video_id) between 1 and 64)
);
create index if not exists conversation_watch_sessions_conv_idx
on public.conversation_watch_sessions(conversation_id, started_at desc);
alter table public.conversation_watch_sessions enable row level security;
drop policy if exists conversation_watch_sessions_select on public.conversation_watch_sessions;
drop policy if exists conversation_watch_sessions_insert on public.conversation_watch_sessions;
drop policy if exists conversation_watch_sessions_update on public.conversation_watch_sessions;
create policy conversation_watch_sessions_select
on public.conversation_watch_sessions
for select
using (public.is_conversation_member(conversation_id));
create policy conversation_watch_sessions_insert
on public.conversation_watch_sessions
for insert
with check (
public.is_conversation_member(conversation_id)
and owner_user_id = auth.uid()
);
create policy conversation_watch_sessions_update
on public.conversation_watch_sessions
for update
using (owner_user_id = auth.uid())
with check (owner_user_id = auth.uid());
alter table public.conversation_watch_sessions replica identity full;
do $$
begin
if not exists (
select 1
from pg_publication_tables
where pubname = 'supabase_realtime'
and schemaname = 'public'
and tablename = 'conversation_watch_sessions'
) then
execute 'alter publication supabase_realtime add table public.conversation_watch_sessions';
end if;
end
$$;