-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- BeskyttelseType som en type i kø, som joines mot pepcache ved henting av kø. - Oppdaterer pepcache ved alle inkomne behandlingprosesseventer for å få med tilkomne aktører. - Endret pepcacheoppdaterer til å hente eldste av åpne og ventende oppgaver, og kun etter 23 timer. Mulig med så stort forsinkelse fordi endring i aktør på sak vil fanges opp fortløpende som følge av nytt behandligprosessevent. - Sjekker antall kall mot pep for å verifisere at det gjøres ekstra tilgangssjekk for oppgaver som vises til saksbehandler.
- Loading branch information
Showing
24 changed files
with
990 additions
and
129 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
17 changes: 17 additions & 0 deletions
17
src/main/kotlin/no/nav/k9/los/nyoppgavestyring/kodeverk/BeskyttelseType.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
package no.nav.k9.los.nyoppgavestyring.kodeverk | ||
|
||
import com.fasterxml.jackson.annotation.JsonCreator | ||
|
||
enum class BeskyttelseType(val kode: String, val beskrivelse: String) { | ||
KODE6("KODE6", "Kode 6"), | ||
KODE7("KODE7", "Kode 7"), | ||
ORDINÆR("ORDINÆR", "Vanlig"); | ||
|
||
companion object { | ||
@JsonCreator(mode = JsonCreator.Mode.DELEGATING) | ||
@JvmStatic | ||
fun fraKode(kode: String): BeskyttelseType { | ||
return BeskyttelseType.entries.find { it.kode == kode } ?: throw IllegalStateException("Kjenner ikke igjen koden=$kode") | ||
} | ||
} | ||
} |
17 changes: 17 additions & 0 deletions
17
src/main/kotlin/no/nav/k9/los/nyoppgavestyring/kodeverk/EgenAnsatt.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
package no.nav.k9.los.nyoppgavestyring.kodeverk | ||
|
||
import com.fasterxml.jackson.annotation.JsonCreator | ||
|
||
|
||
enum class EgenAnsatt(val kode: String, val beskrivelse: String) { | ||
JA("JA", "Egen ansatt"), | ||
NEI("NEI", "Ikke egen ansatt"); | ||
|
||
companion object { | ||
@JsonCreator(mode = JsonCreator.Mode.DELEGATING) | ||
@JvmStatic | ||
fun fraKode(kode: String): EgenAnsatt { | ||
return EgenAnsatt.entries.find { it.kode == kode } ?: throw IllegalStateException("Kjenner ikke igjen koden=$kode") | ||
} | ||
} | ||
} |
32 changes: 32 additions & 0 deletions
32
src/main/kotlin/no/nav/k9/los/nyoppgavestyring/pep/PepCacheOppdaterer.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
package no.nav.k9.los.nyoppgavestyring.pep | ||
|
||
import no.nav.k9.los.domene.repository.OppgaveKøRepository | ||
import org.slf4j.LoggerFactory | ||
import java.time.Duration | ||
import java.util.* | ||
import kotlin.concurrent.timer | ||
|
||
class PepCacheOppdaterer( | ||
val pepCacheService: PepCacheService, | ||
val tidMellomKjøring: Duration = Duration.ofSeconds(1), | ||
val alderForOppfriskning: Duration = Duration.ofHours(23), | ||
val forsinketOppstart: Duration = Duration.ofMinutes(5) | ||
) { | ||
private val TRÅDNAVN = "k9los-pepcache-oppdaterer" | ||
private val log = LoggerFactory.getLogger(PepCacheOppdaterer::class.java) | ||
|
||
fun start(): Timer { | ||
return timer( | ||
daemon = true, | ||
name = TRÅDNAVN, | ||
period = tidMellomKjøring.toMillis(), | ||
initialDelay = forsinketOppstart.toMillis() | ||
) { | ||
try { | ||
pepCacheService.oppdaterCacheForOppgaverEldreEnn(alderForOppfriskning) | ||
} catch (e: Exception) { | ||
log.warn("Feil ved kjøring av PepCacheOppdaterer", e) | ||
} | ||
} | ||
} | ||
} |
105 changes: 105 additions & 0 deletions
105
src/main/kotlin/no/nav/k9/los/nyoppgavestyring/pep/PepCacheRepository.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
package no.nav.k9.los.nyoppgavestyring.pep | ||
|
||
import kotliquery.LoanPattern.using | ||
import kotliquery.Row | ||
import kotliquery.TransactionalSession | ||
import kotliquery.queryOf | ||
import kotliquery.sessionOf | ||
import java.time.Duration | ||
import java.time.LocalDateTime | ||
import javax.sql.DataSource | ||
|
||
class PepCacheRepository( | ||
val dataSource: DataSource | ||
) { | ||
|
||
fun lagre(cache: PepCache, tx: TransactionalSession) { | ||
tx.run( | ||
queryOf(""" | ||
INSERT INTO OPPGAVE_PEP_CACHE (kildeomrade, ekstern_id, kode6, kode7, egen_ansatt, oppdatert) | ||
VALUES(:kildeomrade, :ekstern_id, :kode6, :kode7, :egen_ansatt, :oppdatert) | ||
ON CONFLICT ON CONSTRAINT pep_kildeomrade_eksternid | ||
DO UPDATE SET | ||
kildeomrade = :kildeomrade, | ||
ekstern_id = :ekstern_id, | ||
kode6 = :kode6, | ||
kode7 = :kode7, | ||
egen_ansatt = :egen_ansatt, | ||
oppdatert = :oppdatert | ||
""", mapOf( | ||
"kildeomrade" to cache.kildeområde, | ||
"ekstern_id" to cache.eksternId, | ||
"kode6" to cache.kode6, | ||
"kode7" to cache.kode7, | ||
"egen_ansatt" to cache.egenAnsatt, | ||
"oppdatert" to cache.oppdatert | ||
)).asUpdate | ||
) | ||
} | ||
|
||
fun slett(kildeområde: String, eksternId: String, tx: TransactionalSession) { | ||
tx.run( | ||
queryOf(""" | ||
DELETE FROM OPPGAVE_PEP_CACHE WHERE kildeomrade = :kildeomrade AND ekstern_id = :ekstern_id | ||
""", mapOf( | ||
"kildeomrade" to kildeområde, | ||
"ekstern_id" to eksternId | ||
) | ||
).asUpdate | ||
) | ||
} | ||
|
||
fun hent(kildeområde: String, eksternId: String): PepCache? { | ||
return using(sessionOf(dataSource)) { | ||
it.transaction { tx -> hent(kildeområde, eksternId, tx) } | ||
} | ||
} | ||
|
||
fun hent(kildeområde: String, eksternId: String, tx: TransactionalSession): PepCache? { | ||
return tx.run( | ||
queryOf(""" | ||
SELECT * FROM OPPGAVE_PEP_CACHE WHERE kildeomrade = :kildeomrade AND ekstern_id = :ekstern_id | ||
""", mapOf( | ||
"kildeomrade" to kildeområde, | ||
"ekstern_id" to eksternId | ||
) | ||
).map { it.tilPepCache() }.asSingle | ||
) | ||
} | ||
|
||
private fun Row.tilPepCache() = PepCache( | ||
kildeområde = string("kildeomrade"), | ||
eksternId = string("ekstern_id"), | ||
kode6 = boolean("kode6"), | ||
kode7 = boolean("kode7"), | ||
egenAnsatt = boolean("egen_ansatt"), | ||
oppdatert = localDateTime("oppdatert"), | ||
) | ||
} | ||
|
||
|
||
data class PepCache( | ||
val eksternId: String, | ||
val kildeområde: String, | ||
val kode6: Boolean, | ||
val kode7: Boolean, | ||
val egenAnsatt: Boolean, | ||
val oppdatert: LocalDateTime | ||
) { | ||
fun erGyldig(maksimalAlder: Duration): Boolean { | ||
return oppdatert < (LocalDateTime.now() - maksimalAlder) | ||
} | ||
|
||
fun oppdater(kode6: Boolean, kode7: Boolean, egenAnsatt: Boolean): PepCache { | ||
return copy( | ||
kode6 = kode6, | ||
kode7 = kode7, | ||
egenAnsatt = egenAnsatt, | ||
oppdatert = LocalDateTime.now() | ||
) | ||
} | ||
|
||
fun måSjekkes(): Boolean { | ||
return kode6 || kode7 || egenAnsatt | ||
} | ||
} |
94 changes: 94 additions & 0 deletions
94
src/main/kotlin/no/nav/k9/los/nyoppgavestyring/pep/PepCacheService.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
package no.nav.k9.los.nyoppgavestyring.pep | ||
|
||
import kotlinx.coroutines.async | ||
import kotlinx.coroutines.coroutineScope | ||
import kotlinx.coroutines.runBlocking | ||
import kotliquery.TransactionalSession | ||
import no.nav.k9.los.domene.lager.oppgave.v2.TransactionalManager | ||
import no.nav.k9.los.integrasjon.abac.IPepClient | ||
import no.nav.k9.los.nyoppgavestyring.visningoguttrekk.Oppgave | ||
import no.nav.k9.los.nyoppgavestyring.visningoguttrekk.OppgaveRepository | ||
import java.time.Duration | ||
import java.time.LocalDateTime | ||
|
||
class PepCacheService( | ||
private val pepClient: IPepClient, | ||
private val pepCacheRepository: PepCacheRepository, | ||
private val oppgaveRepository: OppgaveRepository, | ||
private val transactionalManager: TransactionalManager, | ||
) { | ||
|
||
suspend fun hentOgOppdaterVedBehov(tx: TransactionalSession, oppgave: Oppgave, maksimalAlder: Duration = Duration.ofMinutes(30)): PepCache { | ||
return pepCacheRepository.hent(kildeområde = oppgave.kildeområde, eksternId = oppgave.eksternId, tx).let { pepCache -> | ||
if (pepCache?.erGyldig(maksimalAlder) != true) { | ||
oppdater(tx, oppgave) | ||
} else { | ||
pepCache | ||
} | ||
} | ||
} | ||
|
||
fun oppdaterCacheForOppgaverEldreEnn(gyldighet: Duration = Duration.ofHours(23)) { | ||
transactionalManager.transaction { tx -> | ||
runBlocking { | ||
val oppgaverSomMåOppdateres = oppgaveRepository.hentÅpneOgVentendeOppgaverMedPepCacheEldreEnn( | ||
tidspunkt = LocalDateTime.now() - gyldighet, | ||
antall = 1, | ||
tx | ||
) | ||
oppgaverSomMåOppdateres.forEach { oppgave -> oppdater(tx, oppgave) } | ||
} | ||
} | ||
} | ||
|
||
fun oppdater(tx: TransactionalSession, kildeområde: String, eksternId: String): PepCache { | ||
return runBlocking { | ||
val oppgave = oppgaveRepository.hentNyesteOppgaveForEksternId( | ||
tx, | ||
kildeområde = kildeområde, | ||
eksternId = eksternId | ||
) | ||
oppdater(tx, oppgave) | ||
} | ||
} | ||
|
||
suspend fun oppdater(tx: TransactionalSession, oppgave: Oppgave): PepCache { | ||
return lagPepCacheFra(oppgave).also { nyPepCache -> pepCacheRepository.lagre(nyPepCache, tx) } | ||
} | ||
|
||
private suspend fun lagPepCacheFra(oppgave: Oppgave): PepCache { | ||
val pep = PepCache( | ||
eksternId = oppgave.eksternId, | ||
kildeområde = oppgave.kildeområde, | ||
kode6 = true, | ||
kode7 = true, | ||
egenAnsatt = true, | ||
oppdatert = LocalDateTime.now() | ||
) | ||
|
||
val saksnummer = oppgave.hentVerdi(oppgave.kildeområde, "saksnummer") | ||
?: throw IllegalStateException("Kan ikke gjøre oppslag uten saksnummer ${oppgave.eksternId}") | ||
|
||
return pep.oppdater(saksnummer) | ||
} | ||
|
||
private suspend fun PepCache.oppdater(saksnummer: String): PepCache { | ||
return coroutineScope { | ||
val kode6Request = async { | ||
pepClient.erSakKode6(fagsakNummer = saksnummer) | ||
} | ||
val kode7EllerEgenAnsattRequest = async { | ||
pepClient.erSakKode7EllerEgenAnsatt(fagsakNummer = saksnummer) | ||
} | ||
val kode7EllerEgenAnsatt = kode7EllerEgenAnsattRequest.await() | ||
|
||
val oppdatertPepCache = oppdater( | ||
kode6 = kode6Request.await(), | ||
kode7 = kode7EllerEgenAnsatt, | ||
egenAnsatt = kode7EllerEgenAnsatt, | ||
) | ||
oppdatertPepCache | ||
} | ||
} | ||
} | ||
|
Oops, something went wrong.