diff --git a/src/main/kotlin/fr/dcproject/Application.kt b/src/main/kotlin/fr/dcproject/Application.kt index 2b79d01..0d1fec4 100644 --- a/src/main/kotlin/fr/dcproject/Application.kt +++ b/src/main/kotlin/fr/dcproject/Application.kt @@ -161,6 +161,7 @@ fun Application.module(env: Env = PROD) { commentArticle(get()) commentConstitution(get()) voteArticle(get()) + voteConstitution(get()) } } diff --git a/src/main/kotlin/fr/dcproject/routes/VoteConstitution.kt b/src/main/kotlin/fr/dcproject/routes/VoteConstitution.kt new file mode 100644 index 0000000..00fe66f --- /dev/null +++ b/src/main/kotlin/fr/dcproject/routes/VoteConstitution.kt @@ -0,0 +1,41 @@ +package fr.dcproject.routes + +import fr.dcproject.citizen +import fr.dcproject.entity.Citizen +import fr.dcproject.routes.VoteConstitutionPaths.ConstitutionVoteRequest.Content +import fr.dcproject.security.voter.VoteVoter.Action.CREATE +import fr.dcproject.security.voter.assertCan +import io.ktor.application.call +import io.ktor.http.HttpStatusCode +import io.ktor.locations.KtorExperimentalLocationsAPI +import io.ktor.locations.Location +import io.ktor.locations.put +import io.ktor.request.receive +import io.ktor.response.respond +import io.ktor.routing.Route +import fr.dcproject.entity.Constitution as ConstitutionEntity +import fr.dcproject.entity.Vote as VoteEntity +import fr.dcproject.repository.VoteConstitution as VoteConstitutionRepository + +@KtorExperimentalLocationsAPI +object VoteConstitutionPaths { + @Location("/constitutions/{constitution}/vote") class ConstitutionVoteRequest(val constitution: ConstitutionEntity) { + data class Content(var note: Int) + } + @Location("/citizens/{citizen}/votes/constitutions") class CitizenVoteConstitutionRequest(val citizen: Citizen) +} + +@KtorExperimentalLocationsAPI +fun Route.voteConstitution(repo: VoteConstitutionRepository) { + put { + val content = call.receive() + val vote = VoteEntity( + target = it.constitution, + note = content.note, + createdBy = this.citizen + ) + assertCan(CREATE, vote) + repo.vote(vote) + call.respond(HttpStatusCode.Created) + } +} \ No newline at end of file diff --git a/src/main/resources/openApi.yaml b/src/main/resources/openApi.yaml index bb0ee1c..e26b703 100644 --- a/src/main/resources/openApi.yaml +++ b/src/main/resources/openApi.yaml @@ -403,6 +403,30 @@ paths: responses: 201: description: Return only http status 201 on success + /constitutions/{constitution}/vote: + parameters: + - name: constitution + in: path + description: The ID of constitution + example: e74be8e4-6823-47c4-bd1b-789725b2fa8e + required: true + schema: + type: string + format: uuid + put: + security: + - JWTAuth: [] + summary: Vote for one constitution + tags: + - vote + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/VoteRequest' + responses: + 201: + description: Return only http status 201 on success components: parameters: diff --git a/src/test/resources/feature/vote.feature b/src/test/resources/feature/vote.feature index ce9be45..7f67c8f 100644 --- a/src/test/resources/feature/vote.feature +++ b/src/test/resources/feature/vote.feature @@ -10,9 +10,9 @@ Feature: vote Article """ Then the response status code should be 201 - Scenario: Vote article + Scenario: Vote constitution Given I am authenticated as John Doe with id "64b7b379-2298-43ec-b428-ba134930cabd" - When I send a PUT request to "/articles/9226c1a3-8091-c3fa-7d0d-c2e98c9bee7b/vote" with body: + When I send a PUT request to "/constitutions/64b1f265-bfb3-332b-eef9-d00f63a3beaa/vote" with body: """ { "note": -1