diff --git a/config/forespoersel-infotrygd/dev-gcp.yml b/config/forespoersel-infotrygd/dev-gcp.yml new file mode 100644 index 000000000..9997739f5 --- /dev/null +++ b/config/forespoersel-infotrygd/dev-gcp.yml @@ -0,0 +1,4 @@ +kafkaPool: nav-dev +env: + - name: KAFKA_EXTRA_TOPIC + value: helsearbeidsgiver.pri diff --git a/config/forespoersel-infotrygd/prod-gcp.yml b/config/forespoersel-infotrygd/prod-gcp.yml new file mode 100644 index 000000000..e6435e036 --- /dev/null +++ b/config/forespoersel-infotrygd/prod-gcp.yml @@ -0,0 +1,4 @@ +kafkaPool: nav-prod +env: + - name: KAFKA_EXTRA_TOPIC + value: helsearbeidsgiver.pri diff --git a/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/EventTypes.kt b/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/EventTypes.kt index 6a63fa835..8e69194c5 100644 --- a/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/EventTypes.kt +++ b/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/EventTypes.kt @@ -68,6 +68,7 @@ enum class EventName { FORESPOERSEL_BESVART, FORESPØRSEL_LAGRET, FORESPOERSEL_FORKASTET, + FORESPOERSEL_KASTET_TIL_INFOTRYGD, SAK_OPPRETT_REQUESTED, SAK_OPPRETTET, diff --git a/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/pritopic/Pri.kt b/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/pritopic/Pri.kt index e0b384eb1..9797a0c9a 100644 --- a/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/pritopic/Pri.kt +++ b/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/pritopic/Pri.kt @@ -60,6 +60,7 @@ object Pri { FORESPOERSEL_BESVART, FORESPOERSEL_BESVART_SIMBA, FORESPOERSEL_FORKASTET, + FORESPOERSEL_KASTET_TIL_INFOTRYGD, } internal object KeySerializer : AsStringSerializer( diff --git a/forespoersel-forkastet/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/forespoerselforkastet/ForespoerselForkastetRiver.kt b/forespoersel-forkastet/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/forespoerselforkastet/ForespoerselForkastetRiver.kt index 2628f7a36..783d7cd48 100644 --- a/forespoersel-forkastet/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/forespoerselforkastet/ForespoerselForkastetRiver.kt +++ b/forespoersel-forkastet/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/forespoerselforkastet/ForespoerselForkastetRiver.kt @@ -52,7 +52,7 @@ class ForespoerselForkastetRiver : PriObjectRiver() { json: Map, error: Throwable, ): Map? { - "Klarte ikke videresendre beskjed om forkastet forespørsel. Arbeidsgiver kan ha åpen sak og oppgave.".also { + "Klarte ikke videresende beskjed om forkastet forespørsel. Arbeidsgiver kan ha åpen sak og oppgave.".also { logger.error("$it Se sikker logg for mer info.") sikkerLogger.error(it, error) } diff --git a/forespoersel-infotrygd/build.gradle.kts b/forespoersel-infotrygd/build.gradle.kts new file mode 100644 index 000000000..e69de29bb diff --git a/forespoersel-infotrygd/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/forespoerselinfotrygd/App.kt b/forespoersel-infotrygd/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/forespoerselinfotrygd/App.kt new file mode 100644 index 000000000..028ceb18d --- /dev/null +++ b/forespoersel-infotrygd/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/forespoerselinfotrygd/App.kt @@ -0,0 +1,24 @@ +package no.nav.helsearbeidsgiver.inntektsmelding.forespoerselinfotrygd + +import com.github.navikt.tbd_libs.rapids_and_rivers_api.RapidsConnection +import no.nav.helse.rapids_rivers.RapidApplication +import no.nav.helsearbeidsgiver.utils.log.logger + +private val logger = "im-forespoersel-infotrygd".logger() + +fun main() { + logger.info("Jeg er oppe og kjører!") + + RapidApplication + .create(System.getenv()) + .createForespoerselKastetTilInfotrygdRiver() + .start() + + logger.info("Bye bye, baby, bye bye!") +} + +fun RapidsConnection.createForespoerselKastetTilInfotrygdRiver(): RapidsConnection = + also { + logger.info("Starter ${ForespoerselKastetTilInfotrygdRiver::class.simpleName}...") + ForespoerselKastetTilInfotrygdRiver().connect(this) + } diff --git a/forespoersel-infotrygd/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/forespoerselinfotrygd/ForespoerselKastetTilInfotrygdRiver.kt b/forespoersel-infotrygd/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/forespoerselinfotrygd/ForespoerselKastetTilInfotrygdRiver.kt new file mode 100644 index 000000000..08d55d9b1 --- /dev/null +++ b/forespoersel-infotrygd/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/forespoerselinfotrygd/ForespoerselKastetTilInfotrygdRiver.kt @@ -0,0 +1,68 @@ +package no.nav.helsearbeidsgiver.inntektsmelding.forespoerselinfotrygd + +import kotlinx.serialization.json.JsonElement +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.rapidsrivers.pritopic.Pri +import no.nav.helsearbeidsgiver.felles.rapidsrivers.pritopic.toPretty +import no.nav.helsearbeidsgiver.felles.rapidsrivers.river.PriObjectRiver +import no.nav.helsearbeidsgiver.felles.utils.Log +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 KastetTilInfotrygdMelding( + val notisType: Pri.NotisType, + val transaksjonId: UUID, + val forespoerselId: UUID, +) + +/** Tar imot notis om at en forespørsel om arbeidsgiveropplysninger er kastet til Infotrygd. */ +class ForespoerselKastetTilInfotrygdRiver : PriObjectRiver() { + private val logger = logger() + private val sikkerLogger = sikkerLogger() + + override fun les(json: Map): KastetTilInfotrygdMelding = + KastetTilInfotrygdMelding( + notisType = Pri.Key.NOTIS.krev(Pri.NotisType.FORESPOERSEL_KASTET_TIL_INFOTRYGD, Pri.NotisType.serializer(), json), + transaksjonId = UUID.randomUUID(), + forespoerselId = Pri.Key.FORESPOERSEL_ID.les(UuidSerializer, json), + ) + + override fun KastetTilInfotrygdMelding.haandter(json: Map): Map { + logger.info("Mottok melding på pri-topic om ${Pri.NotisType.FORESPOERSEL_KASTET_TIL_INFOTRYGD}.") + sikkerLogger.info("Mottok melding på pri-topic:\n${json.toPretty()}") + + return mapOf( + Key.EVENT_NAME to EventName.FORESPOERSEL_KASTET_TIL_INFOTRYGD.toJson(), + Key.UUID to transaksjonId.toJson(), + Key.FORESPOERSEL_ID to forespoerselId.toJson(), + ) + } + + override fun KastetTilInfotrygdMelding.haandterFeil( + json: Map, + error: Throwable, + ): Map? { + "Klarte ikke videresende beskjed om forespørsel kastet til Infotrygd. Arbeidsgiver kan motta purring selv om de har sendt inn IM gjennom Altinn." + .also { + logger.error("$it Se sikker logg for mer info.") + sikkerLogger.error(it, error) + } + + return null + } + + override fun KastetTilInfotrygdMelding.loggfelt(): Map = + mapOf( + Log.klasse(this@ForespoerselKastetTilInfotrygdRiver), + Log.priNotis(notisType), + Log.transaksjonId(transaksjonId), + Log.forespoerselId(forespoerselId), + ) +} diff --git a/forespoersel-infotrygd/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/forespoerselinfotrygd/ForespoerselKastetTilInfotrygdRiverTest.kt b/forespoersel-infotrygd/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/forespoerselinfotrygd/ForespoerselKastetTilInfotrygdRiverTest.kt new file mode 100644 index 000000000..f7208ed2a --- /dev/null +++ b/forespoersel-infotrygd/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/forespoerselinfotrygd/ForespoerselKastetTilInfotrygdRiverTest.kt @@ -0,0 +1,52 @@ +package no.nav.helsearbeidsgiver.inntektsmelding.forespoerselinfotrygd + +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.kotest.matchers.maps.shouldContainKey +import io.mockk.clearAllMocks +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.pritopic.Pri +import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.firstMessage +import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.sendJson +import no.nav.helsearbeidsgiver.utils.json.toJson +import java.util.UUID + +class ForespoerselKastetTilInfotrygdRiverTest : + FunSpec({ + val testRapid = TestRapid() + + ForespoerselKastetTilInfotrygdRiver().connect(testRapid) + + beforeEach { + testRapid.reset() + clearAllMocks() + } + + test("Ved notis om forespørsel kastet til Infotrygd publiseres event om forespørsel kastet til Infotrygd") { + val forespoerselId = UUID.randomUUID() + val forventetPublisert = + mapOf( + Key.EVENT_NAME to EventName.FORESPOERSEL_KASTET_TIL_INFOTRYGD.toJson(), + Key.UUID to UUID.randomUUID().toJson(), + Key.FORESPOERSEL_ID to forespoerselId.toJson(), + ) + + testRapid.sendJson( + Pri.Key.NOTIS to Pri.NotisType.FORESPOERSEL_KASTET_TIL_INFOTRYGD.toJson(Pri.NotisType.serializer()), + Pri.Key.FORESPOERSEL_ID to forespoerselId.toJson(), + ) + + testRapid.inspektør.size shouldBeExactly 1 + + val publisert = testRapid.firstMessage().toMap() + + publisert shouldContainKey Key.UUID + + publisert.minus(Key.UUID) shouldContainExactly forventetPublisert.minus(Key.UUID) + } + }) diff --git a/integrasjonstest/build.gradle.kts b/integrasjonstest/build.gradle.kts index c9c8c1e17..e5096a8a4 100644 --- a/integrasjonstest/build.gradle.kts +++ b/integrasjonstest/build.gradle.kts @@ -21,6 +21,7 @@ dependencies { testImplementation(project(":distribusjon")) testImplementation(project(":forespoersel-besvart")) testImplementation(project(":forespoersel-forkastet")) + testImplementation(project(":forespoersel-infotrygd")) testImplementation(project(":forespoersel-marker-besvart")) testImplementation(project(":forespoersel-mottatt")) testImplementation(project(":helsebro")) diff --git a/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/utils/EndToEndTest.kt b/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/utils/EndToEndTest.kt index d371fd54a..486074a1d 100644 --- a/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/utils/EndToEndTest.kt +++ b/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/utils/EndToEndTest.kt @@ -45,6 +45,7 @@ import no.nav.helsearbeidsgiver.inntektsmelding.distribusjon.createDistribusjonR import no.nav.helsearbeidsgiver.inntektsmelding.feilbehandler.createFeilLytter import no.nav.helsearbeidsgiver.inntektsmelding.forespoerselbesvart.createForespoerselBesvartRivers import no.nav.helsearbeidsgiver.inntektsmelding.forespoerselforkastet.createForespoerselForkastetRiver +import no.nav.helsearbeidsgiver.inntektsmelding.forespoerselinfotrygd.createForespoerselKastetTilInfotrygdRiver import no.nav.helsearbeidsgiver.inntektsmelding.forespoerselmarkerbesvart.createMarkerForespoerselBesvart import no.nav.helsearbeidsgiver.inntektsmelding.forespoerselmottatt.createForespoerselMottattRiver import no.nav.helsearbeidsgiver.inntektsmelding.helsebro.createHelsebroRivers @@ -253,6 +254,7 @@ abstract class EndToEndTest : ContainerTest() { createForespoerselBesvartRivers() createForespoerselMottattRiver() createForespoerselForkastetRiver() + createForespoerselKastetTilInfotrygdRiver() createHelsebroRivers(mockPriProducer) createHentEksternImRiver(spinnKlient) createHentInntektRiver(inntektClient)