Skip to content

Commit b354047

Browse files
authored
Merge pull request #39 from recogito/develop
Merge to main
2 parents cff4aa9 + 794e8cf commit b354047

21 files changed

+1865
-33
lines changed

SQL Scripts/functions/archive_document_rpc.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ BEGIN
1717
-- If the user is the creator or an Org Admin, archive the document
1818
IF _row.created_by = auth.uid() OR is_admin_organization(auth.uid())
1919
THEN
20-
IF NOT EXISTS(SELECT 1 FROM public.project_documents pd WHERE pd.id = _document_id AND pd.is_archived IS FALSE )
20+
IF NOT EXISTS(SELECT 1 FROM public.project_documents pd WHERE pd.document_id = _document_id AND pd.is_archived IS FALSE )
2121
THEN
2222
UPDATE public.documents d
2323
SET is_archived = TRUE

SQL Scripts/functions/create_default_layer_groups.sql

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,17 @@ DECLARE
77
_description varchar;
88
_is_admin bool;
99
_is_default bool;
10+
_is_read_only bool;
1011
BEGIN
11-
FOR _role_id, _name, _description, _is_admin, _is_default IN SELECT role_id, name, description, is_admin, is_default
12-
FROM public.default_groups
13-
WHERE group_type = 'layer'
12+
FOR _role_id, _name, _description, _is_admin, _is_default, _is_read_only
13+
IN SELECT role_id, name, description, is_admin, is_default, is_read_only
14+
FROM public.default_groups
15+
WHERE group_type = 'layer'
1416
LOOP
1517
_layer_group_id = extensions.uuid_generate_v4();
1618
INSERT INTO public.layer_groups
17-
(id, layer_id, role_id, name, description, is_admin, is_default)
18-
VALUES (_layer_group_id, NEW.id, _role_id, _name, _description, _is_admin, _is_default);
19+
(id, layer_id, role_id, name, description, is_admin, is_default, is_read_only)
20+
VALUES (_layer_group_id, NEW.id, _role_id, _name, _description, _is_admin, _is_default, _is_read_only);
1921

2022
IF _is_admin IS TRUE AND NEW.created_by IS NOT NULL THEN
2123
INSERT INTO public.group_users (group_type, type_id, user_id)

SQL Scripts/functions/create_default_project_groups.sql

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,17 @@ DECLARE
77
_description varchar;
88
_is_admin bool;
99
_is_default bool;
10+
_is_read_only bool;
1011
BEGIN
11-
FOR _role_id, _name, _description, _is_admin, _is_default IN SELECT role_id, name, description, is_admin, is_default
12-
FROM public.default_groups
13-
WHERE group_type = 'project'
12+
FOR _role_id, _name, _description, _is_admin, _is_default, _is_read_only
13+
IN SELECT role_id, name, description, is_admin, is_default, is_read_only
14+
FROM public.default_groups
15+
WHERE group_type = 'project'
1416
LOOP
1517
_project_group_id = extensions.uuid_generate_v4();
1618
INSERT INTO public.project_groups
17-
(id, project_id, role_id, name, description, is_admin, is_default)
18-
VALUES (_project_group_id, NEW.id, _role_id, _name, _description, _is_admin, _is_default);
19+
(id, project_id, role_id, name, description, is_admin, is_default, is_read_only)
20+
VALUES (_project_group_id, NEW.id, _role_id, _name, _description, _is_admin, _is_default, _is_read_only);
1921

