Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions nais/dev-gcp/nais.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ spec:
accessPolicy:
inbound:
rules:
- application: tms-varsler-frontend
- application: "*"
namespace: personbruker
cluster: dev-gcp
Expand Down
1 change: 1 addition & 0 deletions nais/prod-gcp/nais.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ spec:
accessPolicy:
inbound:
rules:
- application: tms-varsler-frontend
- application: "*"
namespace: personbruker
cluster: prod-gcp
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ data class AktivtVarsel(
val eksternVarslingKanaler: List<String>
) {
companion object {
fun fromVarsel(varsel: Varsel) = AktivtVarsel(
fun fromVarsel(varsel: VarselAuthority.Varsel) = AktivtVarsel(
eventId = varsel.varselId,
varselId = varsel.varselId,
forstBehandlet = varsel.opprettet,
Expand All @@ -37,7 +37,7 @@ data class AktiveVarsler(
val innbokser: List<AktivtVarsel>
) {
companion object {
fun fromVarsler(varsler: List<Varsel>) = AktiveVarsler(
fun fromVarsler(varsler: List<VarselAuthority.Varsel>) = AktiveVarsler(
beskjeder = varsler.filter { it.type == VarselType.beskjed }.map { AktivtVarsel.fromVarsel(it) },
oppgaver = varsler.filter { it.type == VarselType.oppgave }.map { AktivtVarsel.fromVarsel(it) },
innbokser = varsler.filter { it.type == VarselType.innboks }.map { AktivtVarsel.fromVarsel(it) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ data class InaktivtVarsel(
val eksternVarslingKanaler: List<String>
) {
companion object {
fun fromVarsel(varsel: Varsel) = InaktivtVarsel(
fun fromVarsel(varsel: VarselAuthority.Varsel) = InaktivtVarsel(
type = varsel.type,
eventId = varsel.varselId,
varselId = varsel.varselId,
Expand Down
43 changes: 26 additions & 17 deletions src/main/kotlin/no/nav/tms/varsel/api/varsel/VarselConsumer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ class VarselConsumer(
.let(VarselbjelleVarsler::fromVarsler)
}

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

Expand All @@ -38,7 +42,7 @@ class VarselConsumer(
}
}

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

return client.request {
Expand All @@ -51,23 +55,28 @@ class VarselConsumer(
}
}

data class Varsel(
val type: VarselType,
val varselId: String,
val aktiv: Boolean,
val innhold: VarselInnhold?,
val eksternVarslingSendt: Boolean,
val eksternVarslingKanaler: List<String>,
val opprettet: ZonedDateTime,
val aktivFremTil: ZonedDateTime?,
val inaktivert: ZonedDateTime?
)
object VarselAuthority {
data class Varsel(
val type: VarselType,
val varselId: String,
val aktiv: Boolean,
val innhold: Innhold?,
val eksternVarslingSendt: Boolean,
val eksternVarslingKanaler: List<String>,
val opprettet: ZonedDateTime,
val aktivFremTil: ZonedDateTime?,
val inaktivert: ZonedDateTime?
)

data class Innhold(
val spraakkode: String,
val tekst: String,
val link: String?
)
}



data class VarselInnhold(
val spraakkode: String,
val tekst: String,
val link: String?
)

enum class VarselType {
oppgave,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ data class VarselbjelleVarsler(
val oppgaver: List<VarselbjelleVarsel>,
) {
companion object {
fun fromVarsler(varsler: List<Varsel>): VarselbjelleVarsler {
fun fromVarsler(varsler: List<VarselAuthority.Varsel>): VarselbjelleVarsler {
val groupedVarsler = varsler.groupBy { it.type }.mapValues { (_, varsler) ->
varsler.map(VarselbjelleVarsel::fromVarsel)
}
Expand All @@ -36,7 +36,7 @@ data class VarselbjelleVarsel(
val eksternVarslingKanaler: List<String>
) {
companion object {
fun fromVarsel(varsel: Varsel) = with(varsel) {
fun fromVarsel(varsel: VarselAuthority.Varsel) = with(varsel) {
VarselbjelleVarsel(
eventId = varselId,
varselId = varselId,
Expand Down
77 changes: 77 additions & 0 deletions src/main/kotlin/no/nav/tms/varsel/api/varsel/alleVarsler.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package no.nav.tms.varsel.api.varsel

import java.time.ZonedDateTime

data class Varsel(
@Deprecated("Use varselId") val eventId: String,
@Deprecated("Use tidspunkt") val forstBehandlet: ZonedDateTime,
val isMasked: Boolean,
val spraakkode: String?,
val tekst: String?,
val link: String?,
val eksternVarslingSendt: Boolean,
val eksternVarslingKanaler: List<String>,
val type: VarselType,
val isInaktiverbar: Boolean,

) {
companion object {
fun fromVarsel(varsel: VarselAuthority.Varsel): Varsel {
val isMasked = varsel.innhold == null

return Varsel(
eventId = varsel.varselId,
forstBehandlet = varsel.opprettet,
isMasked = isMasked,
spraakkode = varsel.innhold?.spraakkode,
tekst = varsel.innhold?.tekst,
link = varsel.innhold?.link,
eksternVarslingSendt = varsel.eksternVarslingSendt,
eksternVarslingKanaler = varsel.eksternVarslingKanaler,
type = if (varsel.type == VarselType.oppgave) VarselType.oppgave else VarselType.beskjed,
isInaktiverbar = varsel.type == VarselType.beskjed && varsel.aktiv && !isMasked,
)
}
}
}

data class AlleVarsler(
val hasMaskedVarsel: Boolean,
val aktive: AktivtVarselV2,
val inaktive: List<Varsel>,
) {
companion object {
fun fromVarsler(varsler: List<VarselAuthority.Varsel>): AlleVarsler {
val aktivBeskjeder = mutableListOf<Varsel>()
val aktivOppgaver = mutableListOf<Varsel>()
val inaktivtVarseler = mutableListOf<Varsel>()
var hasMaskedVarsel = false

varsler.map {
if(it.innhold == null) {
hasMaskedVarsel = true
}

if (it.aktiv) {
if (it.type == VarselType.oppgave) {
aktivOppgaver.add(Varsel.fromVarsel(it))
} else {
aktivBeskjeder.add(Varsel.fromVarsel(it))
}
} else {
inaktivtVarseler.add(Varsel.fromVarsel(it))
}
}
return AlleVarsler(
hasMaskedVarsel = hasMaskedVarsel,
aktive = AktivtVarselV2(aktivBeskjeder, aktivOppgaver),
inaktive = inaktivtVarseler
)
}
}
}

data class AktivtVarselV2(
val beskjeder: List<Varsel>,
val oppgaver: List<Varsel>,
)
19 changes: 17 additions & 2 deletions src/main/kotlin/no/nav/tms/varsel/api/varsel/varselRoutes.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,9 @@ import io.ktor.server.response.respond
import io.ktor.server.routing.Route
import io.ktor.server.routing.get
import io.ktor.server.routing.post
import io.ktor.util.pipeline.PipelineContext
import kotlinx.serialization.Serializable
import no.nav.tms.token.support.idporten.sidecar.user.IdportenUserFactory

import no.nav.tms.token.support.tokenx.validation.user.TokenXUserFactory

fun Route.varsel(
varselConsumer: VarselConsumer
Expand Down Expand Up @@ -49,13 +48,29 @@ fun Route.varsel(
}
}


post("beskjed/inaktiver") {
varselConsumer.postInaktiver(varselId = call.varselId(), userToken = call.userToken)
call.respond(HttpStatusCode.OK)
}
}

fun Route.alleVarsler(
varselConsumer: VarselConsumer
) {
get("/alle"){
varselConsumer.getAlleVarsler(
userToken = call.tokenXUser.tokenString,
preferertSpraak = call.request.preferertSpraak
).let { alleVarsler ->
call.respond(HttpStatusCode.OK, alleVarsler)
}
}
}

private val ApplicationCall.userToken get() = IdportenUserFactory.createIdportenUser(this).tokenString
private val ApplicationCall.tokenXUser get() = TokenXUserFactory.createTokenXUser(this)


@Serializable
data class AntallVarsler(val beskjeder: Int, val oppgaver: Int, val innbokser: Int)
Expand Down
2 changes: 2 additions & 0 deletions src/main/kotlin/no/nav/tms/varsel/api/varselApi.kt
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import no.nav.tms.varsel.api.varsel.VarselConsumer
import no.nav.tms.varsel.api.varsel.bjellevarsler
import no.nav.tms.varsel.api.varsel.varsel
import no.nav.tms.varsel.api.varsel.varselbjelle
import no.nav.tms.varsel.api.varsel.alleVarsler

fun Application.varselApi(
corsAllowedOrigins: String,
Expand Down Expand Up @@ -81,6 +82,7 @@ fun Application.varselApi(
}
authenticate(TokenXAuthenticator.name) {
bjellevarsler(varselConsumer)
alleVarsler(varselConsumer)
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import io.kotest.matchers.collections.shouldContainExactlyInAnyOrder
import io.kotest.matchers.shouldBe
import io.ktor.client.*
import io.ktor.client.call.*
import io.ktor.client.request.get
import io.ktor.client.request.header
import io.ktor.client.request.post
Expand All @@ -26,18 +25,50 @@ import kotlinx.serialization.json.Json
import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive
import no.nav.tms.token.support.idporten.sidecar.mock.LevelOfAssurance
import no.nav.tms.varsel.api.varsel.AktiveVarsler
import no.nav.tms.varsel.api.varsel.AntallVarsler
import no.nav.tms.varsel.api.varsel.InaktivtVarsel
import no.nav.tms.varsel.api.varsel.VarselType
import org.junit.jupiter.api.Test
import java.time.ZonedDateTime
import com.fasterxml.jackson.module.kotlin.readValue
import no.nav.tms.varsel.api.varsel.*

class VarselRoutesTest {

private val objectMapper = jacksonObjectMapper().jsonConfig()

@Test
fun `Henter alle varsler, inkative og aktive`() = varselRoutesTest{ client ->
val aktiveVarsler = listOf(
VarselTestData.varsel(type = VarselType.beskjed),
VarselTestData.varsel(type = VarselType.oppgave),
VarselTestData.varsel(type = VarselType.oppgave),
VarselTestData.varsel(type = VarselType.innboks),
VarselTestData.varsel(type = VarselType.innboks),
VarselTestData.varsel(type = VarselType.innboks),
)
val inaktivtVarsel = listOf(
VarselTestData.varsel(type = VarselType.beskjed, aktiv = false),
VarselTestData.varsel(type = VarselType.beskjed, aktiv = false),
VarselTestData.varsel(type = VarselType.beskjed, aktiv = false),
VarselTestData.varsel(type = VarselType.oppgave, aktiv = false),
VarselTestData.varsel(type = VarselType.innboks, aktiv = false),
VarselTestData.varsel(type = VarselType.innboks,aktiv = false),
)
setupVarselAuthority(inaktiveVarslerFromEventHandler = inaktivtVarsel, aktiveVarslerFromEventHandler = aktiveVarsler)

mockVarselApi(
varselConsumer = setupVarselConsumer(),
authMockInstaller = installAuthenticatedMock(LevelOfAssurance.LEVEL_4)
)

val response = client.get("/alle")
response.status shouldBe HttpStatusCode.OK

val alleVarsler: AlleVarsler = response.bodyFromJson()
alleVarsler.aktive.beskjeder.size shouldBe 4
alleVarsler.aktive.oppgaver.size shouldBe 2
alleVarsler.inaktive.size shouldBe 6

}

@Test
fun `Henter inaktiverte varsler`() = varselRoutesTest { client ->
val varsler = listOf(
Expand Down
Loading