diff --git a/build.gradle.kts b/build.gradle.kts index d19aa50f..deccda5f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,7 +12,7 @@ val hikariCPVersion = "6.1.0" val kotliqueryVersion = "1.9.0" val postgresqlVersion = "42.7.4" val flywayCoreVersion = "10.21.0" -val tbdLibsVersion = "2024.11.15-09.09-08ca346b" +val tbdLibsVersion = "2024.11.22-10.18-e31c6051" buildscript { repositories { mavenCentral() } diff --git a/subsumsjon/build.gradle.kts b/subsumsjon/build.gradle.kts index ef649af1..dbc05fab 100644 --- a/subsumsjon/build.gradle.kts +++ b/subsumsjon/build.gradle.kts @@ -3,7 +3,7 @@ val postgresqlVersion: String by project val kotliqueryVersion: String by project val flywayCoreVersion: String by project val tbdLibsVersion: String by project - +val mockkVersion: String by project val jsonSchemaValidatorVersion = "1.0.65" val kotestAssertionsCoreVersion = "5.1.0" @@ -13,8 +13,13 @@ dependencies { implementation("org.flywaydb:flyway-database-postgresql:$flywayCoreVersion") implementation("com.github.seratch:kotliquery:$kotliqueryVersion") + implementation("com.github.navikt.tbd-libs:azure-token-client-default:$tbdLibsVersion") + implementation("com.github.navikt.tbd-libs:retry:$tbdLibsVersion") + implementation("com.github.navikt.tbd-libs:spedisjon-client:$tbdLibsVersion") + testImplementation("com.github.navikt.tbd-libs:rapids-and-rivers-test:$tbdLibsVersion") testImplementation("com.github.navikt.tbd-libs:postgres-testdatabaser:$tbdLibsVersion") testImplementation("com.networknt:json-schema-validator:$jsonSchemaValidatorVersion") testImplementation("io.kotest:kotest-assertions-core:$kotestAssertionsCoreVersion") + testImplementation("io.mockk:mockk:$mockkVersion") } diff --git a/subsumsjon/src/main/kotlin/no/nav/helse/spre/subsumsjon/App.kt b/subsumsjon/src/main/kotlin/no/nav/helse/spre/subsumsjon/App.kt index c7c8f70a..28907152 100644 --- a/subsumsjon/src/main/kotlin/no/nav/helse/spre/subsumsjon/App.kt +++ b/subsumsjon/src/main/kotlin/no/nav/helse/spre/subsumsjon/App.kt @@ -4,7 +4,9 @@ import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.SerializationFeature import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import com.github.navikt.tbd_libs.azure.createAzureTokenClientFromEnvironment import com.github.navikt.tbd_libs.rapids_and_rivers_api.RapidsConnection +import com.github.navikt.tbd_libs.spedisjon.SpedisjonClient import no.nav.helse.rapids_rivers.* import org.apache.kafka.clients.CommonClientConfigs import org.apache.kafka.clients.producer.KafkaProducer @@ -16,6 +18,7 @@ import org.apache.kafka.common.security.auth.SecurityProtocol import org.apache.kafka.common.serialization.StringSerializer import org.slf4j.Logger import org.slf4j.LoggerFactory +import java.net.http.HttpClient import java.util.* internal val log = LoggerFactory.getLogger("spre-subsumsjoner") @@ -36,6 +39,13 @@ fun main() { } } + val azureClient = createAzureTokenClientFromEnvironment(env) + val spedisjonClient = SpedisjonClient( + httpClient = HttpClient.newHttpClient(), + objectMapper = objectMapper, + tokenProvider = azureClient + ) + // Migrer databasen før vi starter å konsumere fra rapid rapid.register(object : RapidsConnection.StatusListener { override fun onStartup(rapidsConnection: RapidsConnection) { @@ -44,7 +54,7 @@ fun main() { }) rapid.apply { - SubsumsjonRiver(this, mappingDao) { key, value -> publisher(key, value) } + SubsumsjonRiver(this, mappingDao, spedisjonClient) { key, value -> publisher(key, value) } SykemeldingRiver(this, mappingDao) SøknadRiver(this, mappingDao) DokumentAliasRiver(this, mappingDao) diff --git a/subsumsjon/src/main/kotlin/no/nav/helse/spre/subsumsjon/SubsumsjonRiver.kt b/subsumsjon/src/main/kotlin/no/nav/helse/spre/subsumsjon/SubsumsjonRiver.kt index b3b7a6fc..676437e1 100644 --- a/subsumsjon/src/main/kotlin/no/nav/helse/spre/subsumsjon/SubsumsjonRiver.kt +++ b/subsumsjon/src/main/kotlin/no/nav/helse/spre/subsumsjon/SubsumsjonRiver.kt @@ -7,12 +7,16 @@ import com.github.navikt.tbd_libs.rapids_and_rivers_api.MessageContext import com.github.navikt.tbd_libs.rapids_and_rivers_api.MessageMetadata import com.github.navikt.tbd_libs.rapids_and_rivers_api.MessageProblems import com.github.navikt.tbd_libs.rapids_and_rivers_api.RapidsConnection +import com.github.navikt.tbd_libs.result_object.Result +import com.github.navikt.tbd_libs.spedisjon.HentMeldingerResponse +import com.github.navikt.tbd_libs.spedisjon.SpedisjonClient import io.micrometer.core.instrument.MeterRegistry import java.time.LocalDate internal class SubsumsjonRiver( rapidsConnection: RapidsConnection, private val mappingDao: MappingDao, + private val spedisjonClient: SpedisjonClient, private val subsumsjonPublisher: (key: String, value: String) -> Unit ) : River.PacketListener { @@ -75,6 +79,26 @@ internal class SubsumsjonRiver( val søknadIder = mapper.hentSøknadIder(internSøknadIder) val inntektsmeldingIder = mapper.hentInntektsmeldingIder(internInntektsmeldingIder) + val meldingerFraSpedisjon = spedisjonClient.hentMeldinger(internSykmeldingIder + internSøknadIder + internInntektsmeldingIder) + when (meldingerFraSpedisjon) { + is Result.Error -> log.error("Fikk feil ved oppslag mot spedisjon: ${meldingerFraSpedisjon.error}", meldingerFraSpedisjon.cause) + is Result.Ok -> { + val sykmeldingerSomIkkeFinnes = internSykmeldingIder.filter { internId -> + meldingerFraSpedisjon.value.meldinger.none { response -> response.internDokumentId == internId } + } + val søknaderSomIkkeFinnes = internSøknadIder.filter { internId -> + meldingerFraSpedisjon.value.meldinger.none { response -> response.internDokumentId == internId } + } + val inntektsmeldingerSomIkkeFinnes = internInntektsmeldingIder.filter { internId -> + meldingerFraSpedisjon.value.meldinger.none { response -> response.internDokumentId == internId } + } + + if (sykmeldingerSomIkkeFinnes.isNotEmpty() || søknaderSomIkkeFinnes.isNotEmpty() || inntektsmeldingerSomIkkeFinnes.isNotEmpty()) { + log.error("Fant ikke meldinger i spedisjon: sykmeldingerSomIkkeFinnes=$sykmeldingerSomIkkeFinnes, søknaderSomIkkeFinnes=$søknaderSomIkkeFinnes, inntektsmeldingerSomIkkeFinnes=$inntektsmeldingerSomIkkeFinnes") + } + } + } + log.info("Mapper subsumsjons sporing sykmelding: $internSykmeldingIder til $sykmeldingIder søknad: $internSøknadIder til $søknadIder " + "inntektsmelding: $internInntektsmeldingIder til $inntektsmeldingIder") diff --git a/subsumsjon/src/test/kotlin/no/nav/helse/spre/subsumsjon/SubsumsjonTest.kt b/subsumsjon/src/test/kotlin/no/nav/helse/spre/subsumsjon/SubsumsjonTest.kt index 97feab63..e0c6eea7 100644 --- a/subsumsjon/src/test/kotlin/no/nav/helse/spre/subsumsjon/SubsumsjonTest.kt +++ b/subsumsjon/src/test/kotlin/no/nav/helse/spre/subsumsjon/SubsumsjonTest.kt @@ -2,12 +2,17 @@ package no.nav.helse.spre.subsumsjon import com.fasterxml.jackson.databind.JsonNode import com.github.navikt.tbd_libs.rapids_and_rivers.test_support.TestRapid +import com.github.navikt.tbd_libs.result_object.ok +import com.github.navikt.tbd_libs.spedisjon.HentMeldingerResponse +import com.github.navikt.tbd_libs.spedisjon.SpedisjonClient import com.github.navikt.tbd_libs.test_support.TestDataSource import com.networknt.schema.JsonSchemaFactory import com.networknt.schema.SpecVersion import com.networknt.schema.ValidationMessage import io.kotest.matchers.collections.shouldBeIn import io.kotest.matchers.collections.shouldNotBeIn +import io.mockk.every +import io.mockk.mockk import org.intellij.lang.annotations.Language import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.Assertions.assertEquals @@ -28,6 +33,9 @@ internal class SubsumsjonTest { private lateinit var sykemeldingRiver: SykemeldingRiver private lateinit var søknadRiver: SøknadRiver private lateinit var inntektsmeldingRiver: InntektsmeldingRiver + private val subsumsjonClient = mockk { + every { hentMeldinger(any(), any()) } returns HentMeldingerResponse(emptyList()).ok() + } @BeforeEach fun before() { @@ -36,7 +44,7 @@ internal class SubsumsjonTest { sykemeldingRiver = SykemeldingRiver(testRapid, mappingDao) søknadRiver = SøknadRiver(testRapid, mappingDao) inntektsmeldingRiver = InntektsmeldingRiver(testRapid, mappingDao) - SubsumsjonRiver(testRapid, mappingDao) { fnr, melding -> + SubsumsjonRiver(testRapid, mappingDao, subsumsjonClient) { fnr, melding -> resultater.add(fnr to objectMapper.readTree(melding)) } }