2022
IF _is_admin IS TRUE AND NEW.created_by IS NOT NULL THEN
2123
INSERT INTO public.group_users (group_type, type_id, user_id)
Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
CREATE
2-
OR REPLACE FUNCTION create_project_rpc (
2+
OR REPLACE FUNCTION create_project_rpc (
33
_name VARCHAR,
44
_description VARCHAR,
55
_is_open_join BOOLEAN,
6-
_is_open_edit BOOLEAN
6+
_is_open_edit BOOLEAN,
7+
_document_view_right DOCUMENT_VIEW_TYPE
78
) RETURNS SETOF public.projects AS $body$
89
DECLARE
910
_project_id uuid := gen_random_uuid(); -- The id of the new project
@@ -12,16 +13,16 @@ DECLARE
1213
BEGIN
1314
IF NOT check_action_policy_organization(auth.uid(), 'projects', 'INSERT') THEN
1415
RETURN;
15-
END IF;
16+
END IF;
1617

17-
INSERT INTO public.projects (id, created_by, created_at, name, description, is_open_join, is_open_edit) VALUES (_project_id, auth.uid(), NOW(), _name, _description, _is_open_join, _is_open_edit);
18+
INSERT INTO public.projects (id, created_by, created_at, name, description, is_open_join, is_open_edit, document_view_right) VALUES (_project_id, auth.uid(), NOW(), _name, _description, _is_open_join, _is_open_edit, _document_view_right);
1819

1920
INSERT INTO public.contexts (id, created_by, created_at, project_id, is_project_default) VALUES (_context_id, auth.uid(), NOW(), _project_id, TRUE);
2021

2122
SELECT (id) INTO _default_context_definition_id FROM public.tag_definitions t WHERE t.scope = 'system' AND t.name = 'DEFAULT_CONTEXT';
2223

23-
INSERT INTO public.tags (created_by, created_at, tag_definition_id, target_id) VALUES (auth.uid(), NOW(), _default_context_definition_id, _context_id);
24-
24+
INSERT INTO public.tags (created_by, created_at, tag_definition_id, target_id) VALUES (auth.uid(), NOW(), _default_context_definition_id, _context_id);
25+
2526
RETURN QUERY SELECT * FROM public.projects WHERE id = _project_id;
2627
END
2728
$body$ LANGUAGE plpgsql SECURITY DEFINER;
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
CREATE
2+
OR REPLACE FUNCTION lock_project_rpc (
3+
_project_id uuid
4+
) RETURNS BOOLEAN
5+
AS $body$
6+
DECLARE
7+
_project_read_only_group_id uuid;
8+
_project_group_ids uuid[];
9+
_project_admin_ids uuid[];
10+
_project_group_id uuid;
11+
_row_group_users public.group_users % rowtype;
12+
_read_only_layer_role uuid;
13+
_context_ids uuid[];
14+
_context_id uuid;
15+
_user_id uuid;
16+
BEGIN
17+
-- Must have Update privs on project
18+
IF NOT (check_action_policy_organization(auth.uid(), 'projects', 'UPDATE')
19+
OR check_action_policy_project(auth.uid(), 'projects', 'UPDATE', _project_id))
20+
THEN
21+
RETURN FALSE;
22+
END IF;
23+
24+
-- Select the read only project default group
25+
SELECT pg.id INTO _project_read_only_group_id
26+
FROM public.project_groups pg
27+
WHERE pg.project_id = _project_id
28+
AND pg.is_read_only IS TRUE;
29+
30+
-- Create an array of project_group ids
31+
_project_group_ids := ARRAY(
32+
SELECT pg.id
33+
FROM public.project_groups pg
34+
WHERE pg.project_id = _project_id
35+
AND pg.is_read_only IS NOT TRUE
36+
);
37+
38+
-- Create an array of user ids
39+
_project_admin_ids := ARRAY(
40+
SELECT gu.user_id
41+
FROM public.group_users gu
42+
WHERE gu.type_id = ANY(_project_group_ids)
43+
);
44+
45+
-- For each project group user, set them to read-only
46+
FOREACH _project_group_id IN ARRAY _project_group_ids
47+
LOOP
48+
UPDATE public.group_users
49+
SET type_id = _project_read_only_group_id
50+
WHERE type_id = _project_group_id
51+
AND group_type = 'project';
52+
END LOOP;
53+
54+
-- If we do not have a read-only layer default group then fail
55+
IF NOT EXISTS(SELECT 1 FROM public.default_groups dgx WHERE dgx.group_type = 'layer' AND dgx.is_read_only IS TRUE)
56+
THEN
57+
ROLLBACK;
58+
RETURN FALSE;
59+
END IF;
60+
61+
-- Get the read only role from default groups
62+
SELECT dgx.role_id INTO _read_only_layer_role FROM public.default_groups dgx WHERE dgx.group_type = 'layer' AND dgx.is_read_only IS TRUE;
63+
64+
-- Get an array of context ids for this project
65+
_context_ids := ARRAY(
66+
SELECT c.id
67+
FROM public.contexts c
68+
WHERE c.project_id = _project_id
69+
);
70+
71+
-- Set all context users to read-only
72+
FOREACH _context_id IN ARRAY _context_ids
73+
LOOP
74+
UPDATE public.context_users
75+
SET role_id = _read_only_layer_role
76+
WHERE _context_id = _context_id;
77+
END LOOP;
78+
79+
-- Add the admins to each context as read-only
80+
FOREACH _context_id IN ARRAY _context_ids
81+
LOOP
82+
FOREACH _user_id IN ARRAY _project_admin_ids
83+
LOOP
84+
INSERT INTO public.context_users
85+
(role_id, user_id, context_id)
86+
VALUES (_read_only_layer_role, _user_id, _context_id)
87+
ON CONFLICT(user_id, context_id)
88+
DO NOTHING;
89+
END LOOP;
90+
END LOOP;
91+
92+
-- Set the admins to the read only project group
93+
94+
-- Update the project
95+
UPDATE public.projects
96+
SET is_locked = TRUE
97+
WHERE id = _project_id;
98+
99+
-- Success
100+
RETURN TRUE;
101+
102+
END
103+
$body$ LANGUAGE plpgsql SECURITY DEFINER;

SQL Scripts/tables/default_groups.sql

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ CREATE TABLE public.default_groups
1313
description varchar NOT NULL,
1414
role_id uuid REFERENCES public.roles NOT NULL,
1515
is_admin bool DEFAULT FALSE,
16-
is_default bool DEFAULT FALSE
16+
is_default bool DEFAULT FALSE,
17+
is_read_only bool DEFAULT FALSE
1718
);
1819

