From a3b44588a96c66e26feedfe77438979e87d572af Mon Sep 17 00:00:00 2001 From: Fabrice Lecomte Date: Tue, 25 Aug 2020 15:30:36 +0200 Subject: [PATCH] Can filter workgroup by members #58 add filterNotNull to toUUID() function --- src/main/kotlin/repository/Workgroup.kt | 3 ++- src/main/kotlin/routes/Workgroup.kt | 7 +++++-- src/main/kotlin/utils/Uuid.kt | 3 ++- .../resources/sql/functions/workgroup/find_workgroups.sql | 4 ++++ src/test/sql/workgroup.sql | 5 +++++ 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/repository/Workgroup.kt b/src/main/kotlin/repository/Workgroup.kt index 0133e3c..815dc2e 100644 --- a/src/main/kotlin/repository/Workgroup.kt +++ b/src/main/kotlin/repository/Workgroup.kt @@ -88,6 +88,7 @@ class Workgroup(override var requester: Requester) : RepositoryI { } class Filter( - val createdById: String? = null + val createdById: String? = null, + val members: List? = null ) : Parameter } diff --git a/src/main/kotlin/routes/Workgroup.kt b/src/main/kotlin/routes/Workgroup.kt index fe37171..b198d88 100644 --- a/src/main/kotlin/routes/Workgroup.kt +++ b/src/main/kotlin/routes/Workgroup.kt @@ -9,6 +9,7 @@ import fr.dcproject.repository.Workgroup.Filter import fr.dcproject.security.voter.WorkgroupVoter.Action.CREATE import fr.dcproject.security.voter.WorkgroupVoter.Action.UPDATE import fr.dcproject.security.voter.WorkgroupVoter.Action.VIEW +import fr.dcproject.utils.toUUID import fr.ktorVoter.assertCan import fr.postgresjson.repository.RepositoryI import io.ktor.application.ApplicationCall @@ -34,10 +35,12 @@ object WorkgroupsPaths { val sort: String? = null, val direction: RepositoryI.Direction? = null, val search: String? = null, - val createdBy: String? = null + val createdBy: String? = null, + members: List? = null ) { val page: Int = if (page < 1) 1 else page val limit: Int = if (limit > 50) 50 else if (limit < 1) 1 else limit + val members: List? = members?.toUUID() } @Location("/workgroups/{workgroup}") @@ -111,7 +114,7 @@ object WorkgroupsMembersPaths { fun Route.workgroup(repo: WorkgroupRepository) { get { val workgroups = - repo.find(it.page, it.limit, it.sort, it.direction, it.search, Filter(createdById = it.createdBy)) + repo.find(it.page, it.limit, it.sort, it.direction, it.search, Filter(createdById = it.createdBy, members = it.members)) assertCan(VIEW, workgroups.result) call.respond(workgroups) } diff --git a/src/main/kotlin/utils/Uuid.kt b/src/main/kotlin/utils/Uuid.kt index 984538e..2824ed1 100644 --- a/src/main/kotlin/utils/Uuid.kt +++ b/src/main/kotlin/utils/Uuid.kt @@ -4,7 +4,8 @@ import java.util.* fun String.toUUID(): UUID = UUID.fromString(this.trim()) -fun List.toUUID(): List = this +fun List.toUUID(): List = this + .filterNotNull() .map { it.trim() } .filter { it.isNotBlank() } .map { UUID.fromString(it) } \ No newline at end of file diff --git a/src/main/resources/sql/functions/workgroup/find_workgroups.sql b/src/main/resources/sql/functions/workgroup/find_workgroups.sql index 432b2c6..8a1d86b 100644 --- a/src/main/resources/sql/functions/workgroup/find_workgroups.sql +++ b/src/main/resources/sql/functions/workgroup/find_workgroups.sql @@ -13,9 +13,11 @@ begin select json_agg(t), ( select count(id) from workgroup w + left join citizen_in_workgroup ciw on w.id = ciw.workgroup_id where deleted_at is null and (_search is null or _search = '' or w ==> dsl.multi_match('{name^3, description}', _search)) and (_filter->>'created_by_id' is null or w.created_by_id = (_filter->>'created_by_id')::uuid) + and (_filter->>'members' is null or to_jsonb(array[ciw.citizen_id]) <@ (_filter->'members')::jsonb) ) into resource, total from ( @@ -24,6 +26,7 @@ begin find_citizen_by_id_with_user(w.created_by_id) as created_by, zdb.score(w.ctid) _score from workgroup as w + left join citizen_in_workgroup ciw on w.id = ciw.workgroup_id where deleted_at is null and ( _search is null @@ -31,6 +34,7 @@ begin or w ==> dsl.multi_match('{name^3, description}', _search) ) and (_filter->>'created_by_id' is null or w.created_by_id = (_filter->>'created_by_id')::uuid) + and (_filter->>'members' is null or to_jsonb(array[ciw.citizen_id]) <@ (_filter->'members')::jsonb) order by _score desc, diff --git a/src/test/sql/workgroup.sql b/src/test/sql/workgroup.sql index e2c87ad..de7065e 100644 --- a/src/test/sql/workgroup.sql +++ b/src/test/sql/workgroup.sql @@ -15,6 +15,7 @@ declare "anonymous": false }'; selected_workgroup json; +-- selected_workgroups json; members json; selected_citizen json; begin @@ -59,6 +60,10 @@ begin )), 'Members must contain citizen3'; +-- select resource into selected_workgroups +-- from find_workgroups(_filter := json_build_object('members', json_build_array(_citizen_id2))); +-- assert (select selected_workgroups#>>'{0,id}' = (created_workgroup->>'id')); + -- Check if "find_citizen_by_id" retrun citizen assert (select find_citizen_by_id(_citizen_id2)#>>'{id}')::uuid = _citizen_id2, 'find_citizen_by_id must return citizen';