diff --git a/sql/34_modify_firstname_from_email.sql b/sql/34_modify_firstname_from_email.sql new file mode 100644 index 0000000..8cc27c8 --- /dev/null +++ b/sql/34_modify_firstname_from_email.sql @@ -0,0 +1,56 @@ +-- Modify the handle_new_user trigger to extract first_name from email if not provided +CREATE OR REPLACE FUNCTION + public.handle_new_user() + RETURNS TRIGGER AS + $$ + DECLARE + name TEXT; + first_name TEXT; + last_name TEXT; + is_temp BOOLEAN; + email_prefix TEXT; + BEGIN + -- Extract first_name and last_name from metadata + first_name = new.raw_user_meta_data ->> 'first_name'; + last_name = new.raw_user_meta_data ->> 'last_name'; + + -- If first_name is not provided, extract it from email (part before @) + IF first_name IS NULL OR first_name = '' THEN + email_prefix = SPLIT_PART(new.email, '@', 1); + first_name = email_prefix; + END IF; + + -- Determine the full name + IF new.raw_user_meta_data ->> 'name' IS NOT NULL + THEN + name = new.raw_user_meta_data ->> 'name'; + -- If name is provided but not first/last, try to split it + IF first_name IS NULL AND last_name IS NULL AND name IS NOT NULL THEN + first_name = SPLIT_PART(name, ' ', 1); + IF ARRAY_LENGTH(STRING_TO_ARRAY(name, ' '), 1) > 1 THEN + last_name = SUBSTRING(name FROM LENGTH(SPLIT_PART(name, ' ', 1)) + 2); + END IF; + END IF; + ELSE + name = CONCAT(first_name, ' ', last_name); + END IF; + + -- Check if the role is 'invited_user' in app_metadata + IF COALESCE(new.raw_user_meta_data->>'role', '') = 'invited_user' + THEN + is_temp = TRUE; + ELSE + is_temp = FALSE; + END IF; + + INSERT INTO public.profiles (id, name, email, avatar_url, first_name, last_name, is_temporary) + VALUES (new.id, name, new.email, new.raw_user_meta_data ->> 'avatar_url', first_name, last_name, is_temp); + + RETURN new; +END; + $$ LANGUAGE plpgsql SECURITY DEFINER; + +-- Add comment to document the change +COMMENT ON FUNCTION public.handle_new_user() IS + 'Trigger function that creates a profile when a new user is created. Sets is_temporary=true for users with app_metadata.role=invited_user. Extracts first_name from email prefix (before @) if not provided in metadata.'; +