1920
-- Changes 6/6/23 --
@@ -25,3 +26,7 @@ ALTER TABLE public.default_groups
2526
-- Changes 7/26/23 --
2627
ALTER TABLE public.default_groups
2728
ADD COLUMN is_archived bool DEFAULT FALSE;
29+
30+
-- Changes 9/20/24 --
31+
ALTER TABLE public.default_groups
32+
ADD COLUMN is_read_only bool DEFAULT FALSE;

SQL Scripts/tables/layer_groups.sql

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ CREATE TABLE PUBLIC.LAYER_GROUPS (
1010
DESCRIPTION VARCHAR,
1111
ROLE_ID UUID REFERENCES PUBLIC.ROLES NOT NULL,
1212
IS_ADMIN BOOL DEFAULT FALSE,
13-
IS_DEFAULT BOOLEAN DEFAULT FALSE
13+
IS_DEFAULT BOOLEAN DEFAULT FALSE,
14+
IS_READ_ONLY BOOLEAN DEFAULT FALSE
1415
);
1516

1617
-- Changes 05/01/23 ---
@@ -67,3 +68,8 @@ ADD COLUMN IS_ADMIN BOOL DEFAULT FALSE;
6768
-- Changes 11/30/23 --
6869
ALTER TABLE PUBLIC.LAYER_GROUPS
6970
ADD COLUMN IS_DEFAULT BOOLEAN DEFAULT FALSE;
71+
72+
-- Changes 9/20/24 --
73+
ALTER TABLE PUBLIC.LAYER_GROUPS
74+
ADD COLUMN is_read_only BOOLEAN DEFAULT FALSE;
75+

