46 lines
1.2 KiB
PL/PgSQL
46 lines
1.2 KiB
PL/PgSQL
ALTER TABLE public.perfis ADD COLUMN IF NOT EXISTS nome text;
|
|
|
|
UPDATE public.perfis SET nome = split_part(email, '@', 1) WHERE nome IS NULL;
|
|
|
|
ALTER TABLE public.perfis ALTER COLUMN nome SET NOT NULL;
|
|
|
|
CREATE UNIQUE INDEX IF NOT EXISTS perfis_nome_unico ON public.perfis (lower(nome));
|
|
|
|
CREATE OR REPLACE FUNCTION public.registrar_perfil()
|
|
RETURNS perfis
|
|
LANGUAGE plpgsql
|
|
SECURITY DEFINER
|
|
SET search_path TO 'public'
|
|
AS $function$
|
|
DECLARE
|
|
v_uid uuid := auth.uid();
|
|
v_email text;
|
|
v_nome text;
|
|
v_primeiro boolean;
|
|
v_perfil public.perfis;
|
|
BEGIN
|
|
IF v_uid IS NULL THEN
|
|
RAISE EXCEPTION 'Nao autenticado';
|
|
END IF;
|
|
|
|
SELECT * INTO v_perfil FROM public.perfis WHERE id = v_uid;
|
|
IF FOUND THEN
|
|
RETURN v_perfil;
|
|
END IF;
|
|
|
|
SELECT email INTO v_email FROM auth.users WHERE id = v_uid;
|
|
v_nome := split_part(coalesce(v_email, ''), '@', 1);
|
|
SELECT NOT EXISTS (SELECT 1 FROM public.perfis) INTO v_primeiro;
|
|
|
|
INSERT INTO public.perfis (id, email, nome, aprovado)
|
|
VALUES (v_uid, coalesce(v_email, ''), v_nome, v_primeiro)
|
|
RETURNING * INTO v_perfil;
|
|
|
|
IF v_primeiro THEN
|
|
INSERT INTO public.papeis_usuario (user_id, role) VALUES (v_uid, 'admin')
|
|
ON CONFLICT DO NOTHING;
|
|
END IF;
|
|
|
|
RETURN v_perfil;
|
|
END;
|
|
$function$; |