diff --git a/supabase/migrations/003_fix_profile_creation.sql b/supabase/migrations/003_fix_profile_creation.sql index 2ad9cf37..6f75b529 100644 --- a/supabase/migrations/003_fix_profile_creation.sql +++ b/supabase/migrations/003_fix_profile_creation.sql @@ -1,82 +1,48 @@ -- ======================================== -- Fix Profile Creation Issue -- ======================================== --- Adds INSERT policy and function to handle profile creation +-- Adds INSERT policy and makes username nullable --- Add INSERT policy for profiles -DROP POLICY IF EXISTS "Users can insert their own profile" ON public.profiles; - -CREATE POLICY "Users can insert their own profile" - ON public.profiles FOR INSERT - WITH CHECK (auth.uid() = id); - --- Make username nullable and add default +-- Make username nullable and add default (must be done before policies) ALTER TABLE public.profiles ALTER COLUMN username DROP NOT NULL; ALTER TABLE public.profiles ALTER COLUMN username SET DEFAULT ''; --- Create function to handle profile upsert -CREATE OR REPLACE FUNCTION public.upsert_profile( - p_user_id UUID, - p_username TEXT DEFAULT '', - p_full_name TEXT DEFAULT '', - p_bio TEXT DEFAULT '', - p_phone_number TEXT DEFAULT '', - p_location TEXT DEFAULT '', - p_website TEXT DEFAULT '', - p_language TEXT DEFAULT 'en', - p_theme TEXT DEFAULT 'dark' -) -RETURNS SETOF public.profiles AS $$ -BEGIN - RETURN QUERY - INSERT INTO public.profiles ( - id, - username, - full_name, - bio, - phone_number, - location, - website, - language, - theme, - updated_at - ) - VALUES ( - p_user_id, - p_username, - p_full_name, - p_bio, - p_phone_number, - p_location, - p_website, - p_language, - p_theme, - NOW() - ) - ON CONFLICT (id) - DO UPDATE SET - username = COALESCE(NULLIF(EXCLUDED.username, ''), public.profiles.username), - full_name = EXCLUDED.full_name, - bio = EXCLUDED.bio, - phone_number = EXCLUDED.phone_number, - location = EXCLUDED.location, - website = EXCLUDED.website, - language = EXCLUDED.language, - theme = EXCLUDED.theme, - updated_at = NOW() - RETURNING *; -END; -$$ LANGUAGE plpgsql SECURITY DEFINER; +-- Drop ALL existing policies to start fresh +DROP POLICY IF EXISTS "Users can view their own profile" ON public.profiles; +DROP POLICY IF EXISTS "Users can update their own profile" ON public.profiles; +DROP POLICY IF EXISTS "Public profiles are viewable by everyone" ON public.profiles; +DROP POLICY IF EXISTS "Users can insert their own profile" ON public.profiles; --- Grant execute permission to authenticated users -GRANT EXECUTE ON FUNCTION public.upsert_profile TO authenticated; +-- Recreate policies with proper permissions +-- SELECT: Users can view their own profile +CREATE POLICY "Users can view their own profile" + ON public.profiles FOR SELECT + USING (auth.uid() = id); + +-- INSERT: Users can create their own profile only +CREATE POLICY "Users can insert their own profile" + ON public.profiles FOR INSERT + WITH CHECK (auth.uid() = id); + +-- UPDATE: Users can update their own profile only +CREATE POLICY "Users can update their own profile" + ON public.profiles FOR UPDATE + USING (auth.uid() = id) + WITH CHECK (auth.uid() = id); + +-- PUBLIC SELECT: Allow everyone to view public profile info +CREATE POLICY "Public profiles are viewable by everyone" + ON public.profiles FOR SELECT + USING (true); -- Success message DO $$ BEGIN + RAISE NOTICE '========================================'; RAISE NOTICE 'Profile creation fix applied successfully!'; RAISE NOTICE 'Users can now create and update their profiles.'; + RAISE NOTICE '========================================'; END $$;