Skip to content

Commit db540e9

Browse files
committed
Legger til støtte for språk.
1 parent a758650 commit db540e9

File tree

9 files changed

+110
-36
lines changed

9 files changed

+110
-36
lines changed

src/main/kotlin/no/nav/tms/varsel/api/config.kt

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,3 @@ object HttpClientBuilder {
3232
}
3333
}
3434
}
35-
36-
suspend inline fun <reified T> HttpClient.get(url: String, accessToken: String): T = withContext(Dispatchers.IO) {
37-
request {
38-
url(url)
39-
method = HttpMethod.Get
40-
header(HttpHeaders.Authorization, "Bearer $accessToken")
41-
}.body()
42-
}

src/main/kotlin/no/nav/tms/varsel/api/varsel/AktivteVarsler.kt renamed to src/main/kotlin/no/nav/tms/varsel/api/varsel/AktiveVarsler.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ data class AktivtVarsel(
1414
@Deprecated("Use tidspunkt") val forstBehandlet: ZonedDateTime,
1515
val tidspunkt: ZonedDateTime,
1616
val isMasked: Boolean,
17+
val spraakkode: String?,
1718
val tekst: String?,
1819
val link: String?,
1920
val eksternVarslingSendt: Boolean,
@@ -26,6 +27,7 @@ data class AktivtVarsel(
2627
forstBehandlet = varsel.opprettet,
2728
tidspunkt = varsel.opprettet,
2829
isMasked = varsel.innhold == null,
30+
spraakkode = varsel.innhold?.spraakkode,
2931
tekst = varsel.innhold?.tekst,
3032
link = varsel.innhold?.link,
3133
eksternVarslingSendt = varsel.eksternVarslingSendt,

src/main/kotlin/no/nav/tms/varsel/api/varsel/VarselConsumer.kt

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,13 @@
33
package no.nav.tms.varsel.api.varsel
44

55
import io.ktor.client.HttpClient
6-
import io.ktor.client.request.header
7-
import io.ktor.client.request.post
8-
import io.ktor.client.request.setBody
9-
import io.ktor.http.ContentType
10-
import io.ktor.http.HttpHeaders
6+
import io.ktor.client.call.*
7+
import io.ktor.client.request.*
8+
import io.ktor.http.*
119
import kotlinx.serialization.Serializable
1210
import kotlinx.serialization.UseSerializers
1311
import no.nav.tms.token.support.tokendings.exchange.TokendingsService
1412
import no.nav.tms.varsel.api.ZonedDateTimeSerializer
15-
import no.nav.tms.varsel.api.get
1613
import java.time.ZonedDateTime
1714

1815
class VarselConsumer(
@@ -21,18 +18,18 @@ class VarselConsumer(
2118
private val varselAuthorityClientId: String,
2219
private val tokendingsService: TokendingsService
2320
) {
24-
suspend fun getAktiveVarsler(userToken: String): AktiveVarsler {
25-
return getVarsler(userToken, "/varsel/sammendrag/aktive")
21+
suspend fun getAktiveVarsler(userToken: String, preferertSpraak: String?): AktiveVarsler {
22+
return getVarsler(userToken, "/varsel/sammendrag/aktive", preferertSpraak = preferertSpraak)
2623
.let (AktiveVarsler::fromVarsler)
2724
}
2825

29-
suspend fun getInaktiveVarsler(userToken: String): List<InaktivtVarsel> {
30-
return getVarsler( userToken,"/varsel/sammendrag/inaktive")
26+
suspend fun getInaktiveVarsler(userToken: String, preferertSpraak: String?): List<InaktivtVarsel> {
27+
return getVarsler(userToken,"/varsel/sammendrag/inaktive", preferertSpraak = preferertSpraak)
3128
.map(InaktivtVarsel::fromVarsel)
3229
}
3330

34-
suspend fun getVarselbjelleVarsler(userToken: String): VarselbjelleVarsler {
35-
return getVarsler(userToken, "/varsel/sammendrag/aktive")
31+
suspend fun getVarselbjelleVarsler(userToken: String, preferertSpraak: String?): VarselbjelleVarsler {
32+
return getVarsler(userToken, "/varsel/sammendrag/aktive", preferertSpraak = preferertSpraak)
3633
.let(VarselbjelleVarsler::fromVarsler)
3734
}
3835

@@ -46,9 +43,16 @@ class VarselConsumer(
4643
}
4744
}
4845

49-
private suspend fun getVarsler(userToken: String, path: String): List<Varsel> {
46+
private suspend fun getVarsler(userToken: String, path: String, preferertSpraak: String? = null): List<Varsel> {
5047
val authorityToken = tokendingsService.exchangeToken(userToken, targetApp = varselAuthorityClientId)
51-
return client.get("$varselAuthorityUrl$path", authorityToken)
48+
49+
return client.request {
50+
url("$varselAuthorityUrl$path")
51+
method = HttpMethod.Get
52+
header(HttpHeaders.Authorization, "Bearer $authorityToken")
53+
54+
preferertSpraak?.let { parameter("preferert_spraak", it) }
55+
}.body()
5256
}
5357
}
5458

@@ -67,6 +71,7 @@ data class Varsel(
6771

6872
@Serializable
6973
data class VarselInnhold(
74+
val spraakkode: String,
7075
val tekst: String,
7176
val link: String?
7277
)

src/main/kotlin/no/nav/tms/varsel/api/varsel/VarselbjelleVarsler.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ data class VarselbjelleVarsel(
3333
val varselId: String,
3434
val tidspunkt: ZonedDateTime,
3535
val isMasked: Boolean,
36+
val spraakkode: String?,
3637
val tekst: String?,
3738
val link: String?,
3839
val type: String,
@@ -46,6 +47,7 @@ data class VarselbjelleVarsel(
4647
varselId = varselId,
4748
tidspunkt = opprettet,
4849
isMasked = innhold == null,
50+
spraakkode = innhold?.spraakkode,
4951
tekst = innhold?.tekst,
5052
link = innhold?.link,
5153
type = type.name,

src/main/kotlin/no/nav/tms/varsel/api/varsel/varselRoutes.kt

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package no.nav.tms.varsel.api.varsel
33
import io.ktor.http.HttpStatusCode
44
import io.ktor.server.application.ApplicationCall
55
import io.ktor.server.application.call
6-
import io.ktor.server.request.receive
6+
import io.ktor.server.request.*
77
import io.ktor.server.response.respond
88
import io.ktor.server.routing.Route
99
import io.ktor.server.routing.get
@@ -17,27 +17,36 @@ fun Route.varsel(
1717
varselConsumer: VarselConsumer
1818
) {
1919
get("inaktive") {
20-
val inaktiveVarsler = varselConsumer.getInaktiveVarsler(call.userToken)
21-
22-
call.respond(HttpStatusCode.OK, inaktiveVarsler)
20+
varselConsumer.getInaktiveVarsler(
21+
userToken = call.userToken,
22+
preferertSpraak = call.request.preferertSpraak
23+
).let { inaktiveVarsler ->
24+
call.respond(HttpStatusCode.OK, inaktiveVarsler)
25+
}
2326
}
2427

2528
get("aktive") {
26-
val aktiveVarsler = varselConsumer.getAktiveVarsler(call.userToken)
27-
28-
call.respond(HttpStatusCode.OK, aktiveVarsler)
29+
varselConsumer.getAktiveVarsler(
30+
userToken = call.userToken,
31+
preferertSpraak = call.request.preferertSpraak
32+
).let { aktiveVarsler ->
33+
call.respond(HttpStatusCode.OK, aktiveVarsler)
34+
}
2935
}
3036

3137
get("antall/aktive") {
32-
val antallAktive = varselConsumer.getAktiveVarsler(call.userToken).let {
38+
varselConsumer.getAktiveVarsler(
39+
userToken = call.userToken,
40+
preferertSpraak = null
41+
).let {
3342
AntallVarsler(
3443
beskjeder = it.beskjeder.size,
3544
oppgaver = it.oppgaver.size,
3645
innbokser = it.innbokser.size
3746
)
47+
}.let { antallAktive ->
48+
call.respond(HttpStatusCode.OK, antallAktive)
3849
}
39-
40-
call.respond(HttpStatusCode.OK, antallAktive)
4150
}
4251

4352
post("beskjed/inaktiver") {
@@ -60,3 +69,5 @@ data class InaktiverVarselBody(
6069
private suspend fun ApplicationCall.varselId(): String = receive<InaktiverVarselBody>().let {
6170
it.varselId ?: it.eventId ?: throw IllegalArgumentException("Mangler varselId eller eventId i body")
6271
}
72+
73+
private val ApplicationRequest.preferertSpraak get() = queryParameters["preferert_spraak"]?.lowercase()

src/main/kotlin/no/nav/tms/varsel/api/varsel/varselbjelleRoutes.kt

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package no.nav.tms.varsel.api.varsel
22

3+
import io.ktor.http.*
34
import io.ktor.server.application.ApplicationCall
45
import io.ktor.server.application.call
6+
import io.ktor.server.request.*
57
import io.ktor.server.response.respond
68
import io.ktor.server.routing.Route
79
import io.ktor.server.routing.get
@@ -12,21 +14,31 @@ import no.nav.tms.token.support.idporten.sidecar.user.IdportenUserFactory
1214
import no.nav.tms.token.support.tokenx.validation.user.TokenXUser
1315
import no.nav.tms.token.support.tokenx.validation.user.TokenXUserFactory
1416

15-
1617
fun Route.varselbjelle(varselConsumer: VarselConsumer) {
1718
route("/varselbjelle") {
1819
get("/varsler") {
19-
call.respond(varselConsumer.getVarselbjelleVarsler(idportenUser.tokenString))
20+
varselConsumer.getVarselbjelleVarsler(
21+
userToken = idportenUser.tokenString,
22+
preferertSpraak = call.request.preferertSpraak
23+
).let {
24+
call.respond(HttpStatusCode.OK, it)
25+
}
2026
}
2127
}
2228
}
2329

2430
fun Route.bjellevarsler(varselConsumer: VarselConsumer) {
2531
get("/bjellevarsler") {
26-
call.respond(varselConsumer.getVarselbjelleVarsler(tokenxUser.tokenString))
32+
varselConsumer.getVarselbjelleVarsler(
33+
userToken = tokenxUser.tokenString,
34+
preferertSpraak = call.request.preferertSpraak
35+
).let {
36+
call.respond(HttpStatusCode.OK, it)
37+
}
2738
}
2839
}
2940

41+
private val ApplicationRequest.preferertSpraak get() = queryParameters["preferert_spraak"]?.lowercase()
3042

3143
private val PipelineContext<Unit, ApplicationCall>.idportenUser: IdportenUser
3244
get() = IdportenUserFactory.createIdportenUser(this.call)

src/test/kotlin/no/nav/tms/varsel/api/VarselRoutesTest.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,25 @@ class VarselRoutesTest {
277277
postCount shouldBe 1
278278
}
279279

280+
@Test
281+
fun `bruker preferert spraak i kall til authority`() {
282+
testApplication {
283+
setupVarselAuthority(expectedSpraakkodeParam = "en")
284+
mockVarselApi(
285+
varselConsumer = setupVarselConsumer(),
286+
authMockInstaller = installAuthenticatedMock(LevelOfAssurance.LEVEL_4)
287+
)
288+
289+
client.get("/aktive?preferert_spraak=en").apply {
290+
status shouldBe HttpStatusCode.OK
291+
}
292+
293+
client.get("/inaktive?preferert_spraak=en").apply {
294+
status shouldBe HttpStatusCode.OK
295+
}
296+
}
297+
}
298+
280299
private fun varselRoutesTest(block: suspend ApplicationTestBuilder.(HttpClient) -> Unit) = testApplication {
281300
createClient {
282301
install(io.ktor.client.plugins.contentnegotiation.ContentNegotiation) {

src/test/kotlin/no/nav/tms/varsel/api/VarselbjelleRoutesTest.kt

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,12 @@ class VarselbjelleRoutesTest {
3535
val varselbjellevarsler = Json.decodeFromString<VarselbjelleVarsler>(bodyAsText())
3636
varselbjellevarsler.beskjeder.size shouldBe 2
3737
varselbjellevarsler.oppgaver.size shouldBe 3
38-
val beskjed = varselbjellevarsler.beskjeder.first { it.eventId == expectedBeskjed.varselId }
38+
val beskjed = varselbjellevarsler.beskjeder.first { it.varselId == expectedBeskjed.varselId }
3939
beskjed.varselId shouldBe expectedBeskjed.varselId
4040
beskjed.eventId shouldBe expectedBeskjed.varselId
4141
beskjed.isMasked shouldBe (expectedBeskjed.innhold == null)
4242
beskjed.link shouldBe expectedBeskjed.innhold?.link
43+
beskjed.spraakkode shouldBe expectedBeskjed.innhold?.spraakkode
4344
beskjed.tekst shouldBe expectedBeskjed.innhold?.tekst
4445
beskjed.eksternVarslingKanaler shouldBe expectedBeskjed.eksternVarslingKanaler
4546
beskjed.tidspunkt shouldBe expectedBeskjed.opprettet
@@ -76,6 +77,7 @@ class VarselbjelleRoutesTest {
7677
beskjed.eventId shouldBe expectedBeskjed.varselId
7778
beskjed.isMasked shouldBe (expectedBeskjed.innhold == null)
7879
beskjed.link shouldBe expectedBeskjed.innhold?.link
80+
beskjed.spraakkode shouldBe expectedBeskjed.innhold?.spraakkode
7981
beskjed.tekst shouldBe expectedBeskjed.innhold?.tekst
8082
beskjed.eksternVarslingKanaler shouldBe expectedBeskjed.eksternVarslingKanaler
8183
beskjed.tidspunkt shouldBe expectedBeskjed.opprettet
@@ -84,4 +86,23 @@ class VarselbjelleRoutesTest {
8486
}
8587
}
8688
}
89+
90+
@Test
91+
fun `bruker preferert spraak i kall til authority`() {
92+
testApplication {
93+
setupVarselAuthority(expectedSpraakkodeParam = "en")
94+
mockVarselApi(
95+
varselConsumer = setupVarselConsumer(),
96+
authMockInstaller = installAuthenticatedMock(LevelOfAssurance.LEVEL_4)
97+
)
98+
99+
client.get("/bjellevarsler?preferert_spraak=en").apply {
100+
status shouldBe HttpStatusCode.OK
101+
}
102+
103+
client.get("/varselbjelle/varsler?preferert_spraak=en").apply {
104+
status shouldBe HttpStatusCode.OK
105+
}
106+
}
107+
}
87108
}

src/test/kotlin/no/nav/tms/varsel/api/varselTestData.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import io.ktor.server.application.call
1010
import io.ktor.server.application.install
1111
import io.ktor.server.auth.*
1212
import io.ktor.server.plugins.contentnegotiation.ContentNegotiation
13+
import io.ktor.server.request.*
1314
import io.ktor.server.response.respond
1415
import io.ktor.server.routing.get
1516
import io.ktor.server.routing.routing
@@ -99,6 +100,7 @@ fun ApplicationTestBuilder.setupVarselAuthority(vararg varsler: TestVarsel) = se
99100
fun ApplicationTestBuilder.setupVarselAuthority(
100101
aktiveVarslerFromEventHandler: List<TestVarsel> = emptyList(),
101102
inaktiveVarslerFromEventHandler: List<TestVarsel> = emptyList(),
103+
expectedSpraakkodeParam: String? = null
102104
) {
103105
externalServices {
104106
hosts(varselAuthorityTestUrl) {
@@ -109,18 +111,26 @@ fun ApplicationTestBuilder.setupVarselAuthority(
109111
routing {
110112
get("/varsel/sammendrag/aktive") {
111113
call.request.headers["Authorization"] shouldBe "Bearer authorityToken"
114+
115+
call.request.preferertSpraak shouldBe expectedSpraakkodeParam
116+
112117
call.respond(HttpStatusCode.OK, aktiveVarslerFromEventHandler)
113118
}
114119

115120
get("/varsel/sammendrag/inaktive") {
116121
call.request.headers["Authorization"] shouldBe "Bearer authorityToken"
122+
123+
call.request.preferertSpraak shouldBe expectedSpraakkodeParam
124+
117125
call.respond(HttpStatusCode.OK, inaktiveVarslerFromEventHandler)
118126
}
119127
}
120128
}
121129
}
122130
}
123131

132+
private val ApplicationRequest.preferertSpraak get() = queryParameters["preferert_spraak"]?.lowercase()
133+
124134
fun ApplicationTestBuilder.setupVarselConsumer(
125135
tokendingsService: TokendingsService = mockk<TokendingsService>().apply {
126136
coEvery { exchangeToken(any(), "test:varsel-authority") } returns "authorityToken"

0 commit comments

Comments
 (0)