Some checks failed
Deploy to Cloudflare Workers / deploy (push) Has been cancelled
54 lines
1.6 KiB
PL/PgSQL
54 lines
1.6 KiB
PL/PgSQL
-- Fix auth signup 500 ("Database error saving new user") from profile trigger failures
|
|
|
|
DO $$ BEGIN
|
|
CREATE TYPE portal_role AS ENUM ('league_master', 'manager');
|
|
EXCEPTION
|
|
WHEN duplicate_object THEN NULL;
|
|
END $$;
|
|
|
|
ALTER TABLE public.profiles
|
|
ADD COLUMN IF NOT EXISTS portal_role portal_role NOT NULL DEFAULT 'manager';
|
|
|
|
CREATE OR REPLACE FUNCTION public.handle_new_user()
|
|
RETURNS TRIGGER
|
|
LANGUAGE plpgsql
|
|
SECURITY DEFINER
|
|
SET search_path = public
|
|
AS $$
|
|
DECLARE
|
|
v_role portal_role := 'manager';
|
|
v_name TEXT;
|
|
BEGIN
|
|
v_name := COALESCE(
|
|
NULLIF(trim(NEW.raw_user_meta_data->>'display_name'), ''),
|
|
split_part(COALESCE(NEW.email, 'user'), '@', 1)
|
|
);
|
|
|
|
IF NEW.raw_user_meta_data IS NOT NULL
|
|
AND (NEW.raw_user_meta_data->>'portal_role') IN ('league_master', 'manager') THEN
|
|
v_role := (NEW.raw_user_meta_data->>'portal_role')::portal_role;
|
|
END IF;
|
|
|
|
INSERT INTO public.profiles (id, display_name, portal_role)
|
|
VALUES (NEW.id, v_name, v_role)
|
|
ON CONFLICT (id) DO UPDATE SET
|
|
display_name = COALESCE(EXCLUDED.display_name, profiles.display_name),
|
|
portal_role = COALESCE(EXCLUDED.portal_role, profiles.portal_role);
|
|
|
|
RETURN NEW;
|
|
EXCEPTION
|
|
WHEN undefined_column THEN
|
|
-- DB missing portal_role — minimal profile so signup still succeeds
|
|
INSERT INTO public.profiles (id, display_name)
|
|
VALUES (NEW.id, v_name)
|
|
ON CONFLICT (id) DO UPDATE SET
|
|
display_name = COALESCE(EXCLUDED.display_name, profiles.display_name);
|
|
RETURN NEW;
|
|
WHEN OTHERS THEN
|
|
RAISE WARNING 'handle_new_user failed for user %: %', NEW.id, SQLERRM;
|
|
RETURN NEW;
|
|
END;
|
|
$$;
|
|
|
|
GRANT EXECUTE ON FUNCTION public.handle_new_user() TO postgres, service_role;
|