-- User projects (run in Supabase SQL Editor) create table if not exists public.projects ( id uuid primary key default gen_random_uuid(), user_id uuid not null references auth.users (id) on delete cascade, name text not null default 'Untitled project', type text not null check (type in ('video', 'image', 'trimmer')), scene_data jsonb not null default '{}'::jsonb, render_url text, status text not null default 'draft' check (status in ('draft', 'rendering', 'ready')), created_at timestamptz not null default now(), updated_at timestamptz not null default now() ); create index if not exists projects_user_id_idx on public.projects (user_id); create index if not exists projects_updated_at_idx on public.projects (updated_at desc); alter table public.projects enable row level security; create policy "Users can read own projects" on public.projects for select using (auth.uid() = user_id); create policy "Users can insert own projects" on public.projects for insert with check (auth.uid() = user_id); create policy "Users can update own projects" on public.projects for update using (auth.uid() = user_id); create policy "Users can delete own projects" on public.projects for delete using (auth.uid() = user_id); create or replace function public.set_projects_updated_at() returns trigger language plpgsql as $$ begin new.updated_at = now(); return new; end; $$; drop trigger if exists projects_updated_at on public.projects; create trigger projects_updated_at before update on public.projects for each row execute function public.set_projects_updated_at();