db/1bf3d29_to_c83a4ce.sql
2023-07-17 14:21:40 -04:00

94 lines
2.1 KiB
PL/PgSQL

set check_function_bodies = off;
CREATE OR REPLACE FUNCTION public.grp_admins()
RETURNS grp
LANGUAGE sql
STABLE
AS $function$select * from public.grp where tag = public.grp_tag_of_string('admins')$function$
;
CREATE OR REPLACE FUNCTION public.usr_root()
RETURNS usr
LANGUAGE sql
STABLE
AS $function$select * from public.usr where tag = public.usr_tag_of_string('root')$function$
;
CREATE OR REPLACE FUNCTION public.do_insert_usr_perm()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
declare
admins int;
begin
admins := public.grp_admins();
insert into public.perm
(path, owner_user, owner_group, owner_user_mode, owner_group_mode, everyone_mode)
values
('/users/' || NEW.id || '/tag', NEW.id, admins, 'w', 'w', 'r')
, ('/users/' || NEW.id || '/email', NEW.id, admins, 'w', 'w', '-')
, ('/users/' || NEW.id || '/deleted', NEW.id, admins, 'w', 'w', '-')
, ('/users/' || NEW.id || '/password', NEW.id, admins, 'w', 'w', '-')
;
return new;
end;
$function$
;
CREATE OR REPLACE FUNCTION public.do_usr_create_default_grp()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
declare
new_grp int;
begin
insert into public.grp (tag)
values (grp_tag_of_string('usr_' || new.uid))
returning id into new_grp;
perform public.grp_add_member(to_grp => new_grp, add_usr => new.id);
update public.perm
set owner_user = public.usr_root()
, owner_group = public.grp_admins()
where path = '/groups/' || new_grp || '/members'
or path = '/groups/' || new_grp || '/tag';
return null;
end;
$function$
;
CREATE OR REPLACE FUNCTION public.get_acting_usr()
RETURNS usr
LANGUAGE plpgsql
AS $function$
declare
uid text;
acting_usr public.usr;
begin
if nullif(current_setting('dnim.usr_uid', true), '') is null then
acting_usr := public.usr_root();
else
select u.*
from public.usr u
where u.uid = current_setting('dnim.usr_uid', true) :: uuid
into acting_usr;
end if;
return acting_usr;
end;
$function$
;
CREATE OR REPLACE FUNCTION public.grp_members_admins()
RETURNS SETOF usr
LANGUAGE sql
STABLE
AS $function$select * from public.grp_members((public.grp_admins()).id)$function$
;