From 0595f616970465e219bcc6b19c47ae4d0ed23e27 Mon Sep 17 00:00:00 2001 From: Bingjie Liu Date: Tue, 23 Apr 2024 10:28:38 +0100 Subject: [PATCH 1/5] Implement ConfigController to return authorisation list --- .../config/AuthorisationConfig.kt | 12 +++++ .../controllers/v1/ConfigController.kt | 19 +++++++ .../extensions/AuthorisationFilter.kt | 11 ++-- src/main/resources/application-dev.yml | 2 + src/main/resources/application-local.yml | 2 + src/main/resources/application-preprod.yml | 2 + src/main/resources/application-prod.yml | 2 + src/main/resources/application-test.yml | 3 ++ .../controllers/v1/ConfigControllerTests.kt | 32 +++++++++++ .../helpers/IntegrationAPIHttpClient.kt | 7 ++- .../helpers/IntegrationAPIMockMvc.kt | 8 +++ .../smoke/AuthoriseConfigTest.kt | 53 +++++++++++++++++++ 12 files changed, 147 insertions(+), 6 deletions(-) create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/config/AuthorisationConfig.kt create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/ConfigController.kt create mode 100644 src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/ConfigControllerTests.kt create mode 100644 src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/AuthoriseConfigTest.kt diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/config/AuthorisationConfig.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/config/AuthorisationConfig.kt new file mode 100644 index 000000000..a47ac75b3 --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/config/AuthorisationConfig.kt @@ -0,0 +1,12 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.config + +import org.springframework.boot.context.properties.ConfigurationProperties +import org.springframework.context.annotation.Configuration +import org.springframework.stereotype.Component + +@Configuration +@Component +@ConfigurationProperties(prefix = "authorisation") +class AuthorisationConfig { + var consumers: Map> = emptyMap() +} diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/ConfigController.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/ConfigController.kt new file mode 100644 index 000000000..d1ba61ee3 --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/ConfigController.kt @@ -0,0 +1,19 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.controllers.v1 + +import org.springframework.boot.context.properties.EnableConfigurationProperties +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.config.AuthorisationConfig + +@RestController +@EnableConfigurationProperties(AuthorisationConfig::class) +@RequestMapping("/v1/config") +class ConfigController( + var authorisationConfig: AuthorisationConfig, +) { + @GetMapping("authorisation") + fun getImage(): Map> { + return authorisationConfig.consumers + } +} diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/extensions/AuthorisationFilter.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/extensions/AuthorisationFilter.kt index bd4e86181..8e0b9b959 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/extensions/AuthorisationFilter.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/extensions/AuthorisationFilter.kt @@ -7,17 +7,20 @@ import jakarta.servlet.ServletRequest import jakarta.servlet.ServletResponse import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletResponse -import org.springframework.boot.context.properties.ConfigurationProperties +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.core.annotation.Order import org.springframework.stereotype.Component +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.config.AuthorisationConfig import uk.gov.justice.digital.hmpps.hmppsintegrationapi.services.internal.AuthoriseConsumerService import java.io.IOException @Component @Order(1) -@ConfigurationProperties(prefix = "authorisation") +@EnableConfigurationProperties(AuthorisationConfig::class) class AuthorisationFilter : Filter { - var consumers: Map> = emptyMap() + @Autowired + lateinit var authorisationConfig: AuthorisationConfig @Throws(IOException::class, ServletException::class) override fun doFilter( @@ -36,7 +39,7 @@ class AuthorisationFilter : Filter { return } - val result = authoriseConsumerService.execute(subjectDistinguishedName, consumers, requestedPath) + val result = authoriseConsumerService.execute(subjectDistinguishedName, authorisationConfig.consumers, requestedPath) if (!result) { res.sendError(HttpServletResponse.SC_FORBIDDEN, "Unable to authorise $requestedPath for $subjectDistinguishedName") diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index a46848f0c..c5353ba0e 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -63,3 +63,5 @@ authorisation: - "/v1/persons/.*/risks" - "/v1/persons/.*/licences/conditions" - "/v1/persons/.*/person-responsible-officer" + event-service: + - "/v1/config/authorisation" diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index 3dec6146d..a5dc27571 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -53,3 +53,5 @@ authorisation: - "/health/readiness" - "/health/liveness" - "/info" + config-test: + - "/v1/config/authorisation" diff --git a/src/main/resources/application-preprod.yml b/src/main/resources/application-preprod.yml index 44db9a64e..3ff2d3df0 100644 --- a/src/main/resources/application-preprod.yml +++ b/src/main/resources/application-preprod.yml @@ -33,3 +33,5 @@ authorisation: kubernetes-health-check-client: - "/health/liveness" - "/health/readiness" + event-service: + - "/v1/config/authorisation" diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 5cad6f114..df894a6d3 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -31,3 +31,5 @@ authorisation: kubernetes-health-check-client: - "/health/liveness" - "/health/readiness" + event-service: + - "/v1/config/authorisation" diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index 7b8828032..43e94378b 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -63,3 +63,6 @@ authorisation: - "/health/readiness" - "/health/liveness" - "/info" + config-test: + - "/v1/config/authorisation" + diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/ConfigControllerTests.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/ConfigControllerTests.kt new file mode 100644 index 000000000..ba56126ad --- /dev/null +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/ConfigControllerTests.kt @@ -0,0 +1,32 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.controllers.v1 + +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.module.kotlin.readValue +import io.kotest.matchers.collections.shouldContainOnly +import io.kotest.matchers.maps.shouldHaveKeys +import org.junit.jupiter.api.Test +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest +import org.springframework.test.context.ActiveProfiles +import org.springframework.test.web.servlet.MockMvc +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.helpers.IntegrationAPIMockMvc + +@WebMvcTest(controllers = [ConfigController::class]) +@ActiveProfiles("test") +class ConfigControllerTests( + @Autowired var springMockMvc: MockMvc, +) { + private val basePath = "/v1/config/authorisation" + private val mockMvc = IntegrationAPIMockMvc(springMockMvc) + private val objectMapper = ObjectMapper() + + @Test + fun `will return authorise config based on application yml`() { + val result = mockMvc.performAuthorisedWithCN(basePath, "config-test") + + val actualConfig: Map> = objectMapper.readValue(result.response.contentAsString) + actualConfig.shouldHaveKeys("automated-test-client") + actualConfig.shouldHaveKeys("config-test") + actualConfig["config-test"].shouldContainOnly("/v1/config/authorisation") + } +} diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/helpers/IntegrationAPIHttpClient.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/helpers/IntegrationAPIHttpClient.kt index 28e33bf6d..72deebfce 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/helpers/IntegrationAPIHttpClient.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/helpers/IntegrationAPIHttpClient.kt @@ -9,8 +9,11 @@ class IntegrationAPIHttpClient( val httpClient: HttpClient = HttpClient.newBuilder().build(), val baseUrl: String = "http://localhost:8080", ) { - fun performAuthorised(path: String): HttpResponse { - val subjectDistinguishedName = "C=GB,ST=London,L=London,O=Home Office,CN=automated-test-client" + fun performAuthorised( + path: String, + cn: String = "automated-test-client", + ): HttpResponse { + val subjectDistinguishedName = "C=GB,ST=London,L=London,O=Home Office,CN=$cn" val httpRequest = HttpRequest diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/helpers/IntegrationAPIMockMvc.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/helpers/IntegrationAPIMockMvc.kt index 2f3abfaff..361cdbf1c 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/helpers/IntegrationAPIMockMvc.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/helpers/IntegrationAPIMockMvc.kt @@ -15,6 +15,14 @@ class IntegrationAPIMockMvc( return mockMvc.perform(MockMvcRequestBuilders.get(path).header("subject-distinguished-name", subjectDistinguishedName)).andReturn() } + fun performAuthorisedWithCN( + path: String, + cn: String, + ): MvcResult { + val subjectDistinguishedName = "C=GB,ST=London,L=London,O=Home Office,CN=$cn" + return mockMvc.perform(MockMvcRequestBuilders.get(path).header("subject-distinguished-name", subjectDistinguishedName)).andReturn() + } + fun performUnAuthorised(path: String): MvcResult { return mockMvc.perform(MockMvcRequestBuilders.get(path)).andReturn() } diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/AuthoriseConfigTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/AuthoriseConfigTest.kt new file mode 100644 index 000000000..a81a3c6ee --- /dev/null +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/AuthoriseConfigTest.kt @@ -0,0 +1,53 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.smoke + +import io.kotest.assertions.json.shouldEqualJson +import io.kotest.core.spec.style.DescribeSpec +import io.kotest.matchers.shouldBe +import org.springframework.http.HttpStatus +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.extensions.removeWhitespaceAndNewlines +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.helpers.IntegrationAPIHttpClient + +class AuthoriseConfigTest : DescribeSpec( + { + val httpClient = IntegrationAPIHttpClient() + + it("returns authorise config") { + + val response = httpClient.performAuthorised("v1/config/authorisation", "config-test") + + response.statusCode().shouldBe(HttpStatus.OK.value()) + response.body().shouldEqualJson( + """ + { + "automated-test-client": [ + "/v1/persons", + "/v1/persons/.*", + "/v1/persons/.*/images", + "/v1/images/.*", + "/v1/persons/.*/addresses", + "/v1/persons/.*/offences", + "/v1/persons/.*/alerts", + "/v1/persons/.*/sentences", + "/v1/persons/.*/sentences/latest-key-dates-and-adjustments", + "/v1/persons/.*/risks/scores", + "/v1/persons/.*/needs", + "/v1/persons/.*/risks", + "/v1/persons/.*/reported-adjudications", + "/v1/persons/.*/case-notes", + "/v1/persons/.*/person-responsible-officer", + "/v1/epf/person-details/.*/.*", + "/health", + "/health/ping", + "/health/readiness", + "/health/liveness", + "/info" + ], + "config-test": [ + "/v1/config/authorisation" + ] + } + """.removeWhitespaceAndNewlines(), + ) + } + }, +) From e24b68e55c2b3c59b218173792a34243469a463c Mon Sep 17 00:00:00 2001 From: Bingjie Liu Date: Tue, 23 Apr 2024 10:37:55 +0100 Subject: [PATCH 2/5] fix smoke test --- src/main/resources/application-local-docker.yml | 2 ++ .../smoke/EPFPersonDetailSmokeTest.kt | 13 +++++-------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/resources/application-local-docker.yml b/src/main/resources/application-local-docker.yml index bb3f2fd10..40e65bf71 100644 --- a/src/main/resources/application-local-docker.yml +++ b/src/main/resources/application-local-docker.yml @@ -46,6 +46,8 @@ authorisation: - "/health/readiness" - "/health/liveness" - "/info" + config-test: + - "/v1/config/authorisation" hmpps.sqs: provider: localstack diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/EPFPersonDetailSmokeTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/EPFPersonDetailSmokeTest.kt index b2cf06e16..fd2c39ddc 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/EPFPersonDetailSmokeTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/EPFPersonDetailSmokeTest.kt @@ -22,21 +22,20 @@ class EPFPersonDetailSmokeTest : DescribeSpec( response.body().shouldEqualJson( """ { - "data": { "nomsId": "string", "name": { "forename": "string", "middleName": "string", "surname": "string" }, - "dateOfBirth":"2019-08-24", + "dateOfBirth": "2019-08-24", "gender": "string", "sentence": { - "date": "2019-08-24", + "date": null, "sentencingCourt": { - "name": "string" + "name": null }, - "releaseDate":"2019-08-24" + "releaseDate": null }, "responsibleProvider": { "code": "string", @@ -45,9 +44,7 @@ class EPFPersonDetailSmokeTest : DescribeSpec( "ogrsScore": -9007199254740991, "age": -9007199254740991, "ageAtRelease": -9007199254740991 - }, - "errors": [] - } + } """.removeWhitespaceAndNewlines(), ) } From 6f17fea90e3a175d3de8786ecacba067e32f3974 Mon Sep 17 00:00:00 2001 From: Bingjie Liu Date: Tue, 23 Apr 2024 10:57:49 +0100 Subject: [PATCH 3/5] fix smoke test --- .../hmppsintegrationapi/smoke/EPFPersonDetailSmokeTest.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/EPFPersonDetailSmokeTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/EPFPersonDetailSmokeTest.kt index fd2c39ddc..66e4af67e 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/EPFPersonDetailSmokeTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/EPFPersonDetailSmokeTest.kt @@ -22,6 +22,7 @@ class EPFPersonDetailSmokeTest : DescribeSpec( response.body().shouldEqualJson( """ { + "data": { "nomsId": "string", "name": { "forename": "string", @@ -44,7 +45,9 @@ class EPFPersonDetailSmokeTest : DescribeSpec( "ogrsScore": -9007199254740991, "age": -9007199254740991, "ageAtRelease": -9007199254740991 - } + }, + "errors": [] + } """.removeWhitespaceAndNewlines(), ) } From 3238405634563c64076b2d85c03b5924c519781b Mon Sep 17 00:00:00 2001 From: Bingjie Liu Date: Tue, 23 Apr 2024 11:00:57 +0100 Subject: [PATCH 4/5] fix config --- src/main/resources/application-local-docker.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application-local-docker.yml b/src/main/resources/application-local-docker.yml index 40e65bf71..7ecce00f2 100644 --- a/src/main/resources/application-local-docker.yml +++ b/src/main/resources/application-local-docker.yml @@ -46,8 +46,8 @@ authorisation: - "/health/readiness" - "/health/liveness" - "/info" - config-test: - - "/v1/config/authorisation" + config-test: + - "/v1/config/authorisation" hmpps.sqs: provider: localstack From d39d315f7748241a3ba7931539afa0fff91ec596 Mon Sep 17 00:00:00 2001 From: Bingjie Liu Date: Tue, 23 Apr 2024 11:31:18 +0100 Subject: [PATCH 5/5] update documentation for prisonOffenderOfficer --- openapi.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openapi.yml b/openapi.yml index a9ccb6fb3..6955da50e 100644 --- a/openapi.yml +++ b/openapi.yml @@ -1842,8 +1842,8 @@ components: PersonResponsibleOfficer: type: object properties: - prisonOffenderOfficer: - $ref: "#/components/schemas/PrisonOffenderOfficer" + prisonOffenderManager: + $ref: "#/components/schemas/PrisonOffenderManager" communityOffenderManager: $ref: "#/components/schemas/CommunityOffenderManager" PersonLicencesData: @@ -1923,7 +1923,7 @@ components: code: type: string nullable: true - PrisonOffenderOfficer: + PrisonOffenderManager: type: object properties: forename: