Can filter workgroup by members #58
add filterNotNull to toUUID() function
This commit is contained in:
@@ -88,6 +88,7 @@ class Workgroup(override var requester: Requester) : RepositoryI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class Filter(
|
class Filter(
|
||||||
val createdById: String? = null
|
val createdById: String? = null,
|
||||||
|
val members: List<UUID>? = null
|
||||||
) : Parameter
|
) : Parameter
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.CREATE
|
||||||
import fr.dcproject.security.voter.WorkgroupVoter.Action.UPDATE
|
import fr.dcproject.security.voter.WorkgroupVoter.Action.UPDATE
|
||||||
import fr.dcproject.security.voter.WorkgroupVoter.Action.VIEW
|
import fr.dcproject.security.voter.WorkgroupVoter.Action.VIEW
|
||||||
|
import fr.dcproject.utils.toUUID
|
||||||
import fr.ktorVoter.assertCan
|
import fr.ktorVoter.assertCan
|
||||||
import fr.postgresjson.repository.RepositoryI
|
import fr.postgresjson.repository.RepositoryI
|
||||||
import io.ktor.application.ApplicationCall
|
import io.ktor.application.ApplicationCall
|
||||||
@@ -34,10 +35,12 @@ object WorkgroupsPaths {
|
|||||||
val sort: String? = null,
|
val sort: String? = null,
|
||||||
val direction: RepositoryI.Direction? = null,
|
val direction: RepositoryI.Direction? = null,
|
||||||
val search: String? = null,
|
val search: String? = null,
|
||||||
val createdBy: String? = null
|
val createdBy: String? = null,
|
||||||
|
members: List<String?>? = null
|
||||||
) {
|
) {
|
||||||
val page: Int = if (page < 1) 1 else page
|
val page: Int = if (page < 1) 1 else page
|
||||||
val limit: Int = if (limit > 50) 50 else if (limit < 1) 1 else limit
|
val limit: Int = if (limit > 50) 50 else if (limit < 1) 1 else limit
|
||||||
|
val members: List<UUID>? = members?.toUUID()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Location("/workgroups/{workgroup}")
|
@Location("/workgroups/{workgroup}")
|
||||||
@@ -111,7 +114,7 @@ object WorkgroupsMembersPaths {
|
|||||||
fun Route.workgroup(repo: WorkgroupRepository) {
|
fun Route.workgroup(repo: WorkgroupRepository) {
|
||||||
get<WorkgroupsPaths.WorkgroupsRequest> {
|
get<WorkgroupsPaths.WorkgroupsRequest> {
|
||||||
val workgroups =
|
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)
|
assertCan(VIEW, workgroups.result)
|
||||||
call.respond(workgroups)
|
call.respond(workgroups)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,8 @@ import java.util.*
|
|||||||
|
|
||||||
fun String.toUUID(): UUID = UUID.fromString(this.trim())
|
fun String.toUUID(): UUID = UUID.fromString(this.trim())
|
||||||
|
|
||||||
fun List<String>.toUUID(): List<UUID> = this
|
fun List<String?>.toUUID(): List<UUID> = this
|
||||||
|
.filterNotNull()
|
||||||
.map { it.trim() }
|
.map { it.trim() }
|
||||||
.filter { it.isNotBlank() }
|
.filter { it.isNotBlank() }
|
||||||
.map { UUID.fromString(it) }
|
.map { UUID.fromString(it) }
|
||||||
@@ -13,9 +13,11 @@ begin
|
|||||||
select json_agg(t), (
|
select json_agg(t), (
|
||||||
select count(id)
|
select count(id)
|
||||||
from workgroup w
|
from workgroup w
|
||||||
|
left join citizen_in_workgroup ciw on w.id = ciw.workgroup_id
|
||||||
where deleted_at is null
|
where deleted_at is null
|
||||||
and (_search is null or _search = '' or w ==> dsl.multi_match('{name^3, description}', _search))
|
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->>'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
|
into resource, total
|
||||||
from (
|
from (
|
||||||
@@ -24,6 +26,7 @@ begin
|
|||||||
find_citizen_by_id_with_user(w.created_by_id) as created_by,
|
find_citizen_by_id_with_user(w.created_by_id) as created_by,
|
||||||
zdb.score(w.ctid) _score
|
zdb.score(w.ctid) _score
|
||||||
from workgroup as w
|
from workgroup as w
|
||||||
|
left join citizen_in_workgroup ciw on w.id = ciw.workgroup_id
|
||||||
where deleted_at is null
|
where deleted_at is null
|
||||||
and (
|
and (
|
||||||
_search is null
|
_search is null
|
||||||
@@ -31,6 +34,7 @@ begin
|
|||||||
or w ==> dsl.multi_match('{name^3, description}', _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->>'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
|
order by
|
||||||
_score desc,
|
_score desc,
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ declare
|
|||||||
"anonymous": false
|
"anonymous": false
|
||||||
}';
|
}';
|
||||||
selected_workgroup json;
|
selected_workgroup json;
|
||||||
|
-- selected_workgroups json;
|
||||||
members json;
|
members json;
|
||||||
selected_citizen json;
|
selected_citizen json;
|
||||||
begin
|
begin
|
||||||
@@ -59,6 +60,10 @@ begin
|
|||||||
)),
|
)),
|
||||||
'Members must contain citizen3';
|
'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
|
-- 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';
|
assert (select find_citizen_by_id(_citizen_id2)#>>'{id}')::uuid = _citizen_id2, 'find_citizen_by_id must return citizen';
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user