Fix upsert_workgroup

This commit is contained in:
2020-06-02 01:01:08 +02:00
parent a6c36c542e
commit 32510652d1
3 changed files with 28 additions and 23 deletions

View File

@@ -6,30 +6,24 @@ import fr.dcproject.entity.WorkgroupSimple
import fr.dcproject.entity.WorkgroupWithMembersI.Member
import fr.dcproject.entity.WorkgroupWithMembersI.Member.Role
import fr.dcproject.repository.Workgroup.Filter
import fr.dcproject.security.voter.WorkgroupVoter.Action.VIEW
import fr.dcproject.security.voter.WorkgroupVoter.Action.CREATE
import fr.dcproject.security.voter.WorkgroupVoter.Action.UPDATE
import fr.dcproject.security.voter.WorkgroupVoter.ActionMembers.ADD as ADD_MEMBERS
import fr.dcproject.security.voter.WorkgroupVoter.ActionMembers.UPDATE as UPDATE_MEMBERS
import fr.dcproject.security.voter.WorkgroupVoter.ActionMembers.REMOVE as REMOVE_MEMBERS
import fr.dcproject.security.voter.WorkgroupVoter.Action.VIEW
import fr.ktorVoter.assertCan
import fr.dcproject.utils.toUUID
import fr.postgresjson.repository.RepositoryI
import io.ktor.application.ApplicationCall
import io.ktor.application.call
import io.ktor.http.HttpStatusCode
import io.ktor.locations.KtorExperimentalLocationsAPI
import io.ktor.locations.Location
import io.ktor.locations.get
import io.ktor.locations.post
import io.ktor.locations.put
import io.ktor.locations.delete
import io.ktor.locations.*
import io.ktor.request.receive
import io.ktor.response.respond
import io.ktor.routing.Route
import java.util.*
import fr.dcproject.entity.Workgroup as WorkgroupEntity
import fr.dcproject.repository.Workgroup as WorkgroupRepository
import fr.dcproject.security.voter.WorkgroupVoter.ActionMembers.ADD as ADD_MEMBERS
import fr.dcproject.security.voter.WorkgroupVoter.ActionMembers.REMOVE as REMOVE_MEMBERS
import fr.dcproject.security.voter.WorkgroupVoter.ActionMembers.UPDATE as UPDATE_MEMBERS
@KtorExperimentalLocationsAPI
object WorkgroupsPaths {
@@ -97,8 +91,7 @@ object WorkgroupsMembersPaths {
@Location("/workgroups/{workgroup}/members")
class WorkgroupsMembersRequest(val workgroup: WorkgroupEntity) {
class Body : MutableList<Body.Item> by mutableListOf() {
class Item(id: String, roles: List<String>) {
val citizen = CitizenRef(id.toUUID())
class Item(val citizen: CitizenRef, roles: List<String> = emptyList()) {
val roles: List<Role> = roles.map {
Role.valueOf(it)
}
@@ -160,8 +153,8 @@ fun Route.workgroup(repo: WorkgroupRepository) {
.let { members ->
assertCan(ADD_MEMBERS, it.workgroup)
repo.addMembers(it.workgroup, members)
}.let {
call.respond(HttpStatusCode.Created, it)
}.let { members ->
call.respond(HttpStatusCode.Created, members)
}
}
@@ -171,8 +164,8 @@ fun Route.workgroup(repo: WorkgroupRepository) {
.let { members ->
assertCan(REMOVE_MEMBERS, it.workgroup)
repo.removeMembers(it.workgroup, members)
}.let {
call.respond(HttpStatusCode.OK, it)
}.let { members ->
call.respond(HttpStatusCode.OK, members)
}
}
@@ -182,8 +175,8 @@ fun Route.workgroup(repo: WorkgroupRepository) {
.let { members ->
assertCan(UPDATE_MEMBERS, it.workgroup)
repo.updateMembers(it.workgroup, members)
}.let {
call.respond(HttpStatusCode.OK, it)
}.let { members ->
call.respond(HttpStatusCode.OK, members)
}
}
}

View File

@@ -3,6 +3,7 @@ create or replace function upsert_workgroup(inout resource json)
$$
declare
new_id uuid = coalesce((resource->>'id')::uuid, uuid_generate_v4());
exists boolean = case when (select true from workgroup where id = new_id) is null then true else false end;
begin
insert into workgroup (id, created_by_id, name, description, anonymous, logo)
select
@@ -22,9 +23,19 @@ begin
insert into citizen_in_workgroup (workgroup_id, citizen_id, roles)
select
new_id::uuid,
(resource#>>'{created_by, id}')::uuid,
'{MASTER}'
from json_populate_recordset(null::workgroup, resource->'members');
citizen_id,
roles
from json_populate_recordset(null::citizen_in_workgroup, resource->'members') m;
-- insert master if no members
if (exists) then
insert into citizen_in_workgroup (workgroup_id, citizen_id, roles)
select
new_id::uuid,
(resource#>>'{created_by, id}')::uuid,
'{MASTER}'
on conflict do nothing;
end if;
select find_workgroup_by_id(new_id) into resource;
end;