Skip to content

Commit 83b343f

Browse files
committed
CDPS-1071 Implement update religion endpoint
1 parent c5c8858 commit 83b343f

File tree

6 files changed

+90
-23
lines changed

6 files changed

+90
-23
lines changed

src/main/kotlin/uk/gov/justice/digital/hmpps/personintegrationapi/common/client/PrisonApiClient.kt

+7
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import org.springframework.web.service.annotation.PutExchange
88
import uk.gov.justice.digital.hmpps.personintegrationapi.common.client.dto.UpdateBirthCountry
99
import uk.gov.justice.digital.hmpps.personintegrationapi.common.client.request.UpdateBirthPlace
1010
import uk.gov.justice.digital.hmpps.personintegrationapi.common.client.request.UpdateNationality
11+
import uk.gov.justice.digital.hmpps.personintegrationapi.common.client.request.UpdateReligion
1112

1213
@HttpExchange("/api/offenders")
1314
interface PrisonApiClient {
@@ -28,4 +29,10 @@ interface PrisonApiClient {
2829
@PathVariable offenderNo: String,
2930
@RequestBody updateNationality: UpdateNationality,
3031
): ResponseEntity<Void>
32+
33+
@PutExchange("/{offenderNo}/religion")
34+
fun updateReligionForWorkingName(
35+
@PathVariable offenderNo: String,
36+
@RequestBody updateNationality: UpdateReligion,
37+
): ResponseEntity<Void>
3138
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package uk.gov.justice.digital.hmpps.personintegrationapi.common.client.request
2+
3+
import io.swagger.v3.oas.annotations.media.Schema
4+
import jakarta.validation.constraints.Size
5+
import java.time.LocalDate
6+
7+
@Schema(description = "Update to prisoner religion")
8+
data class UpdateReligion(
9+
@Schema(description = "The religion code", example = "ZORO", required = true)
10+
val religion: String,
11+
@Schema(description = "Reason for the religion change", example = "Some information")
12+
@Size(max = 4000, message = "Comment text must be a maximum of 4000 characters")
13+
val comment: String?,
14+
@Schema(description = "The date the religious belief is valid from (in YYYY-MM-DD format)")
15+
val effectiveFromDate: LocalDate?,
16+
@Schema(description = "Has the religious belief been verified?", example = "false", defaultValue = "false")
17+
val verified: Boolean,
18+
)

src/main/kotlin/uk/gov/justice/digital/hmpps/personintegrationapi/personprotectercharacteristics/resource/PersonProtectedCharacteristicsV1Resource.kt

+10-11
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import jakarta.validation.Valid
1010
import org.springframework.http.HttpStatus
1111
import org.springframework.http.MediaType
1212
import org.springframework.http.ResponseEntity
13-
import org.springframework.http.ResponseEntity.ok
13+
import org.springframework.http.ResponseEntity.noContent
1414
import org.springframework.security.access.prepost.PreAuthorize
1515
import org.springframework.web.bind.annotation.GetMapping
1616
import org.springframework.web.bind.annotation.PathVariable
@@ -22,10 +22,9 @@ import org.springframework.web.bind.annotation.ResponseStatus
2222
import org.springframework.web.bind.annotation.RestController
2323
import uk.gov.justice.digital.hmpps.personintegrationapi.common.annotation.ValidPrisonerNumber
2424
import uk.gov.justice.digital.hmpps.personintegrationapi.common.dto.ReferenceDataCodeDto
25-
import uk.gov.justice.digital.hmpps.personintegrationapi.personprotectedcharacteristics.dto.v1.common.ReligionDto
2625
import uk.gov.justice.digital.hmpps.personintegrationapi.personprotectedcharacteristics.dto.v1.request.ReligionV1RequestDto
27-
import uk.gov.justice.digital.hmpps.personintegrationapi.personprotectedcharacteristics.dto.v1.response.PersonReligionInformationV1ResponseDto
2826
import uk.gov.justice.digital.hmpps.personintegrationapi.personprotectercharacteristics.PersonProtectedCharacteristicsRoleConstants
27+
import uk.gov.justice.digital.hmpps.personintegrationapi.personprotectercharacteristics.service.PersonProtectedCharacteristicsService
2928
import uk.gov.justice.hmpps.kotlin.common.ErrorResponse
3029

3130
@RestController
@@ -37,15 +36,17 @@ import uk.gov.justice.hmpps.kotlin.common.ErrorResponse
3736
value = ["v1/person-protected-characteristics"],
3837
produces = [MediaType.APPLICATION_JSON_VALUE],
3938
)
40-
class PersonProtectedCharacteristicsV1Resource {
39+
class PersonProtectedCharacteristicsV1Resource(
40+
private val personProtectedCharacteristicsService: PersonProtectedCharacteristicsService,
41+
) {
4142

4243
@PutMapping("/religion")
4344
@ResponseStatus(HttpStatus.OK)
4445
@Operation(
4546
description = "Requires role `${PersonProtectedCharacteristicsRoleConstants.PROTECTED_CHARACTERISTICS_READ_WRITE_ROLE}`",
4647
responses = [
4748
ApiResponse(
48-
responseCode = "200",
49+
responseCode = "204",
4950
description = "Religion data successfully added/updated.",
5051
),
5152
ApiResponse(
@@ -84,12 +85,10 @@ class PersonProtectedCharacteristicsV1Resource {
8485
fun putReligionByPrisonerNumber(
8586
@RequestParam(required = true) @Valid @ValidPrisonerNumber prisonerNumber: String,
8687
@RequestBody(required = true) @Valid religionV1RequestDto: ReligionV1RequestDto,
87-
): ResponseEntity<PersonReligionInformationV1ResponseDto> = ok().body(
88-
PersonReligionInformationV1ResponseDto(
89-
currentReligion = ReligionDto(),
90-
religionHistory = emptySet(),
91-
),
92-
)
88+
): ResponseEntity<Void> {
89+
personProtectedCharacteristicsService.updateReligion(prisonerNumber, religionV1RequestDto)
90+
return noContent().build()
91+
}
9392

9493
@GetMapping("reference-data/domain/{domain}/codes")
9594
@ResponseStatus(HttpStatus.OK)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package uk.gov.justice.digital.hmpps.personintegrationapi.personprotectercharacteristics.service
2+
3+
import org.springframework.stereotype.Service
4+
import uk.gov.justice.digital.hmpps.personintegrationapi.common.client.PrisonApiClient
5+
import uk.gov.justice.digital.hmpps.personintegrationapi.common.client.request.UpdateReligion
6+
import uk.gov.justice.digital.hmpps.personintegrationapi.personprotectedcharacteristics.dto.v1.request.ReligionV1RequestDto
7+
8+
@Service
9+
class PersonProtectedCharacteristicsService(
10+
private val prisonApiClient: PrisonApiClient,
11+
) {
12+
fun updateReligion(prisonerNumber: String, updateRequest: ReligionV1RequestDto) {
13+
prisonApiClient.updateReligionForWorkingName(
14+
prisonerNumber,
15+
UpdateReligion(
16+
updateRequest.religionCode,
17+
updateRequest.reasonForChange,
18+
updateRequest.effectiveFromDate,
19+
updateRequest.isVerified,
20+
),
21+
)
22+
}
23+
}

src/test/kotlin/uk/gov/justice/digital/hmpps/personintegrationapi/integration/wiremock/PrisonApiMockServer.kt

+13
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,18 @@ class PrisonApiMockServer : WireMockServer(8082) {
8989
)
9090
}
9191

92+
fun stubUpdateReligionForWorkingName() {
93+
val endpoint = "religion"
94+
stubOffenderEndpoint(endpoint, HttpStatus.NO_CONTENT, PRISONER_NUMBER)
95+
stubOffenderEndpoint(endpoint, HttpStatus.INTERNAL_SERVER_ERROR, PRISONER_NUMBER_THROW_EXCEPTION)
96+
stubOffenderEndpoint(
97+
endpoint,
98+
HttpStatus.NOT_FOUND,
99+
PRISONER_NUMBER_NOT_FOUND,
100+
PRISON_API_NOT_FOUND_RESPONSE.trimIndent(),
101+
)
102+
}
103+
92104
fun stubReferenceDataCodes(domain: String = "TEST", body: String = PRISON_API_REFERENCE_CODES) {
93105
stubFor(
94106
get(urlPathMatching("/api/reference-domains/domains/$domain/all-codes")).willReturn(
@@ -125,6 +137,7 @@ class PrisonApiExtension :
125137
prisonApi.stubUpdateBirthPlaceForWorkingName()
126138
prisonApi.stubUpdateBirthCountryForWorkingName()
127139
prisonApi.stubUpdateNationalityForWorkingName()
140+
prisonApi.stubUpdateReligionForWorkingName()
128141
prisonApi.stubReferenceDataCodes()
129142
}
130143

src/test/kotlin/uk/gov/justice/digital/hmpps/personintegrationapi/personprotectercharacteristics/resource/PersonProtectedCharacteristicsV1ResourceIntTest.kt

+19-12
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import org.springframework.http.MediaType
88
import uk.gov.justice.digital.hmpps.personintegrationapi.common.dto.ReferenceDataCodeDto
99
import uk.gov.justice.digital.hmpps.personintegrationapi.integration.IntegrationTestBase
1010
import uk.gov.justice.digital.hmpps.personintegrationapi.integration.wiremock.PRISONER_NUMBER
11-
import uk.gov.justice.digital.hmpps.personintegrationapi.personprotectedcharacteristics.dto.v1.common.ReligionDto
11+
import uk.gov.justice.digital.hmpps.personintegrationapi.integration.wiremock.PRISONER_NUMBER_NOT_FOUND
12+
import uk.gov.justice.digital.hmpps.personintegrationapi.integration.wiremock.PRISON_API_NOT_FOUND_RESPONSE
1213
import uk.gov.justice.digital.hmpps.personintegrationapi.personprotectedcharacteristics.dto.v1.request.ReligionV1RequestDto
13-
import uk.gov.justice.digital.hmpps.personintegrationapi.personprotectedcharacteristics.dto.v1.response.PersonReligionInformationV1ResponseDto
1414
import uk.gov.justice.digital.hmpps.personintegrationapi.personprotectercharacteristics.PersonProtectedCharacteristicsRoleConstants
1515
import java.time.LocalDate
1616

@@ -48,17 +48,29 @@ class PersonProtectedCharacteristicsV1ResourceIntTest : IntegrationTestBase() {
4848

4949
@Test
5050
fun `can update a persons religion by prisoner number`() {
51-
val response = webTestClient.put()
51+
webTestClient.put()
5252
.uri("v1/person-protected-characteristics/religion?prisonerNumber=$PRISONER_NUMBER")
5353
.contentType(MediaType.APPLICATION_JSON)
5454
.headers(setAuthorisation(roles = listOf(PersonProtectedCharacteristicsRoleConstants.PROTECTED_CHARACTERISTICS_READ_WRITE_ROLE)))
5555
.bodyValue(TEST_RELIGION_REQUEST_DTO)
5656
.exchange()
57-
.expectStatus().isOk
58-
.expectBody(PersonReligionInformationV1ResponseDto::class.java)
59-
.returnResult().responseBody
57+
.expectStatus().isNoContent
58+
}
59+
}
6060

61-
assertThat(response).isEqualTo(EXPECTED_RELIGION_UPDATE_RESPONSE)
61+
@Nested
62+
inner class NotFound {
63+
64+
@Test
65+
fun `handles a 404 not found response from downstream api`() {
66+
webTestClient.put()
67+
.uri("v1/person-protected-characteristics/religion?prisonerNumber=$PRISONER_NUMBER_NOT_FOUND")
68+
.contentType(MediaType.APPLICATION_JSON)
69+
.headers(setAuthorisation(roles = listOf(PersonProtectedCharacteristicsRoleConstants.PROTECTED_CHARACTERISTICS_READ_WRITE_ROLE)))
70+
.bodyValue(TEST_RELIGION_REQUEST_DTO)
71+
.exchange()
72+
.expectStatus().isNotFound
73+
.expectBody().json(PRISON_API_NOT_FOUND_RESPONSE.trimIndent())
6274
}
6375
}
6476
}
@@ -113,11 +125,6 @@ class PersonProtectedCharacteristicsV1ResourceIntTest : IntegrationTestBase() {
113125
false,
114126
)
115127

116-
val EXPECTED_RELIGION_UPDATE_RESPONSE = PersonReligionInformationV1ResponseDto(
117-
currentReligion = ReligionDto(),
118-
religionHistory = emptySet(),
119-
)
120-
121128
const val TEST_DOMAIN = "RELIGION"
122129
}
123130
}

0 commit comments

Comments
 (0)