64 lines
2.5 KiB
SQL
64 lines
2.5 KiB
SQL
-- 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
|
|
$$;
|