Skip to content

Commit

Permalink
Erstatt perisisterIMskjemaloeser med en ny river som støtter stateless
Browse files Browse the repository at this point in the history
  • Loading branch information
magnusae committed Aug 2, 2024
1 parent cfcddf2 commit c83314a
Show file tree
Hide file tree
Showing 6 changed files with 117 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
)
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Key, JsonElement>,
val forespoerselId: UUID,
val inntektsmeldingSkjema: Innsending,
)

class PersisterImSkjemaRiver(
private val repository: InntektsmeldingRepository,
) : ObjectRiver<PersisterImSkjemaMelding>() {
private val logger = logger()
private val sikkerLogger = sikkerLogger()

override fun les(json: Map<Key, JsonElement>): 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<Key, JsonElement>): Map<Key, JsonElement> {
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<Key, JsonElement>,
error: Throwable,
): Map<Key, JsonElement> {
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<String, String> =
mapOf(
Log.klasse(this@PersisterImSkjemaRiver),
Log.event(eventName),
Log.behov(behovType),
Log.transaksjonId(transaksjonId),
Log.forespoerselId(forespoerselId),
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ class InnsendingService(
override val dataKeys =
setOf(
Key.ER_DUPLIKAT_IM,
Key.PERSISTERT_SKJEMA_INNTEKTSMELDING,
)

override fun lesSteg0(melding: Map<Key, JsonElement>): Steg0 =
Expand All @@ -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) }
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit c83314a

Please sign in to comment.