videoscriber-backend / migration.sql
Rimas Kavaliauskas
Switch Space to Docker backend and sync Videoscriber post-processing
6782be3
-- Videoscriber: Full schema migration for new Supabase project
-- Run this in Supabase Dashboard > SQL Editor
-- 1. Extensions
CREATE EXTENSION IF NOT EXISTS pgcrypto;
-- 2. Profiles table
CREATE TABLE IF NOT EXISTS public.profiles (
id uuid PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE,
email text NOT NULL UNIQUE,
full_name text NOT NULL,
created_at timestamptz DEFAULT now(),
updated_at timestamptz DEFAULT now()
);
-- 3. Transcriptions table
CREATE TABLE IF NOT EXISTS public.transcriptions (
id bigserial PRIMARY KEY,
user_id uuid REFERENCES auth.users(id) ON DELETE CASCADE,
source_url text NOT NULL,
source_hash text NOT NULL,
transcript text,
created_at timestamptz DEFAULT now(),
UNIQUE (user_id, source_hash)
);
-- 4. Enable RLS on both tables
ALTER TABLE public.profiles ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.transcriptions ENABLE ROW LEVEL SECURITY;
-- 5. RLS policies for profiles (owner-only)
CREATE POLICY "Users can view own profile"
ON public.profiles FOR SELECT
USING (auth.uid() = id);
CREATE POLICY "Users can insert own profile"
ON public.profiles FOR INSERT
WITH CHECK (auth.uid() = id);
CREATE POLICY "Users can update own profile"
ON public.profiles FOR UPDATE
USING (auth.uid() = id)
WITH CHECK (auth.uid() = id);
-- 6. RLS policies for transcriptions (owner-only)
CREATE POLICY "Users can view own transcriptions"
ON public.transcriptions FOR SELECT
USING (auth.uid() = user_id);
CREATE POLICY "Users can insert own transcriptions"
ON public.transcriptions FOR INSERT
WITH CHECK (auth.uid() = user_id);
CREATE POLICY "Users can update own transcriptions"
ON public.transcriptions FOR UPDATE
USING (auth.uid() = user_id)
WITH CHECK (auth.uid() = user_id);
CREATE POLICY "Users can delete own transcriptions"
ON public.transcriptions FOR DELETE
USING (auth.uid() = user_id);
-- 7. Auto-update updated_at on profiles
CREATE OR REPLACE FUNCTION public.handle_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = now();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER set_profiles_updated_at
BEFORE UPDATE ON public.profiles
FOR EACH ROW
EXECUTE FUNCTION public.handle_updated_at();
-- 8. Auto-create profile on user signup
CREATE OR REPLACE FUNCTION public.handle_new_user()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO public.profiles (id, email, full_name)
VALUES (
NEW.id,
NEW.email,
COALESCE(NEW.raw_user_meta_data->>'full_name', NEW.raw_user_meta_data->>'name', '')
);
RETURN NEW;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
CREATE TRIGGER on_auth_user_created
AFTER INSERT ON auth.users
FOR EACH ROW
EXECUTE FUNCTION public.handle_new_user();
-- 9. Enforce max 5 transcriptions per user
CREATE OR REPLACE FUNCTION public.enforce_transcription_limit()
RETURNS TRIGGER AS $$
DECLARE
current_count integer;
BEGIN
SELECT COUNT(*) INTO current_count
FROM public.transcriptions
WHERE user_id = NEW.user_id;
IF current_count >= 5 THEN
RAISE EXCEPTION 'Transcription limit reached: max 5 per user';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER enforce_transcription_limit
BEFORE INSERT ON public.transcriptions
FOR EACH ROW
EXECUTE FUNCTION public.enforce_transcription_limit();