From 1a23dbc6bf801d9e3373792f7e1061898605b099 Mon Sep 17 00:00:00 2001 From: Tore Langedal Endestad Date: Wed, 28 Aug 2024 16:50:05 +0200 Subject: [PATCH] Fix: punsj-oppgaver kode7 (#2572) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix: punsj-oppgaver kode7 * død kode * import * håndter null * håndter null --- .../nav/k9/los/integrasjon/abac/PepClient.kt | 1 + .../K9PunsjTilLosAdapterTjeneste.kt | 4 +- .../oppgavetype/OppgavetypeRepository.kt | 2 +- .../nyoppgavestyring/pep/PepCacheService.kt | 48 ++++------ src/test/kotlin/no/nav/k9/los/KoinModules.kt | 4 +- .../pep/PepCacheServiceTest.kt | 95 +++++++++++++++++++ 6 files changed, 118 insertions(+), 36 deletions(-) diff --git a/src/main/kotlin/no/nav/k9/los/integrasjon/abac/PepClient.kt b/src/main/kotlin/no/nav/k9/los/integrasjon/abac/PepClient.kt index 22a787cd0..00086aeaf 100644 --- a/src/main/kotlin/no/nav/k9/los/integrasjon/abac/PepClient.kt +++ b/src/main/kotlin/no/nav/k9/los/integrasjon/abac/PepClient.kt @@ -23,6 +23,7 @@ import no.nav.k9.los.integrasjon.rest.NavHeaders import no.nav.k9.los.utils.Cache import no.nav.k9.los.utils.CacheObject import no.nav.k9.los.utils.LosObjectMapper +import no.nav.k9.sak.typer.AktørId import org.slf4j.Logger import org.slf4j.LoggerFactory import java.time.Duration diff --git a/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/domeneadaptere/k9/punsjtillos/K9PunsjTilLosAdapterTjeneste.kt b/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/domeneadaptere/k9/punsjtillos/K9PunsjTilLosAdapterTjeneste.kt index 9cfad46a3..391f1839e 100644 --- a/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/domeneadaptere/k9/punsjtillos/K9PunsjTilLosAdapterTjeneste.kt +++ b/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/domeneadaptere/k9/punsjtillos/K9PunsjTilLosAdapterTjeneste.kt @@ -54,6 +54,7 @@ class K9PunsjTilLosAdapterTjeneste( spillAvBehandlingProsessEventer() } } + private fun schedulerAvspilling() { log.info("Schedulerer avspilling av BehandlingProsessEventer til å kjøre 3m fra nå, hver time") timer( @@ -109,8 +110,7 @@ class K9PunsjTilLosAdapterTjeneste( val oppgave = oppgaveV3Tjeneste.sjekkDuplikatOgProsesser(oppgaveDto, tx) if (oppgave != null) { - // TODO: Kallet under fungerer ikke, siden den er avhengig av feltverdi 'saksnummer'. Vurder om skal endres eller slettes. - // pepCacheService.oppdater(tx, oppgave.kildeområde, oppgave.eksternId) + pepCacheService.oppdater(tx, oppgave.kildeområde, oppgave.eksternId) annullerReservasjonHvisPåVentEllerAvsluttet(oppgave, tx) // Flere tilfeller som skal håndteres her? diff --git a/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/mottak/oppgavetype/OppgavetypeRepository.kt b/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/mottak/oppgavetype/OppgavetypeRepository.kt index 9bd694a31..53c51f437 100644 --- a/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/mottak/oppgavetype/OppgavetypeRepository.kt +++ b/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/mottak/oppgavetype/OppgavetypeRepository.kt @@ -46,7 +46,7 @@ class OppgavetypeRepository( fun hentOppgavetype(område: Område, eksternId: String, tx: TransactionalSession): Oppgavetype { return hent(område, tx).oppgavetyper.find { it.eksternId == eksternId } - ?: throw IllegalArgumentException("Finner ikke oppgavetype: ${eksternId} for område: ${område}") + ?: throw IllegalArgumentException("Finner ikke oppgavetype: ${eksternId} for område: ${område.eksternId}") } fun hentOppgavetype(område: String, oppgavetypeId: Long, tx: TransactionalSession): Oppgavetype { diff --git a/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/pep/PepCacheService.kt b/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/pep/PepCacheService.kt index dd4aa0053..a1329ad1a 100644 --- a/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/pep/PepCacheService.kt +++ b/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/pep/PepCacheService.kt @@ -19,19 +19,9 @@ class PepCacheService( private val pepClient: IPepClient, private val pepCacheRepository: PepCacheRepository, private val oppgaveRepository: OppgaveRepository, - private val transactionalManager: TransactionalManager, + 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 - } - } - } - @WithSpan fun oppdaterCacheForÅpneOgVentendeOppgaverEldreEnn(gyldighet: Duration = Duration.ofHours(23)) { oppdaterCacheForOppgaverMedStatusEldreEnn(gyldighet, setOf(Oppgavestatus.VENTER, Oppgavestatus.AAPEN)) @@ -85,20 +75,20 @@ class PepCacheService( ) val saksnummer = oppgave.hentVerdi(oppgave.kildeområde, "saksnummer") - return if (saksnummer != null){ + return if (saksnummer != null) { pep.oppdater(saksnummer) } else { - val aktører = validerMinstEn(hentAktører(oppgave)) + val aktører = hentAktører(oppgave) pep.oppdater(aktører) } } private suspend fun PepCache.oppdater(saksnummer: String): PepCache { return coroutineScope { - val kode6Request = async (Span.current().asContextElement()) { + val kode6Request = async(Span.current().asContextElement()) { pepClient.erSakKode6(fagsakNummer = saksnummer) } - val kode7EllerEgenAnsattRequest = async (Span.current().asContextElement()) { + val kode7EllerEgenAnsattRequest = async(Span.current().asContextElement()) { pepClient.erSakKode7EllerEgenAnsatt(fagsakNummer = saksnummer) } val kode7EllerEgenAnsatt = kode7EllerEgenAnsattRequest.await() @@ -113,42 +103,36 @@ class PepCacheService( } private suspend fun PepCache.oppdater(aktører: List): PepCache { + if (aktører.isEmpty()){ + return oppdater(kode6 = false, kode7 = false, egenAnsatt = false) + } return coroutineScope { val kode6Request = aktører.map { - async (Span.current().asContextElement()) { + async(Span.current().asContextElement()) { pepClient.erAktørKode6(it.aktørId) } } val kode7EllerEgenAnsattRequest = aktører.map { - async (Span.current().asContextElement()) { - pepClient.erSakKode7EllerEgenAnsatt(it.aktørId) + async(Span.current().asContextElement()) { + pepClient.erAktørKode7EllerEgenAnsatt(it.aktørId) } } val minsteEnKode6 = kode6Request .map { it.await() } - .reduce {a, b -> a || b} + .reduce { a, b -> a || b } val minsteEnKode7EllerEgenAnsatt = kode7EllerEgenAnsattRequest .map { it.await() } - .reduce {a, b -> a || b} - - val oppdatertPepCache = oppdater( + .reduce { a, b -> a || b } + oppdater( kode6 = minsteEnKode6, kode7 = minsteEnKode7EllerEgenAnsatt, egenAnsatt = minsteEnKode7EllerEgenAnsatt, ) - oppdatertPepCache - } - } - - private fun > validerMinstEn(input : T) : T { - if (input.isEmpty() ){ - throw IllegalArgumentException("Forventet minst ett element, fikk ingen") } - return input } - private fun hentAktører(oppgave: Oppgave) : List { + private fun hentAktører(oppgave: Oppgave): List { return listOfNotNull( oppgave.hentVerdi(oppgave.kildeområde, "aktorId"), oppgave.hentVerdi(oppgave.kildeområde, "pleietrengendeAktorId"), @@ -156,7 +140,7 @@ class PepCacheService( ).map { AktørId(it) } } + private data class AktørId(val aktørId: String) - private data class AktørId (val aktørId: String) } diff --git a/src/test/kotlin/no/nav/k9/los/KoinModules.kt b/src/test/kotlin/no/nav/k9/los/KoinModules.kt index 57935aecf..5d42b17d4 100644 --- a/src/test/kotlin/no/nav/k9/los/KoinModules.kt +++ b/src/test/kotlin/no/nav/k9/los/KoinModules.kt @@ -72,6 +72,8 @@ import javax.sql.DataSource fun buildAndTestConfig(dataSource: DataSource, pepClient: IPepClient = PepClientLocal()): Module = module { + val config = mockk() + single(named("oppgaveKøOppdatert")) { Channel(Channel.UNLIMITED) } @@ -152,7 +154,7 @@ fun buildAndTestConfig(dataSource: DataSource, pepClient: IPepClient = PepClient saksbehandlerRepository = get() ) } - val config = mockk() + single { config } diff --git a/src/test/kotlin/no/nav/k9/los/nyoppgavestyring/pep/PepCacheServiceTest.kt b/src/test/kotlin/no/nav/k9/los/nyoppgavestyring/pep/PepCacheServiceTest.kt index 75e77825b..d2f9df916 100644 --- a/src/test/kotlin/no/nav/k9/los/nyoppgavestyring/pep/PepCacheServiceTest.kt +++ b/src/test/kotlin/no/nav/k9/los/nyoppgavestyring/pep/PepCacheServiceTest.kt @@ -11,6 +11,8 @@ import io.mockk.verify import kotlinx.coroutines.runBlocking import no.nav.helse.dusseldorf.ktor.jackson.dusseldorfConfigured import no.nav.k9.los.AbstractPostgresTest +import no.nav.k9.los.Configuration +import no.nav.k9.los.aksjonspunktbehandling.K9punsjEventHandler import no.nav.k9.los.aksjonspunktbehandling.K9sakEventHandler import no.nav.k9.los.buildAndTestConfig import no.nav.k9.los.domene.lager.oppgave.v2.TransactionalManager @@ -19,8 +21,11 @@ import no.nav.k9.los.integrasjon.abac.Action import no.nav.k9.los.integrasjon.abac.IPepClient import no.nav.k9.los.integrasjon.kafka.dto.BehandlingProsessEventDto import no.nav.k9.los.integrasjon.kafka.dto.EventHendelse +import no.nav.k9.los.integrasjon.kafka.dto.PunsjEventDto +import no.nav.k9.los.integrasjon.kafka.dto.PunsjId import no.nav.k9.los.nyoppgavestyring.FeltType import no.nav.k9.los.nyoppgavestyring.domeneadaptere.k9.OmrådeSetup +import no.nav.k9.los.nyoppgavestyring.domeneadaptere.k9.punsjtillos.K9PunsjTilLosAdapterTjeneste import no.nav.k9.los.nyoppgavestyring.domeneadaptere.k9.saktillos.K9SakTilLosAdapterTjeneste import no.nav.k9.los.nyoppgavestyring.kodeverk.BeskyttelseType import no.nav.k9.los.nyoppgavestyring.query.OppgaveQueryService @@ -31,6 +36,8 @@ import no.nav.k9.los.nyoppgavestyring.query.dto.query.FeltverdiOppgavefilter import no.nav.k9.los.nyoppgavestyring.query.dto.query.OppgaveQuery import no.nav.k9.los.nyoppgavestyring.query.mapping.OppgavefilterUtvider import no.nav.k9.los.nyoppgavestyring.visningoguttrekk.OppgaveRepository +import no.nav.k9.sak.typer.AktørId +import no.nav.k9.sak.typer.JournalpostId import org.intellij.lang.annotations.Language import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -67,6 +74,8 @@ class PepCacheServiceTest : KoinTest, AbstractPostgresTest() { områdeSetup.setup() val k9SakTilLosAdapterTjeneste = get() k9SakTilLosAdapterTjeneste.setup() + val k9PunsjTilLosAdapterTjeneste = get() + k9PunsjTilLosAdapterTjeneste.setup() } fun gjørSakKode6(saksnummer: String) { @@ -83,6 +92,27 @@ class PepCacheServiceTest : KoinTest, AbstractPostgresTest() { } } + fun gjørAktørKode6(aktørId: String) { + runBlocking { + coEvery { pepClient.erAktørKode6(eq(aktørId)) } returns true + coEvery { pepClient.erAktørKode7EllerEgenAnsatt(eq(aktørId)) } returns false + } + } + + fun gjørAktørKode7(aktørId: String) { + runBlocking { + coEvery { pepClient.erAktørKode6(eq(aktørId)) } returns false + coEvery { pepClient.erAktørKode7EllerEgenAnsatt(eq(aktørId)) } returns true + } + } + + fun gjørAktørOrdinær(aktørId: String) { + runBlocking { + coEvery { pepClient.erAktørKode6(eq(aktørId)) } returns false + coEvery { pepClient.erAktørKode7EllerEgenAnsatt(eq(aktørId)) } returns false + } + } + @Test fun `Alle ordinære eventer på K9sakEventHandler skal oppdatere pepcache for å alltid få med aktørendringer i sak`() { @@ -101,6 +131,56 @@ class PepCacheServiceTest : KoinTest, AbstractPostgresTest() { assertThat(pepCache.oppdatert).isGreaterThan(LocalDateTime.now().minusMinutes(1)) } + @Test + fun `Alle ordinære eventer på K9punsjEventHandler skal oppdatere pepcache for å alltid få med aktørendringer i sak`() { + val k9punsjEventHandler = get() + val pepRepository = get() + + val aktørId = "1234567890123" + val eksternId = UUID.randomUUID().toString() + gjørAktørOrdinær(aktørId) + k9punsjEventHandler.prosesser(lagPunsjBehandlingprosessEventMedStatus(eksternId, aktørId)) + + val pepCache = pepRepository.hent("K9", eksternId)!! + assertThat(pepCache.kode6).isFalse() + assertThat(pepCache.kode7).isFalse() + assertThat(pepCache.egenAnsatt).isFalse() + assertThat(pepCache.oppdatert).isGreaterThan(LocalDateTime.now().minusMinutes(1)) + } + + @Test + fun `Eventer i K9punsjEventHandler med kode6 skal oppdatere pepcache`() { + val k9punsjEventHandler = get() + val pepRepository = get() + + val aktørId = "1234567890123" + val eksternId = UUID.randomUUID().toString() + gjørAktørKode6(aktørId) + k9punsjEventHandler.prosesser(lagPunsjBehandlingprosessEventMedStatus(eksternId, aktørId)) + + val pepCache = pepRepository.hent("K9", eksternId)!! + assertThat(pepCache.kode6).isTrue() + assertThat(pepCache.kode7).isFalse() + assertThat(pepCache.egenAnsatt).isFalse() + assertThat(pepCache.oppdatert).isGreaterThan(LocalDateTime.now().minusMinutes(1)) + } + + @Test + fun `Eventer i K9punsjEventHandler med kode7 skal oppdatere pepcache`() { + val k9punsjEventHandler = get() + val pepRepository = get() + + val aktørId = "1234567890123" + val eksternId = UUID.randomUUID().toString() + gjørAktørKode7(aktørId) + k9punsjEventHandler.prosesser(lagPunsjBehandlingprosessEventMedStatus(eksternId, aktørId)) + + val pepCache = pepRepository.hent("K9", eksternId)!! + assertThat(pepCache.kode6).isFalse() + assertThat(pepCache.kode7).isTrue() + assertThat(pepCache.oppdatert).isGreaterThan(LocalDateTime.now().minusMinutes(1)) + } + @Test fun `Eventer i K9sakEventHandler med kode6 skal oppdatere pepcache`() { val k9sakEventHandler = get() @@ -280,6 +360,21 @@ class PepCacheServiceTest : KoinTest, AbstractPostgresTest() { return objectMapper.readValue(json, BehandlingProsessEventDto::class.java) } + private fun lagPunsjBehandlingprosessEventMedStatus( + eksternId: String, + aktørId: String, + eventTid: LocalDateTime = LocalDateTime.now(), + ): PunsjEventDto { + + return PunsjEventDto( + eksternId = UUID.fromString(eksternId), + journalpostId = JournalpostId("1"), + eventTid = eventTid, + aktørId = AktørId(aktørId), + aksjonspunktKoderMedStatusListe = mutableMapOf(), + ) + } + private fun ventPåAntallForsøk(antall: Int, beskrivelse: String = "", f: () -> Boolean) { for (i in 0..antall) { Thread.sleep(500)