SQL Scripts/tables/organization_groups.sql

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ CREATE TABLE public .organization_groups (
99
description VARCHAR,
1010
role_id UUID REFERENCES public .roles UNIQUE NOT NULL,
1111
is_admin BOOLEAN DEFAULT FALSE,
12-
is_default BOOLEAN DEFAULT FALSE
12+
is_default BOOLEAN DEFAULT FALSE,
13+
is_read_only BOOLEAN DEFAULT FALSE
1314
);
1415
-- Changes 05/08/23
1516
ALTER TABLE public .organization_groups
@@ -39,4 +40,8 @@ ALTER TABLE public .organization_groups
3940
ADD COLUMN is_admin bool DEFAULT FALSE;
4041
-- Changes 11/27/23 --
4142
ALTER TABLE public .organization_groups
42-
ADD COLUMN is_default bool DEFAULT FALSE;
43+
ADD COLUMN is_default bool DEFAULT FALSE;
44+
45+
-- Changes 9/23/24 --
46+
ALTER TABLE public.organization_groups
47+
ADD COLUMN is_read_only bool DEFAULT FALSE;

SQL Scripts/tables/project_groups.sql

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ CREATE TABLE PUBLIC.PROJECT_GROUPS (
1010
DESCRIPTION VARCHAR,
1111
ROLE_ID UUID REFERENCES PUBLIC.ROLES NOT NULL,
1212
IS_ADMIN BOOL DEFAULT FALSE,
13-
IS_DEFAULT BOOLEAN DEFAULT FALSE
13+
IS_DEFAULT BOOLEAN DEFAULT FALSE,
14+
IS_READ_ONLY BOOLEAN DEFAULT FALSE
1415
);
1516

1617
-- Changes 05/08/23
@@ -53,4 +54,8 @@ ADD COLUMN IS_ADMIN BOOL DEFAULT FALSE;
5354

5455
-- Changes 11/30/23 --
5556
ALTER TABLE PUBLIC.PROJECT_GROUPS
56-
ADD COLUMN IS_DEFAULT BOOLEAN DEFAULT FALSE;
57+
ADD COLUMN IS_DEFAULT BOOLEAN DEFAULT FALSE;
58+
59+
-- Changed 9/20/24
60+
ALTER TABLE public.project_groups
61+
ADD COLUMN is_read_only BOOLEAN DEFAULT FALSE;

SQL Scripts/tables/projects.sql

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ CREATE TABLE
99
NAME VARCHAR,
1010
description VARCHAR,
1111
is_open_join BOOLEAN DEFAULT FALSE,
12-
is_open_edit BOOLEAN DEFAULT FALSE
12+
is_open_edit BOOLEAN DEFAULT FALSE,
13+
is_locked BOOLEAN DEFAULT FALSE,
14+
document_view_right DOCUMENT_VIEW_TYPE DEFAULT 'closed'
1315
);
1416

1517
-- Changes 04/21/23 --
@@ -33,4 +35,12 @@ ALTER TABLE public.projects
3335
ADD COLUMN is_open_join BOOLEAN DEFAULT FALSE;
3436

3537
ALTER TABLE public.projects
36-
ADD COLUMN is_open_edit BOOLEAN DEFAULT FALSE;
38+
ADD COLUMN is_open_edit BOOLEAN DEFAULT FALSE;
39+
40+
-- Changes 9/20/24
41+
ALTER TABLE public.projects
42+
ADD COLUMN is_locked BOOLEAN DEFAULT FALSE;
43+
44+
-- Changes 10/18/24
45+
ALTER TABLE public.projects
46+
ADD COLUMN document_view_right DOCUMENT_VIEW_TYPE DEFAULT 'closed';

0 commit comments

Comments
 (0)