From 1dcd89a9eaaa0fa25a814f19e016061b67c8d941 Mon Sep 17 00:00:00 2001 From: Chiara Date: Fri, 14 Jun 2024 14:38:40 +0100 Subject: [PATCH 01/10] Editing from the bottom up --- .../hmppsintegrationapi/extensions/WebClientWrapper.kt | 8 ++++++-- .../gateways/AssessRisksAndNeedsGateway.kt | 1 + .../services/GetRiskPredictorScoresForPersonService.kt | 4 ++++ .../GetRiskPredictorScoresForPersonTest.kt | 8 ++++++++ .../GetRiskPredictorScoresForPersonServiceTest.kt | 8 +++++++- 5 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/extensions/WebClientWrapper.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/extensions/WebClientWrapper.kt index df565beaf..286ddc165 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/extensions/WebClientWrapper.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/extensions/WebClientWrapper.kt @@ -38,6 +38,7 @@ class WebClientWrapper( headers: Map, upstreamApi: UpstreamApi, requestBody: Map? = null, + returnsEmpty: Boolean = false, ): WebClientWrapperResponse { return try { val responseData = @@ -47,7 +48,7 @@ class WebClientWrapper( WebClientWrapperResponse.Success(responseData) } catch (exception: WebClientResponseException) { - getErrorType(exception, upstreamApi) + getErrorType(exception, upstreamApi, returnsEmpty) } } @@ -57,6 +58,7 @@ class WebClientWrapper( headers: Map, upstreamApi: UpstreamApi, requestBody: Map? = null, + returnsEmpty: Boolean = false, ): WebClientWrapperResponse> { return try { val responseData = @@ -67,7 +69,7 @@ class WebClientWrapper( WebClientWrapperResponse.Success(responseData) } catch (exception: WebClientResponseException) { - getErrorType(exception, upstreamApi) + getErrorType(exception, upstreamApi, returnsEmpty) } } @@ -92,10 +94,12 @@ class WebClientWrapper( fun getErrorType( exception: WebClientResponseException, upstreamApi: UpstreamApi, + returnsEmpty: Boolean = false, ): WebClientWrapperResponse.Error { val errorType = when (exception.statusCode) { HttpStatus.NOT_FOUND -> UpstreamApiError.Type.ENTITY_NOT_FOUND + HttpStatus.FORBIDDEN -> if (returnsEmpty) UpstreamApiError.Type.FORBIDDEN else throw exception else -> throw exception } return WebClientWrapperResponse.Error( diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/AssessRisksAndNeedsGateway.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/AssessRisksAndNeedsGateway.kt index 8d96d8c7e..a7eacbe81 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/AssessRisksAndNeedsGateway.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/AssessRisksAndNeedsGateway.kt @@ -31,6 +31,7 @@ class AssessRisksAndNeedsGateway( "/risks/crn/$id/predictors/all", authenticationHeader(), UpstreamApi.ASSESS_RISKS_AND_NEEDS, + returnsEmpty = true, ) return when (result) { diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskPredictorScoresForPersonService.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskPredictorScoresForPersonService.kt index 7b7001020..d609d4c4b 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskPredictorScoresForPersonService.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskPredictorScoresForPersonService.kt @@ -5,6 +5,7 @@ import org.springframework.stereotype.Service import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.AssessRisksAndNeedsGateway import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.RiskPredictorScore +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError @Service class GetRiskPredictorScoresForPersonService( @@ -19,6 +20,9 @@ class GetRiskPredictorScoresForPersonService( if (deliusCrn != null) { personRiskPredictorScores = assessRisksAndNeedsGateway.getRiskPredictorScoresForPerson(id = deliusCrn) + if (personRiskPredictorScores.hasError(UpstreamApiError.Type.FORBIDDEN)) { + return Response(data = emptyList(), errors = personResponse.errors + personRiskPredictorScores.errors) + } } return Response( diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/assessrisksandneeds/GetRiskPredictorScoresForPersonTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/assessrisksandneeds/GetRiskPredictorScoresForPersonTest.kt index e16580a16..09618a1bc 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/assessrisksandneeds/GetRiskPredictorScoresForPersonTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/assessrisksandneeds/GetRiskPredictorScoresForPersonTest.kt @@ -116,5 +116,13 @@ class GetRiskPredictorScoresForPersonTest( response.hasError(UpstreamApiError.Type.ENTITY_NOT_FOUND).shouldBeTrue() } + + it("returns a 403 FORBIDDEN status code when forbidden") { + assessRisksAndNeedsApiMockServer.stubGetRiskPredictorScoresForPerson(deliusCrn, "", HttpStatus.FORBIDDEN) + + val response = assessRisksAndNeedsGateway.getRiskPredictorScoresForPerson(deliusCrn) + + response.hasError(UpstreamApiError.Type.FORBIDDEN).shouldBeTrue() + } }, ) diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskPredictorScoresForPersonServiceTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskPredictorScoresForPersonServiceTest.kt index 76e3ce191..969276411 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskPredictorScoresForPersonServiceTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskPredictorScoresForPersonServiceTest.kt @@ -110,12 +110,18 @@ internal class GetRiskPredictorScoresForPersonServiceTest( ) } - it("records upstream API error for probation offender search") { + it("records upstream 404 API error for probation offender search") { val response = getRiskPredictorScoresForPersonService.execute(hmppsId) response.hasErrorCausedBy(UpstreamApiError.Type.ENTITY_NOT_FOUND, UpstreamApi.PROBATION_OFFENDER_SEARCH).shouldBe(true) } + it("records upstream 403 API error for probation offender search") { + val response = getRiskPredictorScoresForPersonService.execute(hmppsId) + + response.hasErrorCausedBy(UpstreamApiError.Type.FORBIDDEN, UpstreamApi.PROBATION_OFFENDER_SEARCH).shouldBe(true) + } + it("does not get risk predictor scores from ARN") { getRiskPredictorScoresForPersonService.execute(hmppsId) From 80c976a762b9dc05a20f7ea7c9b1c8ecf0f7a93f Mon Sep 17 00:00:00 2001 From: Chiara Date: Fri, 14 Jun 2024 14:44:45 +0100 Subject: [PATCH 02/10] Now targeting the right error --- .../services/GetRiskPredictorScoresForPersonServiceTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskPredictorScoresForPersonServiceTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskPredictorScoresForPersonServiceTest.kt index 969276411..58d68a040 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskPredictorScoresForPersonServiceTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskPredictorScoresForPersonServiceTest.kt @@ -119,7 +119,7 @@ internal class GetRiskPredictorScoresForPersonServiceTest( it("records upstream 403 API error for probation offender search") { val response = getRiskPredictorScoresForPersonService.execute(hmppsId) - response.hasErrorCausedBy(UpstreamApiError.Type.FORBIDDEN, UpstreamApi.PROBATION_OFFENDER_SEARCH).shouldBe(true) + response.hasErrorCausedBy(UpstreamApiError.Type.FORBIDDEN, UpstreamApi.ASSESS_RISKS_AND_NEEDS).shouldBe(true) } it("does not get risk predictor scores from ARN") { From e3747830ce1eb5cbe15a5d290dd9896f947e295b Mon Sep 17 00:00:00 2001 From: Chiara Date: Fri, 14 Jun 2024 15:26:06 +0100 Subject: [PATCH 03/10] Changed variable name --- .../hmppsintegrationapi/extensions/WebClientWrapper.kt | 8 ++++---- .../gateways/AssessRisksAndNeedsGateway.kt | 2 +- .../GetRiskPredictorScoresForPersonServiceTest.kt | 2 ++ 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/extensions/WebClientWrapper.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/extensions/WebClientWrapper.kt index 286ddc165..41fc766cd 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/extensions/WebClientWrapper.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/extensions/WebClientWrapper.kt @@ -58,7 +58,7 @@ class WebClientWrapper( headers: Map, upstreamApi: UpstreamApi, requestBody: Map? = null, - returnsEmpty: Boolean = false, + forbiddenAsError: Boolean = false, ): WebClientWrapperResponse> { return try { val responseData = @@ -69,7 +69,7 @@ class WebClientWrapper( WebClientWrapperResponse.Success(responseData) } catch (exception: WebClientResponseException) { - getErrorType(exception, upstreamApi, returnsEmpty) + getErrorType(exception, upstreamApi, forbiddenAsError) } } @@ -94,12 +94,12 @@ class WebClientWrapper( fun getErrorType( exception: WebClientResponseException, upstreamApi: UpstreamApi, - returnsEmpty: Boolean = false, + forbiddenAsError: Boolean = false, ): WebClientWrapperResponse.Error { val errorType = when (exception.statusCode) { HttpStatus.NOT_FOUND -> UpstreamApiError.Type.ENTITY_NOT_FOUND - HttpStatus.FORBIDDEN -> if (returnsEmpty) UpstreamApiError.Type.FORBIDDEN else throw exception + HttpStatus.FORBIDDEN -> if (forbiddenAsError) UpstreamApiError.Type.FORBIDDEN else throw exception else -> throw exception } return WebClientWrapperResponse.Error( diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/AssessRisksAndNeedsGateway.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/AssessRisksAndNeedsGateway.kt index a7eacbe81..fcd969bc3 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/AssessRisksAndNeedsGateway.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/AssessRisksAndNeedsGateway.kt @@ -31,7 +31,7 @@ class AssessRisksAndNeedsGateway( "/risks/crn/$id/predictors/all", authenticationHeader(), UpstreamApi.ASSESS_RISKS_AND_NEEDS, - returnsEmpty = true, + forbiddenAsError = true, ) return when (result) { diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskPredictorScoresForPersonServiceTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskPredictorScoresForPersonServiceTest.kt index 58d68a040..5b8454c6f 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskPredictorScoresForPersonServiceTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskPredictorScoresForPersonServiceTest.kt @@ -119,6 +119,8 @@ internal class GetRiskPredictorScoresForPersonServiceTest( it("records upstream 403 API error for probation offender search") { val response = getRiskPredictorScoresForPersonService.execute(hmppsId) + response.data.isEmpty() + response.errors.shouldHaveSize(1) response.hasErrorCausedBy(UpstreamApiError.Type.FORBIDDEN, UpstreamApi.ASSESS_RISKS_AND_NEEDS).shouldBe(true) } From 591dfde3192baad6af700b68eb2766fd4b43d402 Mon Sep 17 00:00:00 2001 From: Chiara Date: Fri, 14 Jun 2024 15:32:31 +0100 Subject: [PATCH 04/10] Forgot one --- .../hmpps/hmppsintegrationapi/extensions/WebClientWrapper.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/extensions/WebClientWrapper.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/extensions/WebClientWrapper.kt index 41fc766cd..3a582369a 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/extensions/WebClientWrapper.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/extensions/WebClientWrapper.kt @@ -38,7 +38,7 @@ class WebClientWrapper( headers: Map, upstreamApi: UpstreamApi, requestBody: Map? = null, - returnsEmpty: Boolean = false, + forbiddenAsError: Boolean = false, ): WebClientWrapperResponse { return try { val responseData = @@ -48,7 +48,7 @@ class WebClientWrapper( WebClientWrapperResponse.Success(responseData) } catch (exception: WebClientResponseException) { - getErrorType(exception, upstreamApi, returnsEmpty) + getErrorType(exception, upstreamApi, forbiddenAsError) } } From 759cfa1fbba03d9a08d4873ac0333b879ee8dd63 Mon Sep 17 00:00:00 2001 From: Chiara Date: Mon, 17 Jun 2024 10:43:43 +0100 Subject: [PATCH 05/10] Serious harm --- .../gateways/AssessRisksAndNeedsGateway.kt | 1 + .../services/GetRiskSeriousHarmForPersonService.kt | 4 ++++ .../GetRiskSeriousHarmForPersonServiceTest.kt | 11 ++++++++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/AssessRisksAndNeedsGateway.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/AssessRisksAndNeedsGateway.kt index fcd969bc3..b24dd2a8d 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/AssessRisksAndNeedsGateway.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/AssessRisksAndNeedsGateway.kt @@ -60,6 +60,7 @@ class AssessRisksAndNeedsGateway( "/risks/crn/$id", authenticationHeader(), UpstreamApi.ASSESS_RISKS_AND_NEEDS, + forbiddenAsError = true ) return when (result) { diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskSeriousHarmForPersonService.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskSeriousHarmForPersonService.kt index 005d712af..27a7609af 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskSeriousHarmForPersonService.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskSeriousHarmForPersonService.kt @@ -5,6 +5,7 @@ import org.springframework.stereotype.Service import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.AssessRisksAndNeedsGateway import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Risks +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError @Service class GetRiskSeriousHarmForPersonService( @@ -19,6 +20,9 @@ class GetRiskSeriousHarmForPersonService( if (deliusCrn != null) { personRisks = assessRisksAndNeedsGateway.getRiskSeriousHarmForPerson(id = deliusCrn) + if (personRisks.hasError(UpstreamApiError.Type.FORBIDDEN)) { + return Response(data = null, errors = personResponse.errors + personRisks.errors) + } } return Response( diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskSeriousHarmForPersonServiceTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskSeriousHarmForPersonServiceTest.kt index 3105112ca..868f4cefa 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskSeriousHarmForPersonServiceTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskSeriousHarmForPersonServiceTest.kt @@ -2,6 +2,7 @@ package uk.gov.justice.digital.hmpps.hmppsintegrationapi.services import io.kotest.core.spec.style.DescribeSpec import io.kotest.matchers.collections.shouldHaveSize +import io.kotest.matchers.nulls.shouldBeNull import io.kotest.matchers.shouldBe import org.mockito.Mockito import org.mockito.internal.verification.VerificationModeFactory @@ -90,12 +91,20 @@ GetRiskSeriousHarmForPersonServiceTest( ) } - it("records upstream API error for probation offender search") { + it("records upstream 404 API error for probation offender search") { val response = getRiskSeriousHarmForPersonService.execute(hmppsId) response.hasErrorCausedBy(UpstreamApiError.Type.ENTITY_NOT_FOUND, UpstreamApi.PROBATION_OFFENDER_SEARCH).shouldBe(true) } + it("records upstream 403 API error for probation offender search") { + val response = getRiskSeriousHarmForPersonService.execute(hmppsId) + + response.data.shouldBeNull() + response.errors.shouldHaveSize(1) + response.hasErrorCausedBy(UpstreamApiError.Type.FORBIDDEN, UpstreamApi.ASSESS_RISKS_AND_NEEDS).shouldBe(true) + } + it("does not get risks from ARN") { getRiskSeriousHarmForPersonService.execute(hmppsId) From 4427091a7d2e0498dfa8e2ad8fdd79e5eb2f3927 Mon Sep 17 00:00:00 2001 From: Chiara Date: Mon, 17 Jun 2024 11:40:18 +0100 Subject: [PATCH 06/10] Lint --- .../hmppsintegrationapi/gateways/AssessRisksAndNeedsGateway.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/AssessRisksAndNeedsGateway.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/AssessRisksAndNeedsGateway.kt index b24dd2a8d..a0647e106 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/AssessRisksAndNeedsGateway.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/AssessRisksAndNeedsGateway.kt @@ -60,7 +60,7 @@ class AssessRisksAndNeedsGateway( "/risks/crn/$id", authenticationHeader(), UpstreamApi.ASSESS_RISKS_AND_NEEDS, - forbiddenAsError = true + forbiddenAsError = true, ) return when (result) { From c7e81128c52c5c4319298f4aeafb881fb9e0c848 Mon Sep 17 00:00:00 2001 From: Chiara Date: Mon, 17 Jun 2024 11:47:18 +0100 Subject: [PATCH 07/10] Needs --- .../gateways/AssessRisksAndNeedsGateway.kt | 1 + .../services/GetNeedsForPersonService.kt | 4 ++++ .../services/GetNeedsForPersonServiceTest.kt | 8 +++++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/AssessRisksAndNeedsGateway.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/AssessRisksAndNeedsGateway.kt index a0647e106..f566bf665 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/AssessRisksAndNeedsGateway.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/AssessRisksAndNeedsGateway.kt @@ -84,6 +84,7 @@ class AssessRisksAndNeedsGateway( "/needs/crn/$id", authenticationHeader(), UpstreamApi.ASSESS_RISKS_AND_NEEDS, + forbiddenAsError = true, ) return when (result) { diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetNeedsForPersonService.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetNeedsForPersonService.kt index 7e562cffc..db0179025 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetNeedsForPersonService.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetNeedsForPersonService.kt @@ -5,6 +5,7 @@ import org.springframework.stereotype.Service import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.AssessRisksAndNeedsGateway import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Needs import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError @Service class GetNeedsForPersonService( @@ -19,6 +20,9 @@ class GetNeedsForPersonService( if (deliusCrn != null) { personNeeds = assessRisksAndNeedsGateway.getNeedsForPerson(id = deliusCrn) + if (personNeeds.hasError(UpstreamApiError.Type.FORBIDDEN)) { + return Response(data = null, errors = personResponse.errors + personNeeds.errors) + } } return Response( diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetNeedsForPersonServiceTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetNeedsForPersonServiceTest.kt index be6194c10..eaae73484 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetNeedsForPersonServiceTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetNeedsForPersonServiceTest.kt @@ -110,12 +110,18 @@ internal class GetNeedsForPersonServiceTest( ) } - it("records upstream API error for probation offender search") { + it("records upstream 404 API error for probation offender search") { val response = getNeedsForPersonService.execute(hmppsId) response.hasErrorCausedBy(UpstreamApiError.Type.ENTITY_NOT_FOUND, UpstreamApi.PROBATION_OFFENDER_SEARCH).shouldBe(true) } + it("records upstream 403 API error for probation offender search") { + val response = getNeedsForPersonService.execute(hmppsId) + + response.hasErrorCausedBy(UpstreamApiError.Type.FORBIDDEN, UpstreamApi.ASSESS_RISKS_AND_NEEDS).shouldBe(true) + } + it("does not get needs from ARN") { getNeedsForPersonService.execute(hmppsId) From 633a139b64042d87ac695dda6fddb4508f974882 Mon Sep 17 00:00:00 2001 From: Chiara Date: Mon, 17 Jun 2024 13:32:47 +0100 Subject: [PATCH 08/10] Open api --- openapi.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openapi.yml b/openapi.yml index 9351725e3..f96d9a5b1 100644 --- a/openapi.yml +++ b/openapi.yml @@ -497,7 +497,7 @@ paths: get: tags: - risks - summary: Returns risk scores from the last year associated with a person, sorted by completedDate (newest first). + summary: Returns risk scores from the last year associated with a person, sorted by completedDate (newest first). This endpoint does not serve LAO (Limited Access Offender) data. parameters: - $ref: "#/components/parameters/hmppsId" - $ref: "#/components/parameters/page" @@ -649,7 +649,7 @@ paths: tags: - needs summary: > - Returns criminogenic needs associated with a person. + Returns criminogenic needs associated with a person. This endpoint does not serve LAO (Limited Access Offender) data. Note: Criminogenic needs are dynamic factors that are directly linked to criminal behaviour. Eight criminogenic needs are measured in OASys: Accommodation, Employability, Relationships, Lifestyle and Associates, Drug Misuse, Alcohol Misuse, Thinking & Behaviour and Attitudes. These are scored according to whether there is “no need”, “some need” or “severe need”, and a need is identified in a specific section based on calculations around these scores. However, the process by which needs are assessed is changing as early as next year (2024), specifically moving to a strength-based model that seeks to identify and develop the strengths of people with convictions. As a consequence of this, the information provided by this endpoint will also change. @@ -688,7 +688,7 @@ paths: get: tags: - risks - summary: Returns Risk of Serious Harm (ROSH) risks associated with a person. Returns only assessments completed in the last year. + summary: Returns Risk of Serious Harm (ROSH) risks associated with a person. Returns only assessments completed in the last year. This endpoint does not serve LAO (Limited Access Offender) data. parameters: - $ref: "#/components/parameters/hmppsId" responses: From 368b12e051804d2f0cd0bd78564fdedfaba019d0 Mon Sep 17 00:00:00 2001 From: Chiara Date: Mon, 17 Jun 2024 14:57:14 +0100 Subject: [PATCH 09/10] Removing redundant checks --- .../hmppsintegrationapi/services/GetNeedsForPersonService.kt | 3 --- .../services/GetRiskPredictorScoresForPersonService.kt | 4 ---- .../services/GetRiskSeriousHarmForPersonService.kt | 4 ---- 3 files changed, 11 deletions(-) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetNeedsForPersonService.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetNeedsForPersonService.kt index db0179025..19ad0c16f 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetNeedsForPersonService.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetNeedsForPersonService.kt @@ -20,9 +20,6 @@ class GetNeedsForPersonService( if (deliusCrn != null) { personNeeds = assessRisksAndNeedsGateway.getNeedsForPerson(id = deliusCrn) - if (personNeeds.hasError(UpstreamApiError.Type.FORBIDDEN)) { - return Response(data = null, errors = personResponse.errors + personNeeds.errors) - } } return Response( diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskPredictorScoresForPersonService.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskPredictorScoresForPersonService.kt index d609d4c4b..7b7001020 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskPredictorScoresForPersonService.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskPredictorScoresForPersonService.kt @@ -5,7 +5,6 @@ import org.springframework.stereotype.Service import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.AssessRisksAndNeedsGateway import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.RiskPredictorScore -import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError @Service class GetRiskPredictorScoresForPersonService( @@ -20,9 +19,6 @@ class GetRiskPredictorScoresForPersonService( if (deliusCrn != null) { personRiskPredictorScores = assessRisksAndNeedsGateway.getRiskPredictorScoresForPerson(id = deliusCrn) - if (personRiskPredictorScores.hasError(UpstreamApiError.Type.FORBIDDEN)) { - return Response(data = emptyList(), errors = personResponse.errors + personRiskPredictorScores.errors) - } } return Response( diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskSeriousHarmForPersonService.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskSeriousHarmForPersonService.kt index 27a7609af..005d712af 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskSeriousHarmForPersonService.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskSeriousHarmForPersonService.kt @@ -5,7 +5,6 @@ import org.springframework.stereotype.Service import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.AssessRisksAndNeedsGateway import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Risks -import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError @Service class GetRiskSeriousHarmForPersonService( @@ -20,9 +19,6 @@ class GetRiskSeriousHarmForPersonService( if (deliusCrn != null) { personRisks = assessRisksAndNeedsGateway.getRiskSeriousHarmForPerson(id = deliusCrn) - if (personRisks.hasError(UpstreamApiError.Type.FORBIDDEN)) { - return Response(data = null, errors = personResponse.errors + personRisks.errors) - } } return Response( From b50cd5880dca3bfbc2b896fe8bd6391c1130a4c6 Mon Sep 17 00:00:00 2001 From: Chiara Date: Mon, 17 Jun 2024 14:59:47 +0100 Subject: [PATCH 10/10] bloody lint again --- .../hmppsintegrationapi/services/GetNeedsForPersonService.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetNeedsForPersonService.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetNeedsForPersonService.kt index 19ad0c16f..7e562cffc 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetNeedsForPersonService.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetNeedsForPersonService.kt @@ -5,7 +5,6 @@ import org.springframework.stereotype.Service import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.AssessRisksAndNeedsGateway import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Needs import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response -import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError @Service class GetNeedsForPersonService(