diff --git a/.idea/runConfigurations/All_Tests__offline_.xml b/.idea/runConfigurations/All_Tests__offline_.xml
index 064f724..ddd68f7 100644
--- a/.idea/runConfigurations/All_Tests__offline_.xml
+++ b/.idea/runConfigurations/All_Tests__offline_.xml
@@ -3,6 +3,12 @@
+
+
+
+
+
+
diff --git a/.idea/runConfigurations/Test_Workgroup.xml b/.idea/runConfigurations/Test_Workgroup.xml
new file mode 100644
index 0000000..4b2f478
--- /dev/null
+++ b/.idea/runConfigurations/Test_Workgroup.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+ FILE
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/sql/functions/workgroup/add_workgroup_members.sql b/src/main/resources/sql/functions/workgroup/add_workgroup_members.sql
new file mode 100644
index 0000000..152ceb8
--- /dev/null
+++ b/src/main/resources/sql/functions/workgroup/add_workgroup_members.sql
@@ -0,0 +1,17 @@
+create or replace function add_workgroup_members(in _id uuid, inout resource json)
+ language plpgsql as
+$$
+begin
+ insert into citizen_in_workgroup (citizen_id, workgroup_id)
+ select
+ (z->>'id')::uuid,
+ _id::uuid
+ from json_array_elements(resource) z
+ where (z->>'id') is not null
+ on conflict do nothing;
+
+ select find_workgroup_members(_id) into resource;
+end;
+$$;
+
+-- drop procedure if exists update_workgroup_members(in uuid, inout json);
diff --git a/src/main/resources/sql/functions/workgroup/find_workgroup_members.sql b/src/main/resources/sql/functions/workgroup/find_workgroup_members.sql
new file mode 100644
index 0000000..07915ac
--- /dev/null
+++ b/src/main/resources/sql/functions/workgroup/find_workgroup_members.sql
@@ -0,0 +1,16 @@
+create or replace function find_workgroup_members(in _id uuid, out resource json) language plpgsql as
+$$
+begin
+ select json_agg(t) into resource
+ from (
+ select
+ z.*,
+ find_user_by_id(z.user_id) as "user"
+ from citizen_in_workgroup as ciw
+ join citizen z on z.id = ciw.citizen_id
+ where ciw.workgroup_id = _id
+ ) as t;
+end;
+$$;
+
+-- drop function if exists find_workgroup_members(uuid, out json);
diff --git a/src/main/resources/sql/functions/workgroup/remove_workgroup_members.sql b/src/main/resources/sql/functions/workgroup/remove_workgroup_members.sql
new file mode 100644
index 0000000..a0ecd61
--- /dev/null
+++ b/src/main/resources/sql/functions/workgroup/remove_workgroup_members.sql
@@ -0,0 +1,17 @@
+create or replace function remove_workgroup_members(in _id uuid, inout resource json)
+ language plpgsql as
+$$
+begin
+ delete from citizen_in_workgroup
+ where workgroup_id = _id
+ and citizen_id in (
+ select
+ (z->>'id')::uuid
+ from json_array_elements(resource) z
+ );
+
+ select find_workgroup_members(_id) into resource;
+end
+$$;
+
+-- drop procedure if exists remove_workgroup_members(in uuid, inout json);
\ No newline at end of file
diff --git a/src/main/resources/sql/functions/workgroup/update_workgroup_members.sql b/src/main/resources/sql/functions/workgroup/update_workgroup_members.sql
new file mode 100644
index 0000000..6cd439d
--- /dev/null
+++ b/src/main/resources/sql/functions/workgroup/update_workgroup_members.sql
@@ -0,0 +1,26 @@
+create or replace function update_workgroup_members(in _id uuid, inout resource json)
+ language plpgsql as
+$$
+begin
+ insert into citizen_in_workgroup (citizen_id, workgroup_id)
+ select
+ (z->>'id')::uuid,
+ _id::uuid
+ from json_array_elements(resource) z
+ where (z->>'id') is not null
+ on conflict do nothing;
+
+ delete from citizen_in_workgroup
+ where workgroup_id = _id
+ and citizen_id not in(
+ select
+ (z->>'id')::uuid
+ from json_array_elements(resource) z
+ where (z->>'id') is not null
+ );
+
+ select find_workgroup_members(_id) into resource;
+end;
+$$;
+
+-- drop procedure if exists update_workgroup_members(in uuid, inout json);
\ No newline at end of file
diff --git a/src/main/resources/sql/functions/workgroup/upsert_workgroup.sql b/src/main/resources/sql/functions/workgroup/upsert_workgroup.sql
index c2d825f..67c3ff0 100644
--- a/src/main/resources/sql/functions/workgroup/upsert_workgroup.sql
+++ b/src/main/resources/sql/functions/workgroup/upsert_workgroup.sql
@@ -21,6 +21,11 @@ begin
logo = excluded.logo,
owner_id = excluded.owner_id;
+-- insert into citizen_in_workgroup (citizen_id, workgroup_id)
+-- select
+-- (resource->>'id')::uuid,
+-- new_id::uuid
+-- from json_populate_recordset(null::workgroup, resource->'members');
select find_workgroup_by_id(new_id) into resource;
end;
diff --git a/src/test/sql/fixtures/fixture_citizen.sql b/src/test/sql/fixtures/fixture_citizen.sql
index e7e560e..5c400f9 100644
--- a/src/test/sql/fixtures/fixture_citizen.sql
+++ b/src/test/sql/fixtures/fixture_citizen.sql
@@ -3,22 +3,22 @@ create or replace function fixture_citizen(in name text default 'george', out _c
$$
declare
_user_id uuid;
- created_citizen json := '{"name": {"first_name":"George", "last_name":"MICHEL"}, "birthday": "2001-01-01", "email":"george.michel@gmail.com"}';
- created_citizen2 json := '{"name": {"first_name":"john", "last_name":"DOE"}, "birthday": "2001-01-01", "email":"john.doe@gmail.com"}';
+ created_citizen json;
begin
_user_id = fixture_user(name);
if (name = 'george') then
- created_citizen := jsonb_set(created_citizen::jsonb, '{user}'::text[], jsonb_build_object('id', _user_id::text), true)::json;
- assert created_citizen#>>'{user, id}' = _user_id::text, format('userId in citizen must be the same as user, %s = %s', created_citizen#>>'{user, id}', _user_id::text);
-
- select upsert_citizen(created_citizen) into created_citizen;
- _citizen_id := created_citizen->>'id';
+ created_citizen = '{"name": {"first_name":"George", "last_name":"MICHEL"}, "birthday": "2001-01-01", "email":"george.michel@gmail.com"}';
elseif (name = 'john') then
- created_citizen2 := jsonb_set(created_citizen2::jsonb, '{user}'::text[], jsonb_build_object('id', _user_id::text), true)::json;
- assert created_citizen2#>>'{user, id}' = _user_id::text, format('userId in citizen must be the same as user, %s = %s', created_citizen2#>>'{user, id}', _user_id::text);
-
- select upsert_citizen(created_citizen2) into created_citizen2;
- _citizen_id := created_citizen2->>'id';
+ created_citizen = '{"name": {"first_name":"john", "last_name":"DOE"}, "birthday": "2001-01-01", "email":"john.doe@gmail.com"}';
+ elseif (name = 'tesla') then
+ created_citizen = '{"name": {"first_name":"Nicolas", "last_name":"Tesla"}, "birthday": "2001-01-01", "email":"nicolas.tesla@gmail.com"}';
end if;
+
+
+ created_citizen := jsonb_set(created_citizen::jsonb, '{user}'::text[], jsonb_build_object('id', _user_id::text), true)::json;
+ assert created_citizen#>>'{user, id}' = _user_id::text, format('userId in citizen must be the same as user, %s = %s', created_citizen#>>'{user, id}', _user_id::text);
+
+ select upsert_citizen(created_citizen) into created_citizen;
+ _citizen_id := created_citizen->>'id';
end
$$
\ No newline at end of file
diff --git a/src/test/sql/fixtures/fixture_user.sql b/src/test/sql/fixtures/fixture_user.sql
index 2d364c5..8c0aa3f 100644
--- a/src/test/sql/fixtures/fixture_user.sql
+++ b/src/test/sql/fixtures/fixture_user.sql
@@ -2,15 +2,17 @@ create or replace function fixture_user(in name text default 'george', out user_
language plpgsql as
$$
declare
- created_user1 json := '{"username": "george", "plain_password": "azerty", "roles": ["ROLE_USER"]}';
- created_user2 json := '{"username": "john", "plain_password": "qwerty", "roles": ["ROLE_USER"]}';
+ created_user json;
begin
if (name = 'george') then
- select insert_user(created_user1) into created_user1;
- user_id := created_user1->>'id';
+ created_user = '{"username": "george", "plain_password": "azerty", "roles": ["ROLE_USER"]}';
elseif (name = 'john') then
- select insert_user(created_user2) into created_user2;
- user_id := created_user2->>'id';
+ created_user = '{"username": "john", "plain_password": "qwerty", "roles": ["ROLE_USER"]}';
+ elseif (name = 'tesla') then
+ created_user = '{"username": "tesla", "plain_password": "azerty", "roles": ["ROLE_USER"]}';
end if;
+
+ select insert_user(created_user) into created_user;
+ user_id := created_user->>'id';
end
$$
\ No newline at end of file
diff --git a/src/test/sql/workgroup.sql b/src/test/sql/workgroup.sql
index 4afe90d..7895c66 100644
--- a/src/test/sql/workgroup.sql
+++ b/src/test/sql/workgroup.sql
@@ -1,7 +1,9 @@
do
$$
declare
- _citizen_id uuid := fixture_citizen();
+ _citizen_id uuid := fixture_citizen('george');
+ _citizen_id2 uuid := fixture_citizen('john');
+ _citizen_id3 uuid := fixture_citizen('tesla');
created_workgroup json := '{
"name": "Le groupe des vert",
"description": "test",
@@ -13,7 +15,7 @@ declare
"anonymous": false
}';
selected_workgroup json;
- selected_workgroup_2 json;
+ members json;
begin
created_workgroup := jsonb_set(created_workgroup::jsonb, '{created_by}'::text[], jsonb_build_object('id', _citizen_id::text), true)::json;
created_workgroup := jsonb_set(created_workgroup::jsonb, '{owner}'::text[], jsonb_build_object('id', _citizen_id::text), true)::json;
@@ -38,7 +40,47 @@ begin
select (w.resource->0) into selected_workgroup from find_workgroups('Le groupe des vert', "limit" := 1) w;
assert (selected_workgroup->>'name') = 'Le groupe des vert', format('name must be "Le groupe des vert" instead of : %s', (selected_workgroup->>'name'));
+ -------------
+ -- members --
+ -------------
+
+
+ -- add
+ select m into members from add_workgroup_members((created_workgroup->>'id')::uuid, json_build_array(
+ json_build_object('id', _citizen_id2),
+ json_build_object('id', _citizen_id3)
+ )) m;
+
+ assert json_array_length(members) = 2, 'The members count must be equal to 2';
+ assert members::jsonb @> jsonb_build_array(jsonb_build_object('id', _citizen_id3)),
+ 'Members must contain citizen3';
+
+ -- update
+ select m into members from update_workgroup_members((created_workgroup->>'id')::uuid, json_build_array(
+ json_build_object('id', _citizen_id2),
+ json_build_object('id', _citizen_id)
+ )) m;
+ assert json_array_length(members) = 2, 'The members count must be equal to 2';
+ assert members::jsonb @> jsonb_build_array(jsonb_build_object('id', _citizen_id)),
+ 'Members must contain citizen2';
+ assert not members::jsonb @> jsonb_build_array(jsonb_build_object('id', _citizen_id3)),
+ 'Members must NOT contain citizen3';
+
+ -- remove
+ select m into members from remove_workgroup_members((created_workgroup->>'id')::uuid, json_build_array(
+ json_build_object('id', _citizen_id2)
+ )) m;
+ assert json_array_length(members) = 1, 'The members count must be equal to 1';
+ assert members::jsonb @> jsonb_build_array(jsonb_build_object('id', _citizen_id)),
+ 'Members must contain citizen1';
+ assert not members::jsonb @> jsonb_build_array(jsonb_build_object('id', _citizen_id2)),
+ 'Members must NOT contain citizen2';
+
rollback;
raise notice 'workgroup test pass';
end
$$;
+
+
+
+-- select w->>'id' from json_array_elements('[{"id":"plop"}]') w
\ No newline at end of file