Skip to content

Commit 4dbf3bf

Browse files
authored
CDPS-1071 update religion (#19)
* CDPS-1071 Implement update religion endpoint * CDPS-1071 Make some properties of religion update request optional
1 parent 7f4d2d1 commit 4dbf3bf

File tree

7 files changed

+112
-30
lines changed

7 files changed

+112
-30
lines changed

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

+7
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import org.springframework.web.service.annotation.PutExchange
99
import uk.gov.justice.digital.hmpps.personintegrationapi.common.client.dto.UpdateBirthCountry
1010
import uk.gov.justice.digital.hmpps.personintegrationapi.common.client.request.UpdateBirthPlace
1111
import uk.gov.justice.digital.hmpps.personintegrationapi.common.client.request.UpdateNationality
12+
import uk.gov.justice.digital.hmpps.personintegrationapi.common.client.request.UpdateReligion
1213
import uk.gov.justice.digital.hmpps.personintegrationapi.common.client.response.MilitaryRecordPrisonDto
1314

1415
@HttpExchange("/api/offenders")
@@ -35,4 +36,10 @@ interface PrisonApiClient {
3536
fun getMilitaryRecords(
3637
@PathVariable offenderNo: String,
3738
): ResponseEntity<MilitaryRecordPrisonDto>
39+
40+
@PutExchange("/{offenderNo}/religion")
41+
fun updateReligionForWorkingName(
42+
@PathVariable offenderNo: String,
43+
@RequestBody updateNationality: UpdateReligion,
44+
): ResponseEntity<Void>
3845
}
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/dto/request/ReligionV1RequestDto.kt

+4-8
Original file line numberDiff line numberDiff line change
@@ -16,24 +16,20 @@ data class ReligionV1RequestDto(
1616
@Schema(
1717
description = "Reason for the religion change",
1818
example = "Religion has changed",
19-
required = false,
20-
nullable = false,
19+
nullable = true,
2120
)
22-
val reasonForChange: String,
21+
val reasonForChange: String?,
2322

2423
@Schema(
2524
description = "The date the religious belief is valid from",
26-
required = true,
27-
nullable = false,
25+
nullable = true,
2826
)
29-
val effectiveFromDate: LocalDate,
27+
val effectiveFromDate: LocalDate?,
3028

3129
@Schema(
3230
description = "Boolean indicating if the religious belief has been verified.",
3331
example = "false",
3432
defaultValue = "false",
35-
required = true,
36-
nullable = false,
3733
)
3834
val isVerified: Boolean,
3935
)

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
@@ -135,6 +135,18 @@ class PrisonApiMockServer : WireMockServer(8082) {
135135
)
136136
}
137137

138+
fun stubUpdateReligionForWorkingName() {
139+
val endpoint = "religion"
140+
stubOffenderPutEndpoint(endpoint, HttpStatus.NO_CONTENT, PRISONER_NUMBER)
141+
stubOffenderPutEndpoint(endpoint, HttpStatus.INTERNAL_SERVER_ERROR, PRISONER_NUMBER_THROW_EXCEPTION)
142+
stubOffenderPutEndpoint(
143+
endpoint,
144+
HttpStatus.NOT_FOUND,
145+
PRISONER_NUMBER_NOT_FOUND,
146+
PRISON_API_NOT_FOUND_RESPONSE.trimIndent(),
147+
)
148+
}
149+
138150
fun stubReferenceDataCodes(domain: String = "TEST", body: String = PRISON_API_REFERENCE_CODES) {
139151
stubFor(
140152
get(urlPathMatching("/api/reference-domains/domains/$domain/all-codes")).willReturn(
@@ -193,6 +205,7 @@ class PrisonApiExtension :
193205
prisonApi.stubUpdateBirthPlaceForWorkingName()
194206
prisonApi.stubUpdateBirthCountryForWorkingName()
195207
prisonApi.stubUpdateNationalityForWorkingName()
208+
prisonApi.stubUpdateReligionForWorkingName()
196209
prisonApi.stubReferenceDataCodes()
197210
prisonApi.stubGetMilitaryRecords()
198211
}

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

+37-11
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,40 @@ 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+
}
6059

61-
assertThat(response).isEqualTo(EXPECTED_RELIGION_UPDATE_RESPONSE)
60+
@Test
61+
fun `can update a persons religion by prisoner number - minimal request example`() {
62+
webTestClient.put()
63+
.uri("v1/person-protected-characteristics/religion?prisonerNumber=$PRISONER_NUMBER")
64+
.contentType(MediaType.APPLICATION_JSON)
65+
.headers(setAuthorisation(roles = listOf(PersonProtectedCharacteristicsRoleConstants.PROTECTED_CHARACTERISTICS_READ_WRITE_ROLE)))
66+
.bodyValue(MINIMAL_RELIGION_REQUEST_DTO)
67+
.exchange()
68+
.expectStatus().isNoContent
69+
}
70+
}
71+
72+
@Nested
73+
inner class NotFound {
74+
75+
@Test
76+
fun `handles a 404 not found response from downstream api`() {
77+
webTestClient.put()
78+
.uri("v1/person-protected-characteristics/religion?prisonerNumber=$PRISONER_NUMBER_NOT_FOUND")
79+
.contentType(MediaType.APPLICATION_JSON)
80+
.headers(setAuthorisation(roles = listOf(PersonProtectedCharacteristicsRoleConstants.PROTECTED_CHARACTERISTICS_READ_WRITE_ROLE)))
81+
.bodyValue(TEST_RELIGION_REQUEST_DTO)
82+
.exchange()
83+
.expectStatus().isNotFound
84+
.expectBody().json(PRISON_API_NOT_FOUND_RESPONSE.trimIndent())
6285
}
6386
}
6487
}
@@ -113,10 +136,13 @@ class PersonProtectedCharacteristicsV1ResourceIntTest : IntegrationTestBase() {
113136
false,
114137
)
115138

116-
val EXPECTED_RELIGION_UPDATE_RESPONSE = PersonReligionInformationV1ResponseDto(
117-
currentReligion = ReligionDto(),
118-
religionHistory = emptySet(),
119-
)
139+
val MINIMAL_RELIGION_REQUEST_DTO =
140+
ReligionV1RequestDto(
141+
"AGNO",
142+
null,
143+
null,
144+
false,
145+
)
120146

121147
const val TEST_DOMAIN = "RELIGION"
122148
}

0 commit comments

Comments
 (0)