Skip to content

Commit 3a4c135

Browse files
authored
Nytt endepunkt, retunerer alle aktive og inaktive varsler en bruker har (#41)
1 parent 0d7873d commit 3a4c135

File tree

13 files changed

+280
-29
lines changed

13 files changed

+280
-29
lines changed

nais/dev-gcp/nais.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ spec:
3535
accessPolicy:
3636
inbound:
3737
rules:
38+
- application: tms-varsler-frontend
3839
- application: "*"
3940
namespace: personbruker
4041
cluster: dev-gcp

nais/prod-gcp/nais.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ spec:
3434
accessPolicy:
3535
inbound:
3636
rules:
37+
- application: tms-varsler-frontend
3738
- application: "*"
3839
namespace: personbruker
3940
cluster: prod-gcp

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ data class AktivtVarsel(
1616
val eksternVarslingKanaler: List<String>
1717
) {
1818
companion object {
19-
fun fromVarsel(varsel: Varsel) = AktivtVarsel(
19+
fun fromVarsel(varsel: VarselAuthority.Varsel) = AktivtVarsel(
2020
eventId = varsel.varselId,
2121
varselId = varsel.varselId,
2222
forstBehandlet = varsel.opprettet,
@@ -37,7 +37,7 @@ data class AktiveVarsler(
3737
val innbokser: List<AktivtVarsel>
3838
) {
3939
companion object {
40-
fun fromVarsler(varsler: List<Varsel>) = AktiveVarsler(
40+
fun fromVarsler(varsler: List<VarselAuthority.Varsel>) = AktiveVarsler(
4141
beskjeder = varsler.filter { it.type == VarselType.beskjed }.map { AktivtVarsel.fromVarsel(it) },
4242
oppgaver = varsler.filter { it.type == VarselType.oppgave }.map { AktivtVarsel.fromVarsel(it) },
4343
innbokser = varsler.filter { it.type == VarselType.innboks }.map { AktivtVarsel.fromVarsel(it) }

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ data class InaktivtVarsel(
1515
val eksternVarslingKanaler: List<String>
1616
) {
1717
companion object {
18-
fun fromVarsel(varsel: Varsel) = InaktivtVarsel(
18+
fun fromVarsel(varsel: VarselAuthority.Varsel) = InaktivtVarsel(
1919
type = varsel.type,
2020
eventId = varsel.varselId,
2121
varselId = varsel.varselId,

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

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ class VarselConsumer(
2828
.let(VarselbjelleVarsler::fromVarsler)
2929
}
3030

31+
suspend fun getAlleVarsler(userToken: String, preferertSpraak: String?): AlleVarsler {
32+
return getVarsler(userToken, "/varsel/sammendrag/alle", preferertSpraak = preferertSpraak)
33+
.let(AlleVarsler::fromVarsler)
34+
}
3135
suspend fun postInaktiver(userToken: String, varselId: String) {
3236
val authorityToken = tokendingsService.exchangeToken(userToken, varselAuthorityClientId)
3337

@@ -38,7 +42,7 @@ class VarselConsumer(
3842
}
3943
}
4044

41-
private suspend fun getVarsler(userToken: String, path: String, preferertSpraak: String? = null): List<Varsel> {
45+
private suspend fun getVarsler(userToken: String, path: String, preferertSpraak: String? = null): List<VarselAuthority.Varsel> {
4246
val authorityToken = tokendingsService.exchangeToken(userToken, targetApp = varselAuthorityClientId)
4347

4448
return client.request {
@@ -51,23 +55,28 @@ class VarselConsumer(
5155
}
5256
}
5357

54-
data class Varsel(
55-
val type: VarselType,
56-
val varselId: String,
57-
val aktiv: Boolean,
58-
val innhold: VarselInnhold?,
59-
val eksternVarslingSendt: Boolean,
60-
val eksternVarslingKanaler: List<String>,
61-
val opprettet: ZonedDateTime,
62-
val aktivFremTil: ZonedDateTime?,
63-
val inaktivert: ZonedDateTime?
64-
)
58+
object VarselAuthority {
59+
data class Varsel(
60+
val type: VarselType,
61+
val varselId: String,
62+
val aktiv: Boolean,
63+
val innhold: Innhold?,
64+
val eksternVarslingSendt: Boolean,
65+
val eksternVarslingKanaler: List<String>,
66+
val opprettet: ZonedDateTime,
67+
val aktivFremTil: ZonedDateTime?,
68+
val inaktivert: ZonedDateTime?
69+
)
70+
71+
data class Innhold(
72+
val spraakkode: String,
73+
val tekst: String,
74+
val link: String?
75+
)
76+
}
77+
78+
6579

66-
data class VarselInnhold(
67-
val spraakkode: String,
68-
val tekst: String,
69-
val link: String?
70-
)
7180

7281
enum class VarselType {
7382
oppgave,

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ data class VarselbjelleVarsler(
99
val oppgaver: List<VarselbjelleVarsel>,
1010
) {
1111
companion object {
12-
fun fromVarsler(varsler: List<Varsel>): VarselbjelleVarsler {
12+
fun fromVarsler(varsler: List<VarselAuthority.Varsel>): VarselbjelleVarsler {
1313
val groupedVarsler = varsler.groupBy { it.type }.mapValues { (_, varsler) ->
1414
varsler.map(VarselbjelleVarsel::fromVarsel)
1515
}
@@ -36,7 +36,7 @@ data class VarselbjelleVarsel(
3636
val eksternVarslingKanaler: List<String>
3737
) {
3838
companion object {
39-
fun fromVarsel(varsel: Varsel) = with(varsel) {
39+
fun fromVarsel(varsel: VarselAuthority.Varsel) = with(varsel) {
4040
VarselbjelleVarsel(
4141
eventId = varselId,
4242
varselId = varselId,
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package no.nav.tms.varsel.api.varsel
2+
3+
import java.time.ZonedDateTime
4+
5+
data class Varsel(
6+
@Deprecated("Use varselId") val eventId: String,
7+
@Deprecated("Use tidspunkt") val forstBehandlet: ZonedDateTime,
8+
val isMasked: Boolean,
9+
val spraakkode: String?,
10+
val tekst: String?,
11+
val link: String?,
12+
val eksternVarslingSendt: Boolean,
13+
val eksternVarslingKanaler: List<String>,
14+
val type: VarselType,
15+
val isInaktiverbar: Boolean,
16+
17+
) {
18+
companion object {
19+
fun fromVarsel(varsel: VarselAuthority.Varsel): Varsel {
20+
val isMasked = varsel.innhold == null
21+
22+
return Varsel(
23+
eventId = varsel.varselId,
24+
forstBehandlet = varsel.opprettet,
25+
isMasked = isMasked,
26+
spraakkode = varsel.innhold?.spraakkode,
27+
tekst = varsel.innhold?.tekst,
28+
link = varsel.innhold?.link,
29+
eksternVarslingSendt = varsel.eksternVarslingSendt,
30+
eksternVarslingKanaler = varsel.eksternVarslingKanaler,
31+
type = if (varsel.type == VarselType.oppgave) VarselType.oppgave else VarselType.beskjed,
32+
isInaktiverbar = varsel.type == VarselType.beskjed && varsel.aktiv && !isMasked,
33+
)
34+
}
35+
}
36+
}
37+
38+
data class AlleVarsler(
39+
val hasMaskedVarsel: Boolean,
40+
val aktive: AktivtVarselV2,
41+
val inaktive: List<Varsel>,
42+
) {
43+
companion object {
44+
fun fromVarsler(varsler: List<VarselAuthority.Varsel>): AlleVarsler {
45+
val aktivBeskjeder = mutableListOf<Varsel>()
46+
val aktivOppgaver = mutableListOf<Varsel>()
47+
val inaktivtVarseler = mutableListOf<Varsel>()
48+
var hasMaskedVarsel = false
49+
50+
varsler.map {
51+
if(it.innhold == null) {
52+
hasMaskedVarsel = true
53+
}
54+
55+
if (it.aktiv) {
56+
if (it.type == VarselType.oppgave) {
57+
aktivOppgaver.add(Varsel.fromVarsel(it))
58+
} else {
59+
aktivBeskjeder.add(Varsel.fromVarsel(it))
60+
}
61+
} else {
62+
inaktivtVarseler.add(Varsel.fromVarsel(it))
63+
}
64+
}
65+
return AlleVarsler(
66+
hasMaskedVarsel = hasMaskedVarsel,
67+
aktive = AktivtVarselV2(aktivBeskjeder, aktivOppgaver),
68+
inaktive = inaktivtVarseler
69+
)
70+
}
71+
}
72+
}
73+
74+
data class AktivtVarselV2(
75+
val beskjeder: List<Varsel>,
76+
val oppgaver: List<Varsel>,
77+
)

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

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@ import io.ktor.server.response.respond
88
import io.ktor.server.routing.Route
99
import io.ktor.server.routing.get
1010
import io.ktor.server.routing.post
11-
import io.ktor.util.pipeline.PipelineContext
1211
import kotlinx.serialization.Serializable
1312
import no.nav.tms.token.support.idporten.sidecar.user.IdportenUserFactory
14-
13+
import no.nav.tms.token.support.tokenx.validation.user.TokenXUserFactory
1514

1615
fun Route.varsel(
1716
varselConsumer: VarselConsumer
@@ -49,13 +48,29 @@ fun Route.varsel(
4948
}
5049
}
5150

51+
5252
post("beskjed/inaktiver") {
5353
varselConsumer.postInaktiver(varselId = call.varselId(), userToken = call.userToken)
5454
call.respond(HttpStatusCode.OK)
5555
}
5656
}
5757

58+
fun Route.alleVarsler(
59+
varselConsumer: VarselConsumer
60+
) {
61+
get("/alle"){
62+
varselConsumer.getAlleVarsler(
63+
userToken = call.tokenXUser.tokenString,
64+
preferertSpraak = call.request.preferertSpraak
65+
).let { alleVarsler ->
66+
call.respond(HttpStatusCode.OK, alleVarsler)
67+
}
68+
}
69+
}
70+
5871
private val ApplicationCall.userToken get() = IdportenUserFactory.createIdportenUser(this).tokenString
72+
private val ApplicationCall.tokenXUser get() = TokenXUserFactory.createTokenXUser(this)
73+
5974

6075
@Serializable
6176
data class AntallVarsler(val beskjeder: Int, val oppgaver: Int, val innbokser: Int)

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import no.nav.tms.varsel.api.varsel.VarselConsumer
2727
import no.nav.tms.varsel.api.varsel.bjellevarsler
2828
import no.nav.tms.varsel.api.varsel.varsel
2929
import no.nav.tms.varsel.api.varsel.varselbjelle
30+
import no.nav.tms.varsel.api.varsel.alleVarsler
3031

3132
fun Application.varselApi(
3233
corsAllowedOrigins: String,
@@ -81,6 +82,7 @@ fun Application.varselApi(
8182
}
8283
authenticate(TokenXAuthenticator.name) {
8384
bjellevarsler(varselConsumer)
85+
alleVarsler(varselConsumer)
8486
}
8587

8688
}

src/test/kotlin/no/nav/tms/varsel/api/VarselRoutesTest.kt renamed to src/test/kotlin/no/nav/tms/varsel/api/`VarselAuthority.Varsel`RoutesTest.kt

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
44
import io.kotest.matchers.collections.shouldContainExactlyInAnyOrder
55
import io.kotest.matchers.shouldBe
66
import io.ktor.client.*
7-
import io.ktor.client.call.*
87
import io.ktor.client.request.get
98
import io.ktor.client.request.header
109
import io.ktor.client.request.post
@@ -26,18 +25,50 @@ import kotlinx.serialization.json.Json
2625
import kotlinx.serialization.json.jsonObject
2726
import kotlinx.serialization.json.jsonPrimitive
2827
import no.nav.tms.token.support.idporten.sidecar.mock.LevelOfAssurance
29-
import no.nav.tms.varsel.api.varsel.AktiveVarsler
30-
import no.nav.tms.varsel.api.varsel.AntallVarsler
31-
import no.nav.tms.varsel.api.varsel.InaktivtVarsel
32-
import no.nav.tms.varsel.api.varsel.VarselType
3328
import org.junit.jupiter.api.Test
3429
import java.time.ZonedDateTime
3530
import com.fasterxml.jackson.module.kotlin.readValue
31+
import no.nav.tms.varsel.api.varsel.*
3632

3733
class VarselRoutesTest {
3834

3935
private val objectMapper = jacksonObjectMapper().jsonConfig()
4036

37+
@Test
38+
fun `Henter alle varsler, inkative og aktive`() = varselRoutesTest{ client ->
39+
val aktiveVarsler = listOf(
40+
VarselTestData.varsel(type = VarselType.beskjed),
41+
VarselTestData.varsel(type = VarselType.oppgave),
42+
VarselTestData.varsel(type = VarselType.oppgave),
43+
VarselTestData.varsel(type = VarselType.innboks),
44+
VarselTestData.varsel(type = VarselType.innboks),
45+
VarselTestData.varsel(type = VarselType.innboks),
46+
)
47+
val inaktivtVarsel = listOf(
48+
VarselTestData.varsel(type = VarselType.beskjed, aktiv = false),
49+
VarselTestData.varsel(type = VarselType.beskjed, aktiv = false),
50+
VarselTestData.varsel(type = VarselType.beskjed, aktiv = false),
51+
VarselTestData.varsel(type = VarselType.oppgave, aktiv = false),
52+
VarselTestData.varsel(type = VarselType.innboks, aktiv = false),
53+
VarselTestData.varsel(type = VarselType.innboks,aktiv = false),
54+
)
55+
setupVarselAuthority(inaktiveVarslerFromEventHandler = inaktivtVarsel, aktiveVarslerFromEventHandler = aktiveVarsler)
56+
57+
mockVarselApi(
58+
varselConsumer = setupVarselConsumer(),
59+
authMockInstaller = installAuthenticatedMock(LevelOfAssurance.LEVEL_4)
60+
)
61+
62+
val response = client.get("/alle")
63+
response.status shouldBe HttpStatusCode.OK
64+
65+
val alleVarsler: AlleVarsler = response.bodyFromJson()
66+
alleVarsler.aktive.beskjeder.size shouldBe 4
67+
alleVarsler.aktive.oppgaver.size shouldBe 2
68+
alleVarsler.inaktive.size shouldBe 6
69+
70+
}
71+
4172
@Test
4273
fun `Henter inaktiverte varsler`() = varselRoutesTest { client ->
4374
val varsler = listOf(

0 commit comments

Comments
 (0)