From c744cbfa818451a99d1a4ed472821ce26237e30a Mon Sep 17 00:00:00 2001 From: Ken Gullaksen Date: Thu, 5 Sep 2024 15:09:11 +0200 Subject: [PATCH] in mem cache av tilganger --- .../infrastruktur/altinn/Altinn.kt | 18 ++++++++++++-- .../altinn/AltinnTilgangerClient.kt | 24 ++++++++++++------- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/app/src/main/kotlin/no/nav/arbeidsgiver/notifikasjon/infrastruktur/altinn/Altinn.kt b/app/src/main/kotlin/no/nav/arbeidsgiver/notifikasjon/infrastruktur/altinn/Altinn.kt index d2d359b87..2059492b4 100644 --- a/app/src/main/kotlin/no/nav/arbeidsgiver/notifikasjon/infrastruktur/altinn/Altinn.kt +++ b/app/src/main/kotlin/no/nav/arbeidsgiver/notifikasjon/infrastruktur/altinn/Altinn.kt @@ -31,12 +31,26 @@ interface Altinn { class AltinnTilgangerImpl( private val altinnTilgangerClient: AltinnTilgangerClient ): Altinn { - // TODO: midlertidig plugget inn i eksisterende interface, underliggende implementasjon bruker bare token + private val cache = Caffeine.newBuilder() + .expireAfterWrite(Duration.ofMinutes(10)) + .maximumSize(10_000) + .buildAsync() + override suspend fun hentTilganger( fnr: String, selvbetjeningsToken: String, tjenester: Iterable - ): Tilganger = altinnTilgangerClient.hentTilganger(selvbetjeningsToken) + ): Tilganger { + val tilganger = cache.getAsync(fnr) { _ -> + altinnTilgangerClient.hentTilganger(selvbetjeningsToken) + } + + if (tilganger.harFeil) { + cache.synchronous().invalidate(fnr) + } + + return tilganger + } } class AltinnImpl( diff --git a/app/src/main/kotlin/no/nav/arbeidsgiver/notifikasjon/infrastruktur/altinn/AltinnTilgangerClient.kt b/app/src/main/kotlin/no/nav/arbeidsgiver/notifikasjon/infrastruktur/altinn/AltinnTilgangerClient.kt index 5f3436798..c129110b3 100644 --- a/app/src/main/kotlin/no/nav/arbeidsgiver/notifikasjon/infrastruktur/altinn/AltinnTilgangerClient.kt +++ b/app/src/main/kotlin/no/nav/arbeidsgiver/notifikasjon/infrastruktur/altinn/AltinnTilgangerClient.kt @@ -12,6 +12,7 @@ import io.ktor.http.* import io.ktor.network.sockets.* import io.ktor.serialization.jackson.* import no.nav.arbeidsgiver.notifikasjon.bruker.BrukerModel +import no.nav.arbeidsgiver.notifikasjon.bruker.BrukerModel.Tilganger import no.nav.arbeidsgiver.notifikasjon.infrastruktur.HttpClientMetricsFeature import no.nav.arbeidsgiver.notifikasjon.infrastruktur.Metrics import no.nav.arbeidsgiver.notifikasjon.infrastruktur.NaisEnvironment @@ -51,22 +52,27 @@ class AltinnTilgangerClient( } } + private val targetAudience = "${NaisEnvironment.clusterName}:fager:arbeidsgiver-altinn-tilganger" + // TODO: ikke bruk BrukerModel typen her, lag egne DTOer for denne klienten og konverter til BrukerModel i tjenesten - suspend fun hentTilganger(subjectToken: String): BrukerModel.Tilganger { - val response = httpClient.post { + suspend fun hentTilganger(subjectToken: String): Tilganger { + val dto = httpClient.post { url { path("/altinn-tilganger") } accept(ContentType.Application.Json) - bearerAuth(tokenXClient.exchange(subjectToken, "${NaisEnvironment.clusterName}:fager:arbeidsgiver-altinn-tilganger")) - } - val dto = response.body() - + bearerAuth( + tokenXClient.exchange( + subjectToken, + targetAudience + ) + ) + }.body() - return BrukerModel.Tilganger( + return Tilganger( harFeil = dto.isError, - tjenestetilganger = dto.orgNrTilTilganger.flatMap { - (orgNr, tilganger) -> tilganger.map { tilgang -> + tjenestetilganger = dto.orgNrTilTilganger.flatMap { (orgNr, tilganger) -> + tilganger.map { tilgang -> val (code, edition) = tilgang.split(":").let { it.first() to it.getOrElse(1) { "" } }