diff --git a/src/main/kotlin/fr/dcproject/component/workgroup/routes/members/AddMemberToWorkgroup.kt b/src/main/kotlin/fr/dcproject/component/workgroup/routes/members/AddMemberToWorkgroup.kt index 546491f..dd73f81 100644 --- a/src/main/kotlin/fr/dcproject/component/workgroup/routes/members/AddMemberToWorkgroup.kt +++ b/src/main/kotlin/fr/dcproject/component/workgroup/routes/members/AddMemberToWorkgroup.kt @@ -7,6 +7,7 @@ import fr.dcproject.component.citizen.database.CitizenRef import fr.dcproject.component.workgroup.WorkgroupAccessControl import fr.dcproject.component.workgroup.database.WorkgroupRepository import fr.dcproject.component.workgroup.database.WorkgroupWithMembersI +import fr.dcproject.component.workgroup.routes.toOutput import io.ktor.application.ApplicationCall import io.ktor.application.call import io.ktor.http.HttpStatusCode @@ -22,8 +23,8 @@ import java.util.UUID object AddMemberToWorkgroup { @Location("/workgroups/{workgroupId}/members") class WorkgroupsMembersRequest(val workgroupId: UUID) : KoinComponent { - class Input : MutableList by mutableListOf() { - class Item(val citizen: CitizenRef, roles: List = emptyList()) { + class Input : MutableList by mutableListOf() { + class Member(val citizen: CitizenRef, roles: List = emptyList()) { val roles: List = roles.map { WorkgroupWithMembersI.Member.Role.valueOf(it) } @@ -48,7 +49,10 @@ object AddMemberToWorkgroup { ac.assert { canAddMembers(workgroup, citizenOrNull) } repo.addMembers(workgroup, members) }.let { members -> - call.respond(HttpStatusCode.Created, members) + call.respond( + HttpStatusCode.Created, + members.toOutput() + ) } } ?: call.respond(HttpStatusCode.NotFound) } diff --git a/src/main/kotlin/fr/dcproject/component/workgroup/routes/members/DeleteMembersOfWorkgroup.kt b/src/main/kotlin/fr/dcproject/component/workgroup/routes/members/DeleteMembersOfWorkgroup.kt index 48883e8..fb22715 100644 --- a/src/main/kotlin/fr/dcproject/component/workgroup/routes/members/DeleteMembersOfWorkgroup.kt +++ b/src/main/kotlin/fr/dcproject/component/workgroup/routes/members/DeleteMembersOfWorkgroup.kt @@ -7,6 +7,7 @@ import fr.dcproject.component.citizen.database.CitizenRef import fr.dcproject.component.workgroup.WorkgroupAccessControl import fr.dcproject.component.workgroup.database.WorkgroupRepository import fr.dcproject.component.workgroup.database.WorkgroupWithMembersI +import fr.dcproject.component.workgroup.routes.toOutput import io.ktor.application.ApplicationCall import io.ktor.application.call import io.ktor.http.HttpStatusCode @@ -17,37 +18,34 @@ import io.ktor.response.respond import io.ktor.routing.Route import org.koin.core.KoinComponent import java.util.UUID +import fr.dcproject.component.workgroup.routes.members.DeleteMembersOfWorkgroup.WorkgroupsMembersRequest.Input as Input @KtorExperimentalLocationsAPI object DeleteMembersOfWorkgroup { @Location("/workgroups/{workgroupId}/members") class WorkgroupsMembersRequest(val workgroupId: UUID) : KoinComponent { - class Input : MutableList by mutableListOf() { - class Item(val citizen: CitizenRef, roles: List = emptyList()) { - val roles: List = roles.map { - WorkgroupWithMembersI.Member.Role.valueOf(it) - } - } + class Input : MutableList by mutableListOf() { + class Member(val citizen: CitizenRef) } } - private suspend fun ApplicationCall.getMembersFromRequest(): List> = receiveOrBadRequest().map { - WorkgroupWithMembersI.Member( - citizen = it.citizen, - roles = it.roles - ) - } + private suspend fun ApplicationCall.getMembersFromRequest(): List> = + receiveOrBadRequest().map { WorkgroupWithMembersI.Member(it.citizen) } fun Route.deleteMemberOfWorkgroup(repo: WorkgroupRepository, ac: WorkgroupAccessControl) { /* Delete members of workgroup */ delete { repo.findById(it.workgroupId)?.let { workgroup -> - call.getMembersFromRequest().let { members -> - ac.assert { canView(workgroup, citizenOrNull) } - repo.removeMembers(workgroup, members) - }.let { members -> - call.respond(HttpStatusCode.OK, members) - } + call.getMembersFromRequest() + .let { members -> + ac.assert { canRemoveMembers(workgroup, citizenOrNull) } + repo.removeMembers(workgroup, members) + }.let { members -> + call.respond( + HttpStatusCode.OK, + members.toOutput() + ) + } } ?: call.respond(HttpStatusCode.NotFound) } } diff --git a/src/main/kotlin/fr/dcproject/component/workgroup/routes/members/UpdateMemberOfWorkgroup.kt b/src/main/kotlin/fr/dcproject/component/workgroup/routes/members/UpdateMemberOfWorkgroup.kt index 02c0994..b36a2b3 100644 --- a/src/main/kotlin/fr/dcproject/component/workgroup/routes/members/UpdateMemberOfWorkgroup.kt +++ b/src/main/kotlin/fr/dcproject/component/workgroup/routes/members/UpdateMemberOfWorkgroup.kt @@ -7,6 +7,7 @@ import fr.dcproject.component.citizen.database.CitizenRef import fr.dcproject.component.workgroup.WorkgroupAccessControl import fr.dcproject.component.workgroup.database.WorkgroupRepository import fr.dcproject.component.workgroup.database.WorkgroupWithMembersI +import fr.dcproject.component.workgroup.routes.toOutput import io.ktor.application.ApplicationCall import io.ktor.application.call import io.ktor.http.HttpStatusCode @@ -46,7 +47,10 @@ object UpdateMemberOfWorkgroup { ac.assert { canUpdateMembers(workgroup, citizenOrNull) } repo.updateMembers(workgroup, members) }.let { members -> - call.respond(HttpStatusCode.OK, members) + call.respond( + HttpStatusCode.OK, + members.toOutput() + ) } } ?: call.respond(HttpStatusCode.NotFound) } diff --git a/src/main/kotlin/fr/dcproject/component/workgroup/routes/response.kt b/src/main/kotlin/fr/dcproject/component/workgroup/routes/response.kt index 64c3938..985a313 100644 --- a/src/main/kotlin/fr/dcproject/component/workgroup/routes/response.kt +++ b/src/main/kotlin/fr/dcproject/component/workgroup/routes/response.kt @@ -1,11 +1,13 @@ package fr.dcproject.component.workgroup.routes import fr.dcproject.common.response.toOutput +import fr.dcproject.component.citizen.database.CitizenCreator import fr.dcproject.component.workgroup.database.WorkgroupForView +import fr.dcproject.component.workgroup.database.WorkgroupWithMembersI import org.joda.time.DateTime import java.util.UUID -fun WorkgroupForView<*>.toOutput(): Any = this.let { w -> +fun WorkgroupForView.toOutput(): Any = this.let { w -> object { val id: UUID = w.id val name: String = w.name @@ -14,20 +16,7 @@ fun WorkgroupForView<*>.toOutput(): Any = this.let { w -> val anonymous: Boolean = w.anonymous val createdAt: DateTime = w.createdAt val createdBy: Any = w.createdBy.toOutput() - val members: Any = w.members.map { m -> - object { - val citizen: Any = object { - val id: UUID = m.citizen.id - val name: Any = m.citizen.name.let { n -> - object { - val firstName: String = n.firstName - val lastName: String = n.lastName - } - } - } - val roles: List = m.roles.map { it.toString() } - } - } + val members: Any = w.members.toOutput() } } @@ -40,3 +29,12 @@ fun WorkgroupForView<*>.toOutputListing(): Any = this.let { w -> val createdAt: DateTime = w.createdAt } } + +fun List>.toOutput(): Any { + return this.map { m -> + object { + val citizen: Any = m.citizen.toOutput() + val roles: List = m.roles.map { it.toString() } + } + } +} diff --git a/src/main/resources/openapi2.yaml b/src/main/resources/openapi2.yaml index 32def80..e016f54 100644 --- a/src/main/resources/openapi2.yaml +++ b/src/main/resources/openapi2.yaml @@ -1250,6 +1250,78 @@ paths: description: Workgroup deleted 404: description: Workshop not exist or are already deleted + /workgroups/{workgroup}/members: + parameters: + - $ref: '#/components/parameters/workgroup' + post: + summary: Add members to the workgroup + security: + - JWTAuth: [] + tags: + - workgroup + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MembersRequest' + responses: + 201: + description: the list of members + content: + application/json: + schema: + $ref: '#/components/schemas/MembersResponse' + put: + summary: Updates ALL members. + description: ⚠ PLEASE NOTE ⚠ This request removes all members who are not in request! + security: + - JWTAuth: [] + tags: + - workgroup + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MembersRequest' + responses: + 200: + description: the list of members + content: + application/json: + schema: + $ref: '#/components/schemas/MembersResponse' + 400: + $ref: '#/components/responses/400' + delete: + summary: Delete members of workgroup + security: + - JWTAuth: [] + tags: + - workgroup + requestBody: + content: + application/json: + schema: + description: members of workgroup + type: array + items: + type: object + properties: + citizen: + required: + - id + properties: + id: + $ref: '#/components/schemas/UUID' + responses: + 200: + description: the list of members + content: + application/json: + schema: + $ref: '#/components/schemas/MembersResponse' + 400: + $ref: '#/components/responses/400' components: parameters: @@ -2058,7 +2130,6 @@ components: logo: type: string nullable: true - Workgroup: description: Workgroup type: object @@ -2088,20 +2159,49 @@ components: createdBy: $ref: '#/components/schemas/CitizenCreator' members: - type: array - items: - type: object + $ref: '#/components/schemas/MembersResponse' + + MembersRequest: + description: members of workgroup + type: array + items: + type: object + properties: + citizen: + required: + - id properties: - citizen: - type: object - items: - properties: - id: - $ref: '#/components/schemas/UUID' - roles: - type: array - items: - type: string + id: + $ref: '#/components/schemas/UUID' + roles: + type: array + items: + type: string + enum: + - MASTER + - MANAGER + - EDITOR + - REPORTER + example: MASTER + MembersResponse: + description: members of workgroup + type: array + items: + description: Member of workgroup + type: object + properties: + citizen: + $ref: '#/components/schemas/CitizenCreator' + roles: + type: array + items: + type: string + enum: + - MASTER + - MANAGER + - EDITOR + - REPORTER + example: MASTER securitySchemes: JWTAuth: diff --git a/src/test/kotlin/integration/Workgroup routes.kt b/src/test/kotlin/integration/Workgroup routes.kt index 44884dd..ad67f4e 100644 --- a/src/test/kotlin/integration/Workgroup routes.kt +++ b/src/test/kotlin/integration/Workgroup routes.kt @@ -204,8 +204,7 @@ class `Workgroup routes` : BaseTest() { """ [ { - "citizen": {"id":"87909ba3-2069-431c-9924-219fd8411cf2"}, - "roles": ["MASTER"] + "citizen": {"id":"87909ba3-2069-431c-9924-219fd8411cf2"} } ] """