From 711553d611d9021da24e0b1d1dc44f517262bc58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Hagen?= Date: Wed, 14 Aug 2024 14:39:58 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20River=20og=20l=C3=B8sning=20for=20?= =?UTF-8?q?=C3=A5=20hente=20fullmakt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Martin Solheim --- .../Fullmaktl\303\270sning.kt" | 81 +++++++++++++++++++ .../mediator/meldinger/Testmeldingfabrikk.kt | 42 ++++++++++ .../l\303\270sninger/FullmaktRiverTest.kt" | 54 +++++++++++++ 3 files changed, 177 insertions(+) create mode 100644 "spesialist-selve/src/main/kotlin/no/nav/helse/mediator/meldinger/l\303\270sninger/Fullmaktl\303\270sning.kt" create mode 100644 "spesialist-selve/src/test/kotlin/no/nav/helse/mediator/meldinger/l\303\270sninger/FullmaktRiverTest.kt" diff --git "a/spesialist-selve/src/main/kotlin/no/nav/helse/mediator/meldinger/l\303\270sninger/Fullmaktl\303\270sning.kt" "b/spesialist-selve/src/main/kotlin/no/nav/helse/mediator/meldinger/l\303\270sninger/Fullmaktl\303\270sning.kt" new file mode 100644 index 000000000..e4d2d6dd2 --- /dev/null +++ "b/spesialist-selve/src/main/kotlin/no/nav/helse/mediator/meldinger/l\303\270sninger/Fullmaktl\303\270sning.kt" @@ -0,0 +1,81 @@ +package no.nav.helse.mediator.meldinger.løsninger + +import no.nav.helse.mediator.MeldingMediator +import no.nav.helse.mediator.SpesialistRiver +import no.nav.helse.modell.vergemal.VergemålDao +import no.nav.helse.rapids_rivers.JsonMessage +import no.nav.helse.rapids_rivers.MessageContext +import no.nav.helse.rapids_rivers.River +import no.nav.helse.rapids_rivers.asLocalDate +import no.nav.helse.rapids_rivers.asLocalDateTime +import org.slf4j.LoggerFactory +import java.time.LocalDate +import java.util.UUID + +internal class Fullmaktløsning( + private val fødselsnummer: String, + val harFullmakt: Boolean, +) { + private val log = LoggerFactory.getLogger(Fullmaktløsning::class.java) + + internal fun lagre(vergemålDao: VergemålDao) { + log.info("Lagrer ennå ikke fullmakt") + } + + internal class FullmaktRiver( + private val meldingMediator: MeldingMediator, + ) : SpesialistRiver { + private val sikkerLogg = LoggerFactory.getLogger("tjenestekall") + + override fun validations() = + River.PacketValidation { + it.demandValue("@event_name", "behov") + it.demandValue("@final", true) + it.demandAll("@behov", listOf("Fullmakt")) + it.demandKey("contextId") + it.demandKey("hendelseId") + it.demandKey("fødselsnummer") + it.requireKey("@id") + it.require("@opprettet") { node -> node.asLocalDateTime() } + it.requireArray("@løsning") { + require("fullmakt") { + interestedIn("gyldigFraOgMed", "gyldigTilOgMed") + } + } + } + + override fun onPacket( + packet: JsonMessage, + context: MessageContext, + ) { + sikkerLogg.info("Mottok melding Fullmakt:\n{}", packet.toJson()) + val contextId = UUID.fromString(packet["contextId"].asText()) + val hendelseId = UUID.fromString(packet["hendelseId"].asText()) + val fødselsnummer = packet["fødselsnummer"].asText() + + val nå = LocalDate.now() + val harFullmakt = packet["@løsning"].filter { fullmaktNode -> + val fullmakt = fullmaktNode.path("fullmakt") + fullmakt.size() > 0 && + fullmakt["gyldigFraOgMed"].asLocalDate().isSameOrBefore(nå) && + fullmakt["gyldigTilOgMed"].asLocalDate().isSameOrAfter(nå) + }.isNotEmpty() + + val fullmaktløsning = Fullmaktløsning( + fødselsnummer = fødselsnummer, + harFullmakt = harFullmakt, + ) + + meldingMediator.løsning( + hendelseId = hendelseId, + contextId = contextId, + behovId = UUID.fromString(packet["@id"].asText()), + løsning = fullmaktløsning, + context = context, + ) + } + } +} + +fun LocalDate.isSameOrBefore(other: LocalDate) = this.isEqual(other) || this.isBefore(other) +fun LocalDate.isSameOrAfter(other: LocalDate) = this.isEqual(other) || this.isAfter(other) diff --git a/spesialist-selve/src/test/kotlin/no/nav/helse/mediator/meldinger/Testmeldingfabrikk.kt b/spesialist-selve/src/test/kotlin/no/nav/helse/mediator/meldinger/Testmeldingfabrikk.kt index 9a8a9cd12..04363b6d6 100644 --- a/spesialist-selve/src/test/kotlin/no/nav/helse/mediator/meldinger/Testmeldingfabrikk.kt +++ b/spesialist-selve/src/test/kotlin/no/nav/helse/mediator/meldinger/Testmeldingfabrikk.kt @@ -88,6 +88,48 @@ internal object Testmeldingfabrikk { ) ) + fun lagFullmaktløsningMedFullmakt( + fødselsnummer: String, + fom: LocalDate, + tom: LocalDate + ): String = nyHendelse( + id = UUID.randomUUID(), "behov", + mapOf( + "fødselsnummer" to fødselsnummer, + "@final" to true, + "@behov" to listOf("Fullmakt"), + "contextId" to "${UUID.randomUUID()}", + "hendelseId" to "${UUID.randomUUID()}", + "@løsning" to listOf( + mapOf( + "fullmakt" to mapOf( + "omraade" to listOf("SYK", "SYM"), + "gyldigFraOgMed" to fom, + "gyldigTilOgMed" to tom, + ) + ) + ) + ) + ) + + fun lagFullmaktløsningUtenFullmakter( + fødselsnummer: String + ): String = nyHendelse( + id = UUID.randomUUID(), "behov", + mapOf( + "fødselsnummer" to fødselsnummer, + "@final" to true, + "@behov" to listOf("Fullmakt"), + "contextId" to "${UUID.randomUUID()}", + "hendelseId" to "${UUID.randomUUID()}", + "@løsning" to listOf( + mapOf( + "fullmakt" to emptyList>() + ) + ) + ) + ) + fun lagEndretSkjermetinfo( fødselsnummer: String, skjermet: Boolean, diff --git "a/spesialist-selve/src/test/kotlin/no/nav/helse/mediator/meldinger/l\303\270sninger/FullmaktRiverTest.kt" "b/spesialist-selve/src/test/kotlin/no/nav/helse/mediator/meldinger/l\303\270sninger/FullmaktRiverTest.kt" new file mode 100644 index 000000000..2155e2e1f --- /dev/null +++ "b/spesialist-selve/src/test/kotlin/no/nav/helse/mediator/meldinger/l\303\270sninger/FullmaktRiverTest.kt" @@ -0,0 +1,54 @@ +package no.nav.helse.mediator.meldinger.løsninger + +import io.mockk.mockk +import io.mockk.slot +import io.mockk.verify +import no.nav.helse.medRivers +import no.nav.helse.mediator.MeldingMediator +import no.nav.helse.mediator.meldinger.Testmeldingfabrikk +import no.nav.helse.rapids_rivers.testsupport.TestRapid +import no.nav.helse.spesialist.test.lagFødselsnummer +import org.junit.jupiter.api.Assertions.assertFalse +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test +import java.time.LocalDate.now + +class FullmaktRiverTest { + private val mediator = mockk(relaxed = true) + private val testRapid = TestRapid().medRivers(Fullmaktløsning.FullmaktRiver(mediator)) + + @Test + fun `motta melding med fullmakter`() { + val fnr = lagFødselsnummer() + val slot = slot() + testRapid.sendTestMessage(Testmeldingfabrikk.lagFullmaktløsningMedFullmakt( + fnr, + fom = now(), + tom = now() + )) + verify(exactly = 1) { mediator.løsning(any(), any(), any(), capture(slot), any()) } + assertTrue(slot.captured.harFullmakt) + } + + @Test + fun `motta melding med utdaterte fullmakter`() { + val fnr = lagFødselsnummer() + val slot = slot() + testRapid.sendTestMessage(Testmeldingfabrikk.lagFullmaktløsningMedFullmakt( + fnr, + fom = now().minusYears(2), + tom = now().minusDays(1) + )) + verify(exactly = 1) { mediator.løsning(any(), any(), any(), capture(slot), any()) } + assertFalse(slot.captured.harFullmakt) + } + + @Test + fun `motta melding uten fullmakter`() { + val fnr = lagFødselsnummer() + val slot = slot() + testRapid.sendTestMessage(Testmeldingfabrikk.lagFullmaktløsningUtenFullmakter(fnr)) + verify(exactly = 1) { mediator.løsning(any(), any(), any(), capture(slot), any()) } + assertFalse(slot.captured.harFullmakt) + } +} \ No newline at end of file