wip: currently rewriting the project as a full stack application
tangled.org/kacaii.dev/sigo
gleam
1begin;
2
3-- DROP ------------------------------------------------------------------------
4drop function if exists public.query_crew_members;
5drop function if exists public.assign_brigade_members;
6drop function if exists public.replace_brigade_members;
7drop function if exists public.assign_occurrence_brigades;
8drop function if exists public.replace_occurrence_brigades;
9
10-- CREATE ----------------------------------------------------------------------
11
12-- Returns all users that are in the same brigades as the target user
13create or replace function public.query_crew_members(p_user_id uuid)
14returns table (member_id uuid, brigade_id uuid)
15language plpgsql
16stable
17parallel safe
18as $$
19begin
20 return query
21 select distinct bm.user_id as member_id, bm.brigade_id as brigade_id
22 from public.brigade_membership as bm
23 inner join public.brigade_membership as target_bm
24 on bm.brigade_id = target_bm.brigade_id
25 where target_bm.user_id = p_user_id
26 and bm.user_id <> p_user_id;
27end;
28$$;
29
30-- Assign members to a brigade
31create or replace function public.assign_brigade_members(
32 p_brigade_id uuid,
33 p_members_id uuid []
34)
35returns table (inserted_user_id uuid)
36language plpgsql
37as $$
38begin
39 return query
40 insert into public.brigade_membership as bm
41 (brigade_id, user_id)
42 select
43 p_brigade_id,
44 member_id
45 from unnest(p_members_id) as member_id
46 on conflict (brigade_id, user_id)
47 do nothing
48 returning user_id;
49end;
50$$;
51
52
53-- Replace assigned members from a brigade
54create or replace function public.replace_brigade_members(
55 p_brigade_id uuid,
56 p_members_id uuid []
57)
58returns table (inserted_user_id uuid)
59language plpgsql
60as $$
61begin
62 -- Remove all current members
63 delete from public.brigade_membership as bm
64 where bm.brigade_id = p_brigade_id;
65
66 -- Assign the new ones
67 return query
68 select b.inserted_user_id
69 from public.assign_brigade_members(p_brigade_id, p_members_id) as b;
70end;
71$$;
72
73
74-- Assign brigades to a occurrence
75create or replace function public.assign_occurrence_brigades(
76 p_occurrence_id uuid,
77 p_brigades_id uuid []
78)
79returns table (inserted_brigade_id uuid)
80language plpgsql
81as $$
82begin
83 return query
84 insert into public.occurrence_brigade as oc
85 (occurrence_id, brigade_id)
86 select
87 p_occurrence_id,
88 brigade_id
89 from unnest(p_brigades_id) as brigade_id
90 on conflict (occurrence_id, brigade_id)
91 do nothing
92 returning brigade_id;
93end;
94$$;
95
96
97-- replace assigned brigades from a occurrence
98create or replace function public.replace_occurrence_brigades(
99 p_occurrence_id uuid,
100 p_brigades_id uuid []
101)
102returns table (inserted_brigade_id uuid)
103language plpgsql
104as $$
105begin
106 -- Remove all current assigned brigades
107 delete from public.occurrence_brigade as ob
108 where ob.occurrence_id = p_occurrence_id;
109
110 -- Assign the new ones
111 return query
112 select o.inserted_brigade_id
113 from public.assign_occurrence_brigades(p_occurrence_id, p_brigades_id) as o;
114end;
115$$;
116
117commit;