73 lines
2.3 KiB
PL/PgSQL
73 lines
2.3 KiB
PL/PgSQL
-- Dynamic Credit Initialization Migration
|
|
-- Run this in Supabase SQL Editor
|
|
|
|
-- Updated trigger: Creates profile, subscription, AND credits dynamically
|
|
CREATE OR REPLACE FUNCTION public.handle_new_user()
|
|
RETURNS trigger AS $$
|
|
DECLARE
|
|
starter_plan_id UUID;
|
|
plan_credits INTEGER;
|
|
BEGIN
|
|
-- Create profile
|
|
INSERT INTO public.profiles (id, username, avatar_url)
|
|
VALUES (
|
|
new.id,
|
|
COALESCE(new.raw_user_meta_data->>'username', 'user_' || substr(new.id::text, 1, 8)),
|
|
new.raw_user_meta_data->>'avatar_url'
|
|
)
|
|
ON CONFLICT (id) DO NOTHING;
|
|
|
|
-- Get starter plan ID and credits
|
|
SELECT id, monthly_credits INTO starter_plan_id, plan_credits
|
|
FROM subscription_plans
|
|
WHERE name = 'starter'
|
|
LIMIT 1;
|
|
|
|
-- Create subscription with starter plan
|
|
IF starter_plan_id IS NOT NULL THEN
|
|
INSERT INTO public.user_subscriptions (user_id, plan_id)
|
|
VALUES (new.id, starter_plan_id)
|
|
ON CONFLICT (user_id) DO NOTHING;
|
|
END IF;
|
|
|
|
-- Create user_credits with plan's monthly_credits
|
|
INSERT INTO public.user_credits (user_id, balance, total_purchased, total_used)
|
|
VALUES (new.id, COALESCE(plan_credits, 10), 0, 0)
|
|
ON CONFLICT (user_id) DO NOTHING;
|
|
|
|
RETURN new;
|
|
EXCEPTION WHEN OTHERS THEN
|
|
-- Log but don't fail user creation
|
|
RAISE WARNING 'handle_new_user failed: %', SQLERRM;
|
|
RETURN new;
|
|
END;
|
|
$$ LANGUAGE plpgsql SECURITY DEFINER SET search_path = '';
|
|
|
|
-- RLS Policy for user_subscriptions insert (for client-side fallback)
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM pg_policies
|
|
WHERE schemaname = 'public'
|
|
AND tablename = 'user_subscriptions'
|
|
AND policyname = 'user_subscriptions_insert_self'
|
|
) THEN
|
|
CREATE POLICY "user_subscriptions_insert_self" ON user_subscriptions
|
|
FOR INSERT WITH CHECK ((SELECT auth.uid()) = user_id);
|
|
END IF;
|
|
END $$;
|
|
|
|
-- RLS Policy for user_credits insert (for lazy initialization fallback)
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM pg_policies
|
|
WHERE schemaname = 'public'
|
|
AND tablename = 'user_credits'
|
|
AND policyname = 'user_credits_insert_self'
|
|
) THEN
|
|
CREATE POLICY "user_credits_insert_self" ON user_credits
|
|
FOR INSERT WITH CHECK ((SELECT auth.uid()) = user_id);
|
|
END IF;
|
|
END $$;
|