diff --git a/gradle.properties b/gradle.properties index 544432366..c85201c91 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,7 +19,7 @@ utilsVersion=0.9.0 aaregClientVersion=0.7.0 altinnClientVersion=0.4.0 maskinportenClientVersion=0.1.9 -arbeidsgiverNotifikasjonKlientVersion=3.1.0 +arbeidsgiverNotifikasjonKlientVersion=3.2.0 brregKlientVersion=0.5.0 dokarkivKlientVersion=0.3.1 inntektKlientVersion=0.4.0 diff --git a/notifikasjon/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/App.kt b/notifikasjon/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/App.kt index d8e9603b8..1a92dbfbe 100644 --- a/notifikasjon/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/App.kt +++ b/notifikasjon/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/App.kt @@ -72,7 +72,10 @@ fun RapidsConnection.createNotifikasjonRivers( UtgaattForespoerselRiver(linkUrl, agNotifikasjonKlient).connect(this) logger.info("Starter ${FjernPaaminnelseRiver::class.simpleName}...") - FjernPaaminnelseRiver(agNotifikasjonKlient).connect(this) + FjernPaaminnelseRiver( + agNotifikasjonKlient = agNotifikasjonKlient, + paaminnelseToggle = paaminnelseToggle, + ).connect(this) } private fun buildClient(): ArbeidsgiverNotifikasjonKlient { diff --git a/notifikasjon/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/river/FjernPaaminnelseRiver.kt b/notifikasjon/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/river/FjernPaaminnelseRiver.kt index df5e08a12..1fced7e8c 100644 --- a/notifikasjon/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/river/FjernPaaminnelseRiver.kt +++ b/notifikasjon/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/river/FjernPaaminnelseRiver.kt @@ -1,7 +1,9 @@ package no.nav.helsearbeidsgiver.inntektsmelding.notifikasjon.river +import kotlinx.coroutines.runBlocking import kotlinx.serialization.json.JsonElement import no.nav.helsearbeidsgiver.arbeidsgivernotifikasjon.ArbeidsgiverNotifikasjonKlient +import no.nav.helsearbeidsgiver.arbeidsgivernotifikasjon.OppgaveAlleredeUtfoertException import no.nav.helsearbeidsgiver.arbeidsgivernotifikasjon.SakEllerOppgaveFinnesIkkeException import no.nav.helsearbeidsgiver.felles.EventName import no.nav.helsearbeidsgiver.felles.Key @@ -11,6 +13,8 @@ import no.nav.helsearbeidsgiver.felles.json.toJson import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Fail import no.nav.helsearbeidsgiver.felles.rapidsrivers.river.ObjectRiver import no.nav.helsearbeidsgiver.felles.utils.Log +import no.nav.helsearbeidsgiver.inntektsmelding.notifikasjon.NotifikasjonTekst +import no.nav.helsearbeidsgiver.inntektsmelding.notifikasjon.PaaminnelseToggle import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer import no.nav.helsearbeidsgiver.utils.log.logger import no.nav.helsearbeidsgiver.utils.log.sikkerLogger @@ -24,29 +28,11 @@ data class FjernPaaminnelseMelding( class FjernPaaminnelseRiver( val agNotifikasjonKlient: ArbeidsgiverNotifikasjonKlient, + private val paaminnelseToggle: PaaminnelseToggle, ) : ObjectRiver() { private val logger = logger() private val sikkerLogger = sikkerLogger() - override fun FjernPaaminnelseMelding.haandter(json: Map): Map? { - runCatching { - "FjernPaaminnelseRiver skulle her ha fjernet påminnelsen på oppgaven, men det er ikke implementert ennå.".also { - logger.info(it) - sikkerLogger.info(it) - } - }.onFailure { - if (it is SakEllerOppgaveFinnesIkkeException) { - logger.warn(it.message) - sikkerLogger.warn(it.message) - } else { - throw it - } - } - - // TODO: Send melding når påminnelsen er fjernet - return null - } - override fun les(json: Map): FjernPaaminnelseMelding? = if (Key.FAIL in json) { null @@ -58,6 +44,13 @@ class FjernPaaminnelseRiver( ) } + override fun FjernPaaminnelseMelding.haandter(json: Map): Map? { + if (paaminnelseToggle.oppgavePaaminnelseAktivert) { + slettOppgavePaaminnelser(forespoerselId = forespoerselId) + } + return null + } + override fun FjernPaaminnelseMelding.haandterFeil( json: Map, error: Throwable, @@ -84,4 +77,24 @@ class FjernPaaminnelseRiver( Log.transaksjonId(transaksjonId), Log.forespoerselId(forespoerselId), ) + + private fun slettOppgavePaaminnelser(forespoerselId: UUID) { + runCatching { + runBlocking { + agNotifikasjonKlient.slettOppgavePaaminnelserByEksternId( + merkelapp = NotifikasjonTekst.MERKELAPP, + eksternId = forespoerselId.toString(), + ) + } + }.onFailure { + when (it) { + is SakEllerOppgaveFinnesIkkeException, is OppgaveAlleredeUtfoertException -> { + logger.warn(it.message) + sikkerLogger.warn(it.message) + } + + else -> throw it + } + } + } } diff --git a/notifikasjon/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/river/FjernPaaminnelseRiverTest.kt b/notifikasjon/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/river/FjernPaaminnelseRiverTest.kt index e8c035736..547fb9546 100644 --- a/notifikasjon/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/river/FjernPaaminnelseRiverTest.kt +++ b/notifikasjon/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/river/FjernPaaminnelseRiverTest.kt @@ -3,13 +3,25 @@ package no.nav.helsearbeidsgiver.inntektsmelding.notifikasjon.river import com.github.navikt.tbd_libs.rapids_and_rivers.test_support.TestRapid import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.ints.shouldBeExactly +import io.kotest.matchers.maps.shouldContainExactly +import io.mockk.Runs import io.mockk.clearAllMocks +import io.mockk.coEvery +import io.mockk.coVerifySequence +import io.mockk.just import io.mockk.mockk import no.nav.helsearbeidsgiver.arbeidsgivernotifikasjon.ArbeidsgiverNotifikasjonKlient +import no.nav.helsearbeidsgiver.arbeidsgivernotifikasjon.OppgaveEndrePaaminnelseByEksternIdException +import no.nav.helsearbeidsgiver.arbeidsgivernotifikasjon.SakEllerOppgaveFinnesIkkeException import no.nav.helsearbeidsgiver.felles.EventName import no.nav.helsearbeidsgiver.felles.Key import no.nav.helsearbeidsgiver.felles.json.toJson +import no.nav.helsearbeidsgiver.felles.json.toMap +import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Fail +import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.firstMessage import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.sendJson +import no.nav.helsearbeidsgiver.inntektsmelding.notifikasjon.NotifikasjonTekst +import no.nav.helsearbeidsgiver.inntektsmelding.notifikasjon.PaaminnelseToggle import no.nav.helsearbeidsgiver.utils.json.toJson import java.util.UUID @@ -19,7 +31,16 @@ class FjernPaaminnelseRiverTest : val testRapid = TestRapid() val mockagNotifikasjonKlient = mockk() - FjernPaaminnelseRiver(mockagNotifikasjonKlient) + val mockPaaminnelseToggle = + PaaminnelseToggle( + oppgavePaaminnelseAktivert = true, + tidMellomOppgaveopprettelseOgPaaminnelse = "P28D", + ) + + FjernPaaminnelseRiver( + agNotifikasjonKlient = mockagNotifikasjonKlient, + paaminnelseToggle = mockPaaminnelseToggle, + ).connect(testRapid) beforeTest { testRapid.reset() @@ -27,15 +48,104 @@ class FjernPaaminnelseRiverTest : } test("fjern påminnelse for forespørsel") { - val innkommendeMelding = - mapOf( - Key.EVENT_NAME to EventName.FORESPOERSEL_KASTET_TIL_INFOTRYGD.toJson(), - Key.UUID to UUID.randomUUID().toJson(), - Key.FORESPOERSEL_ID to UUID.randomUUID().toJson(), + val innkommendeMelding = innkommendeFjernPaaminnelseMelding() + + coEvery { mockagNotifikasjonKlient.slettOppgavePaaminnelserByEksternId(any(), any()) } just Runs + + testRapid.sendJson(innkommendeMelding.toMap()) + + coVerifySequence { + mockagNotifikasjonKlient.slettOppgavePaaminnelserByEksternId( + NotifikasjonTekst.MERKELAPP, + innkommendeMelding.forespoerselId.toString(), + ) + } + + testRapid.inspektør.size shouldBeExactly 0 + } + + test("ukjent feil ved sletting av påminnelser håndteres") { + val innkommendeMelding = innkommendeFjernPaaminnelseMelding() + + coEvery { mockagNotifikasjonKlient.slettOppgavePaaminnelserByEksternId(any(), any()) } throws + OppgaveEndrePaaminnelseByEksternIdException( + innkommendeMelding.forespoerselId.toString(), + "mock feil", + ) + + testRapid.sendJson(innkommendeMelding.toMap()) + + coVerifySequence { + mockagNotifikasjonKlient.slettOppgavePaaminnelserByEksternId( + NotifikasjonTekst.MERKELAPP, + innkommendeMelding.forespoerselId.toString(), + ) + } + + testRapid.inspektør.size shouldBeExactly 1 + + testRapid.firstMessage().toMap() shouldContainExactly forventetFail(innkommendeMelding).tilMelding() + } + + test("kaster ingen exception dersom oppgaven ikke finnes") { + val innkommendeMelding = innkommendeFjernPaaminnelseMelding() + + coEvery { + mockagNotifikasjonKlient.slettOppgavePaaminnelserByEksternId( + any(), + any(), + ) + } throws SakEllerOppgaveFinnesIkkeException("Sak eller oppgave finnes ikke.") + + testRapid.sendJson(innkommendeMelding.toMap()) + + coVerifySequence { + mockagNotifikasjonKlient.slettOppgavePaaminnelserByEksternId( + NotifikasjonTekst.MERKELAPP, + innkommendeMelding.forespoerselId.toString(), ) + } + + testRapid.inspektør.size shouldBeExactly 0 + } + + test("kaster ikke exception dersom oppgaven allerede er utført") { + val innkommendeMelding = innkommendeFjernPaaminnelseMelding() + + coEvery { mockagNotifikasjonKlient.slettOppgavePaaminnelserByEksternId(any(), any()) } just Runs + + testRapid.sendJson(innkommendeMelding.toMap()) - testRapid.sendJson(innkommendeMelding) + coVerifySequence { + mockagNotifikasjonKlient.slettOppgavePaaminnelserByEksternId( + NotifikasjonTekst.MERKELAPP, + innkommendeMelding.forespoerselId.toString(), + ) + } testRapid.inspektør.size shouldBeExactly 0 } }) + +private fun forventetFail(innkommendeMelding: FjernPaaminnelseMelding): Fail = + Fail( + feilmelding = "Klarte ikke fjerne påminnelse fra oppgave.", + event = innkommendeMelding.eventName, + transaksjonId = innkommendeMelding.transaksjonId, + forespoerselId = innkommendeMelding.forespoerselId, + utloesendeMelding = innkommendeMelding.toMap().toJson(), + ) + +private fun FjernPaaminnelseMelding.toMap() = + mapOf( + Key.EVENT_NAME to eventName.toJson(), + Key.UUID to transaksjonId.toJson(), + Key.FORESPOERSEL_ID to forespoerselId.toJson(), + ) + +fun innkommendeFjernPaaminnelseMelding(): FjernPaaminnelseMelding = + FjernPaaminnelseMelding( + eventName = EventName.FORESPOERSEL_KASTET_TIL_INFOTRYGD, + transaksjonId = UUID.randomUUID(), + forespoerselId = UUID.randomUUID(), + )