| |
| |
|
|
| |
| CREATE EXTENSION IF NOT EXISTS pgcrypto; |
|
|
| |
| 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() |
| ); |
|
|
| |
| 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) |
| ); |
|
|
| |
| ALTER TABLE public.profiles ENABLE ROW LEVEL SECURITY; |
| ALTER TABLE public.transcriptions ENABLE ROW LEVEL SECURITY; |
|
|
| |
| 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); |
|
|
| |
| 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); |
|
|
| |
| 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(); |
|
|
| |
| 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(); |
|
|
| |
| 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(); |
|
|