diff --git a/db/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/App.kt b/db/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/App.kt index 15518ec610..e69f089c9e 100644 --- a/db/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/App.kt +++ b/db/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/App.kt @@ -12,7 +12,7 @@ import no.nav.helsearbeidsgiver.inntektsmelding.db.river.LagreJournalpostIdRiver import no.nav.helsearbeidsgiver.inntektsmelding.db.river.LagreSelvbestemtImRiver import no.nav.helsearbeidsgiver.inntektsmelding.db.river.NotifikasjonHentIdLoeser import no.nav.helsearbeidsgiver.inntektsmelding.db.river.PersisterImLoeser -import no.nav.helsearbeidsgiver.inntektsmelding.db.river.PersisterImSkjemaLoeser +import no.nav.helsearbeidsgiver.inntektsmelding.db.river.PersisterImSkjemaRiver import no.nav.helsearbeidsgiver.inntektsmelding.db.river.PersisterOppgaveLoeser import no.nav.helsearbeidsgiver.inntektsmelding.db.river.PersisterSakLoeser import no.nav.helsearbeidsgiver.utils.log.logger @@ -51,8 +51,8 @@ fun RapidsConnection.createDbRivers( logger.info("Starter ${PersisterImLoeser::class.simpleName}...") PersisterImLoeser(this, imRepo) - logger.info("Starter ${PersisterImSkjemaLoeser::class.simpleName}...") - PersisterImSkjemaLoeser(this, imRepo) + logger.info("Starter ${PersisterImSkjemaRiver::class.simpleName}...") + PersisterImSkjemaRiver(imRepo).connect(this) logger.info("Starter ${HentLagretImRiver::class.simpleName}...") HentLagretImRiver(imRepo).connect(this) diff --git a/db/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/river/PersisterImSkjemaLoeser.kt b/db/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/river/PersisterImSkjemaLoeser.kt index 396e70cf37..a11b031209 100644 --- a/db/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/river/PersisterImSkjemaLoeser.kt +++ b/db/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/river/PersisterImSkjemaLoeser.kt @@ -80,7 +80,6 @@ class PersisterImSkjemaLoeser( eventName = behov.event, transaksjonId = transaksjonId, forespoerselId = forespoerselId, - Key.PERSISTERT_SKJEMA_INNTEKTSMELDING to inntektsmeldingSkjema.toJson(Innsending.serializer()), Key.ER_DUPLIKAT_IM to erDuplikat.toJson(Boolean.serializer()), *bumerangdata, ) diff --git a/db/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/river/PersisterImSkjemaRiver.kt b/db/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/river/PersisterImSkjemaRiver.kt new file mode 100644 index 0000000000..c481d9bfa7 --- /dev/null +++ b/db/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/river/PersisterImSkjemaRiver.kt @@ -0,0 +1,106 @@ +package no.nav.helsearbeidsgiver.inntektsmelding.db.river + +import kotlinx.serialization.builtins.serializer +import kotlinx.serialization.json.JsonElement +import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Innsending +import no.nav.helsearbeidsgiver.felles.BehovType +import no.nav.helsearbeidsgiver.felles.EventName +import no.nav.helsearbeidsgiver.felles.Key +import no.nav.helsearbeidsgiver.felles.json.krev +import no.nav.helsearbeidsgiver.felles.json.les +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.rapidsrivers.river.ObjectRiver +import no.nav.helsearbeidsgiver.felles.utils.Log +import no.nav.helsearbeidsgiver.inntektsmelding.db.InntektsmeldingRepository +import no.nav.helsearbeidsgiver.inntektsmelding.db.erDuplikatAv +import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer +import no.nav.helsearbeidsgiver.utils.json.toJson +import no.nav.helsearbeidsgiver.utils.log.logger +import no.nav.helsearbeidsgiver.utils.log.sikkerLogger +import java.util.UUID + +data class PersisterImSkjemaMelding( + val eventName: EventName, + val behovType: BehovType, + val transaksjonId: UUID, + val data: Map, + val forespoerselId: UUID, + val inntektsmeldingSkjema: Innsending, +) + +class PersisterImSkjemaRiver( + private val repository: InntektsmeldingRepository, +) : ObjectRiver() { + private val logger = logger() + private val sikkerLogger = sikkerLogger() + + override fun les(json: Map): PersisterImSkjemaMelding? = + if (Key.FAIL in json) { + null + } else { + val data = json[Key.DATA]?.toMap().orEmpty() + PersisterImSkjemaMelding( + eventName = Key.EVENT_NAME.les(EventName.serializer(), json), + behovType = Key.BEHOV.krev(BehovType.PERSISTER_IM_SKJEMA, BehovType.serializer(), json), + transaksjonId = Key.UUID.les(UuidSerializer, json), + data = data, + forespoerselId = Key.FORESPOERSEL_ID.les(UuidSerializer, data), + inntektsmeldingSkjema = Key.SKJEMA_INNTEKTSMELDING.les(Innsending.serializer(), data), + ) + } + + override fun PersisterImSkjemaMelding.haandter(json: Map): Map { + val sisteIm = repository.hentNyesteInntektsmeldingSkjema(forespoerselId) + val sisteImSkjema = repository.hentNyesteInntektsmeldingSkjema(forespoerselId) + + val erDuplikat = + sisteIm?.erDuplikatAv(inntektsmeldingSkjema) ?: false || + sisteImSkjema?.erDuplikatAv(inntektsmeldingSkjema) ?: false + + if (erDuplikat) { + sikkerLogger.warn("Fant duplikat av inntektsmelding for forespoerselId: $forespoerselId") + } else { + repository.lagreInntektsmeldingSkjema(forespoerselId.toString(), inntektsmeldingSkjema) + sikkerLogger.info("Lagret inntektsmeldingskjema for forespoerselId: $forespoerselId") + } + return mapOf( + Key.EVENT_NAME to eventName.toJson(), + Key.UUID to transaksjonId.toJson(), + Key.DATA to + data + .plus( + Key.ER_DUPLIKAT_IM to erDuplikat.toJson(Boolean.serializer()), + ).toJson(), + ) + } + + override fun PersisterImSkjemaMelding.haandterFeil( + json: Map, + error: Throwable, + ): Map { + val fail = + Fail( + feilmelding = "Klarte ikke lagre inntektsmeldingskjema.", + event = eventName, + transaksjonId = transaksjonId, + forespoerselId = forespoerselId, + utloesendeMelding = json.toJson(), + ) + + logger.error(fail.feilmelding) + sikkerLogger.error(fail.feilmelding, error) + + return fail.tilMelding() + } + + override fun PersisterImSkjemaMelding.loggfelt(): Map = + mapOf( + Log.klasse(this@PersisterImSkjemaRiver), + Log.event(eventName), + Log.behov(behovType), + Log.transaksjonId(transaksjonId), + Log.forespoerselId(forespoerselId), + ) +} diff --git a/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/Key.kt b/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/Key.kt index 39d8cdc8a4..dec530faa3 100644 --- a/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/Key.kt +++ b/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/Key.kt @@ -37,7 +37,6 @@ enum class Key( ARBEIDSFORHOLD("arbeidsforhold"), SAK_ID("sak_id"), PERSISTERT_SAK_ID("persistert_sak_id"), - PERSISTERT_SKJEMA_INNTEKTSMELDING("persistert_skjema_inntektsmelding"), OPPGAVE_ID("oppgave_id"), ORGNRUNDERENHET("orgnrUnderenhet"), ORGNR_UNDERENHETER("orgnr_underenheter"), diff --git a/innsending/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/innsending/InnsendingService.kt b/innsending/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/innsending/InnsendingService.kt index f7ac7d4a32..93f0130370 100644 --- a/innsending/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/innsending/InnsendingService.kt +++ b/innsending/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/innsending/InnsendingService.kt @@ -54,7 +54,6 @@ class InnsendingService( override val dataKeys = setOf( Key.ER_DUPLIKAT_IM, - Key.PERSISTERT_SKJEMA_INNTEKTSMELDING, ) override fun lesSteg0(melding: Map): Steg0 = @@ -76,8 +75,11 @@ class InnsendingService( Key.EVENT_NAME to eventName.toJson(), Key.BEHOV to BehovType.PERSISTER_IM_SKJEMA.toJson(), Key.UUID to steg0.transaksjonId.toJson(), - Key.FORESPOERSEL_ID to steg0.forespoerselId.toJson(), - Key.SKJEMA_INNTEKTSMELDING to steg0.skjema, + Key.DATA to + mapOf( + Key.FORESPOERSEL_ID to steg0.forespoerselId.toJson(), + Key.SKJEMA_INNTEKTSMELDING to steg0.skjema, + ).toJson(), ).also { loggBehovPublisert(BehovType.PERSISTER_IM_SKJEMA, it) } } diff --git a/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/InnsendingServiceIT.kt b/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/InnsendingServiceIT.kt index 8117918e3f..2e30dec7e0 100644 --- a/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/InnsendingServiceIT.kt +++ b/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/InnsendingServiceIT.kt @@ -1,7 +1,6 @@ package no.nav.helsearbeidsgiver.inntektsmelding.integrasjonstest import io.kotest.assertions.throwables.shouldNotThrowAny -import io.kotest.matchers.maps.shouldContainKey import io.kotest.matchers.nulls.shouldNotBeNull import io.kotest.matchers.shouldBe import io.mockk.coEvery @@ -71,23 +70,13 @@ class InnsendingServiceIT : EndToEndTest() { // Inntektsmelding lagret messages .filter(EventName.INSENDING_STARTED) - .filter(Key.PERSISTERT_SKJEMA_INNTEKTSMELDING) - .filter(Key.ER_DUPLIKAT_IM) + .filter(Key.ER_DUPLIKAT_IM, nestedData = true) .firstAsMap() .verifiserTransaksjonId(transaksjonId) .verifiserForespoerselId() .also { - it shouldContainKey Key.DATA - - shouldNotThrowAny { - it[Key.PERSISTERT_SKJEMA_INNTEKTSMELDING] - .shouldNotBeNull() - .fromJson(Innsending.serializer()) - - it[Key.ER_DUPLIKAT_IM] - .shouldNotBeNull() - .fromJson(Boolean.serializer()) - } + val data = it[Key.DATA].shouldNotBeNull().toMap() + data[Key.ER_DUPLIKAT_IM]?.fromJson(Boolean.serializer()) shouldBe false } // Siste melding fra service