Skip to content

Commit 0595f61

Browse files
author
Bingjie Liu
committed
Implement ConfigController to return authorisation list
1 parent 11e7a1f commit 0595f61

File tree

12 files changed

+147
-6
lines changed

12 files changed

+147
-6
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package uk.gov.justice.digital.hmpps.hmppsintegrationapi.config
2+
3+
import org.springframework.boot.context.properties.ConfigurationProperties
4+
import org.springframework.context.annotation.Configuration
5+
import org.springframework.stereotype.Component
6+
7+
@Configuration
8+
@Component
9+
@ConfigurationProperties(prefix = "authorisation")
10+
class AuthorisationConfig {
11+
var consumers: Map<String, List<String>> = emptyMap()
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package uk.gov.justice.digital.hmpps.hmppsintegrationapi.controllers.v1
2+
3+
import org.springframework.boot.context.properties.EnableConfigurationProperties
4+
import org.springframework.web.bind.annotation.GetMapping
5+
import org.springframework.web.bind.annotation.RequestMapping
6+
import org.springframework.web.bind.annotation.RestController
7+
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.config.AuthorisationConfig
8+
9+
@RestController
10+
@EnableConfigurationProperties(AuthorisationConfig::class)
11+
@RequestMapping("/v1/config")
12+
class ConfigController(
13+
var authorisationConfig: AuthorisationConfig,
14+
) {
15+
@GetMapping("authorisation")
16+
fun getImage(): Map<String, List<String>> {
17+
return authorisationConfig.consumers
18+
}
19+
}

src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/extensions/AuthorisationFilter.kt

+7-4
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,20 @@ import jakarta.servlet.ServletRequest
77
import jakarta.servlet.ServletResponse
88
import jakarta.servlet.http.HttpServletRequest
99
import jakarta.servlet.http.HttpServletResponse
10-
import org.springframework.boot.context.properties.ConfigurationProperties
10+
import org.springframework.beans.factory.annotation.Autowired
11+
import org.springframework.boot.context.properties.EnableConfigurationProperties
1112
import org.springframework.core.annotation.Order
1213
import org.springframework.stereotype.Component
14+
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.config.AuthorisationConfig
1315
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.services.internal.AuthoriseConsumerService
1416
import java.io.IOException
1517

1618
@Component
1719
@Order(1)
18-
@ConfigurationProperties(prefix = "authorisation")
20+
@EnableConfigurationProperties(AuthorisationConfig::class)
1921
class AuthorisationFilter : Filter {
20-
var consumers: Map<String, List<String>> = emptyMap()
22+
@Autowired
23+
lateinit var authorisationConfig: AuthorisationConfig
2124

2225
@Throws(IOException::class, ServletException::class)
2326
override fun doFilter(
@@ -36,7 +39,7 @@ class AuthorisationFilter : Filter {
3639
return
3740
}
3841

39-
val result = authoriseConsumerService.execute(subjectDistinguishedName, consumers, requestedPath)
42+
val result = authoriseConsumerService.execute(subjectDistinguishedName, authorisationConfig.consumers, requestedPath)
4043

4144
if (!result) {
4245
res.sendError(HttpServletResponse.SC_FORBIDDEN, "Unable to authorise $requestedPath for $subjectDistinguishedName")

src/main/resources/application-dev.yml

+2
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,5 @@ authorisation:
6363
- "/v1/persons/.*/risks"
6464
- "/v1/persons/.*/licences/conditions"
6565
- "/v1/persons/.*/person-responsible-officer"
66+
event-service:
67+
- "/v1/config/authorisation"

src/main/resources/application-local.yml

+2
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,5 @@ authorisation:
5353
- "/health/readiness"
5454
- "/health/liveness"
5555
- "/info"
56+
config-test:
57+
- "/v1/config/authorisation"

src/main/resources/application-preprod.yml

+2
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,5 @@ authorisation:
3333
kubernetes-health-check-client:
3434
- "/health/liveness"
3535
- "/health/readiness"
36+
event-service:
37+
- "/v1/config/authorisation"

src/main/resources/application-prod.yml

+2
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,5 @@ authorisation:
3131
kubernetes-health-check-client:
3232
- "/health/liveness"
3333
- "/health/readiness"
34+
event-service:
35+
- "/v1/config/authorisation"

src/main/resources/application-test.yml

+3
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,6 @@ authorisation:
6363
- "/health/readiness"
6464
- "/health/liveness"
6565
- "/info"
66+
config-test:
67+
- "/v1/config/authorisation"
68+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package uk.gov.justice.digital.hmpps.hmppsintegrationapi.controllers.v1
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper
4+
import com.fasterxml.jackson.module.kotlin.readValue
5+
import io.kotest.matchers.collections.shouldContainOnly
6+
import io.kotest.matchers.maps.shouldHaveKeys
7+
import org.junit.jupiter.api.Test
8+
import org.springframework.beans.factory.annotation.Autowired
9+
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest
10+
import org.springframework.test.context.ActiveProfiles
11+
import org.springframework.test.web.servlet.MockMvc
12+
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.helpers.IntegrationAPIMockMvc
13+
14+
@WebMvcTest(controllers = [ConfigController::class])
15+
@ActiveProfiles("test")
16+
class ConfigControllerTests(
17+
@Autowired var springMockMvc: MockMvc,
18+
) {
19+
private val basePath = "/v1/config/authorisation"
20+
private val mockMvc = IntegrationAPIMockMvc(springMockMvc)
21+
private val objectMapper = ObjectMapper()
22+
23+
@Test
24+
fun `will return authorise config based on application yml`() {
25+
val result = mockMvc.performAuthorisedWithCN(basePath, "config-test")
26+
27+
val actualConfig: Map<String, List<String>> = objectMapper.readValue(result.response.contentAsString)
28+
actualConfig.shouldHaveKeys("automated-test-client")
29+
actualConfig.shouldHaveKeys("config-test")
30+
actualConfig["config-test"].shouldContainOnly("/v1/config/authorisation")
31+
}
32+
}

src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/helpers/IntegrationAPIHttpClient.kt

+5-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@ class IntegrationAPIHttpClient(
99
val httpClient: HttpClient = HttpClient.newBuilder().build(),
1010
val baseUrl: String = "http://localhost:8080",
1111
) {
12-
fun performAuthorised(path: String): HttpResponse<String> {
13-
val subjectDistinguishedName = "C=GB,ST=London,L=London,O=Home Office,CN=automated-test-client"
12+
fun performAuthorised(
13+
path: String,
14+
cn: String = "automated-test-client",
15+
): HttpResponse<String> {
16+
val subjectDistinguishedName = "C=GB,ST=London,L=London,O=Home Office,CN=$cn"
1417

1518
val httpRequest =
1619
HttpRequest

src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/helpers/IntegrationAPIMockMvc.kt

+8
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,14 @@ class IntegrationAPIMockMvc(
1515
return mockMvc.perform(MockMvcRequestBuilders.get(path).header("subject-distinguished-name", subjectDistinguishedName)).andReturn()
1616
}
1717

18+
fun performAuthorisedWithCN(
19+
path: String,
20+
cn: String,
21+
): MvcResult {
22+
val subjectDistinguishedName = "C=GB,ST=London,L=London,O=Home Office,CN=$cn"
23+
return mockMvc.perform(MockMvcRequestBuilders.get(path).header("subject-distinguished-name", subjectDistinguishedName)).andReturn()
24+
}
25+
1826
fun performUnAuthorised(path: String): MvcResult {
1927
return mockMvc.perform(MockMvcRequestBuilders.get(path)).andReturn()
2028
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package uk.gov.justice.digital.hmpps.hmppsintegrationapi.smoke
2+
3+
import io.kotest.assertions.json.shouldEqualJson
4+
import io.kotest.core.spec.style.DescribeSpec
5+
import io.kotest.matchers.shouldBe
6+
import org.springframework.http.HttpStatus
7+
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.extensions.removeWhitespaceAndNewlines
8+
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.helpers.IntegrationAPIHttpClient
9+
10+
class AuthoriseConfigTest : DescribeSpec(
11+
{
12+
val httpClient = IntegrationAPIHttpClient()
13+
14+
it("returns authorise config") {
15+
16+
val response = httpClient.performAuthorised("v1/config/authorisation", "config-test")
17+
18+
response.statusCode().shouldBe(HttpStatus.OK.value())
19+
response.body().shouldEqualJson(
20+
"""
21+
{
22+
"automated-test-client": [
23+
"/v1/persons",
24+
"/v1/persons/.*",
25+
"/v1/persons/.*/images",
26+
"/v1/images/.*",
27+
"/v1/persons/.*/addresses",
28+
"/v1/persons/.*/offences",
29+
"/v1/persons/.*/alerts",
30+
"/v1/persons/.*/sentences",
31+
"/v1/persons/.*/sentences/latest-key-dates-and-adjustments",
32+
"/v1/persons/.*/risks/scores",
33+
"/v1/persons/.*/needs",
34+
"/v1/persons/.*/risks",
35+
"/v1/persons/.*/reported-adjudications",
36+
"/v1/persons/.*/case-notes",
37+
"/v1/persons/.*/person-responsible-officer",
38+
"/v1/epf/person-details/.*/.*",
39+
"/health",
40+
"/health/ping",
41+
"/health/readiness",
42+
"/health/liveness",
43+
"/info"
44+
],
45+
"config-test": [
46+
"/v1/config/authorisation"
47+
]
48+
}
49+
""".removeWhitespaceAndNewlines(),
50+
)
51+
}
52+
},
53+
)

0 commit comments

Comments
 (0)