From 35666b6d13d6ce019ef8c8e25d97e13d3a5b3db8 Mon Sep 17 00:00:00 2001 From: Sondre Lefsaker Date: Wed, 30 Oct 2024 09:31:54 +0100 Subject: [PATCH] =?UTF-8?q?skjul=20personinfo=20om=20adressebeskyttede=20p?= =?UTF-8?q?ersoner=20i=20refusjonsl=C3=B8sning?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ktor/clients/HttpClients.kt | 1 + .../okonomi/refusjon/ArrangorflateRoutes.kt | 45 ++++-- .../HentAdressebeskyttetPersonBolkPdlQuery.kt | 2 +- .../clients/pdl/HentPersonBolkPdlQueryTest.kt | 153 +++++++++++------- 4 files changed, 133 insertions(+), 68 deletions(-) diff --git a/common/ktor-clients/src/main/kotlin/no/nav/mulighetsrommet/ktor/clients/HttpClients.kt b/common/ktor-clients/src/main/kotlin/no/nav/mulighetsrommet/ktor/clients/HttpClients.kt index 1bebbda4c3..97c0d51d4c 100644 --- a/common/ktor-clients/src/main/kotlin/no/nav/mulighetsrommet/ktor/clients/HttpClients.kt +++ b/common/ktor-clients/src/main/kotlin/no/nav/mulighetsrommet/ktor/clients/HttpClients.kt @@ -43,6 +43,7 @@ fun httpJsonClient(engine: HttpClientEngine = CIO.create()) = HttpClient(engine) json( Json { ignoreUnknownKeys = true + coerceInputValues = true }, ) } diff --git a/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/okonomi/refusjon/ArrangorflateRoutes.kt b/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/okonomi/refusjon/ArrangorflateRoutes.kt index 09f778b3ea..a4ecc73d66 100644 --- a/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/okonomi/refusjon/ArrangorflateRoutes.kt +++ b/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/okonomi/refusjon/ArrangorflateRoutes.kt @@ -6,12 +6,13 @@ import io.ktor.http.* import io.ktor.server.application.* import io.ktor.server.auth.* import io.ktor.server.plugins.* -import io.ktor.server.request.receive +import io.ktor.server.request.* import io.ktor.server.response.* import io.ktor.server.routing.* import io.ktor.server.util.* import io.ktor.util.pipeline.* import kotlinx.serialization.Serializable +import no.nav.mulighetsrommet.api.clients.pdl.PdlGradering import no.nav.mulighetsrommet.api.clients.pdl.PdlIdent import no.nav.mulighetsrommet.api.domain.dto.DeltakerDto import no.nav.mulighetsrommet.api.okonomi.models.DeltakelsePeriode @@ -228,16 +229,12 @@ private suspend fun getPersoner( return pdl.hentPersonBolk(identer) .map { - it.entries - .mapNotNull { (ident, person) -> - person.navn.firstOrNull()?.let { navn -> - RefusjonKravDeltakelse.Person( - norskIdent = NorskIdent(ident.value), - navn = "${navn.etternavn}, ${navn.fornavn}", - ) - } + buildMap { + it.entries.forEach { (ident, person) -> + val refusjonskravPerson = toRefusjonskravPerson(person) + put(NorskIdent(ident.value), refusjonskravPerson) } - .associateBy { person -> person.norskIdent } + } } .getOrElse { throw StatusException( @@ -247,6 +244,30 @@ private suspend fun getPersoner( } } +private fun toRefusjonskravPerson(person: HentPersonBolkResponse.Person) = + when (person.adressebeskyttelse.gradering) { + PdlGradering.UGRADERT -> { + val navn = person.navn.firstOrNull()?.let { navn -> + val fornavnOgMellomnavn = listOfNotNull(navn.fornavn, navn.mellomnavn) + .joinToString(" ") + .takeIf { it.isNotEmpty() } + listOfNotNull(navn.etternavn, fornavnOgMellomnavn).joinToString(", ") + } + val foedselsdato = person.foedselsdato.firstOrNull() + RefusjonKravDeltakelse.Person( + navn = navn ?: "Mangler navn", + fodselsaar = foedselsdato?.foedselsaar, + fodselsdato = foedselsdato?.foedselsdato, + ) + } + + else -> RefusjonKravDeltakelse.Person( + navn = "Adressebeskyttet", + fodselsaar = null, + fodselsdato = null, + ) + } + @Serializable data class RefusjonKravAft( @Serializable(with = UUIDSerializer::class) @@ -287,8 +308,10 @@ data class RefusjonKravDeltakelse( ) { @Serializable data class Person( - val norskIdent: NorskIdent, val navn: String, + @Serializable(with = LocalDateSerializer::class) + val fodselsdato: LocalDate?, + val fodselsaar: Int?, ) } diff --git a/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/okonomi/refusjon/HentAdressebeskyttetPersonBolkPdlQuery.kt b/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/okonomi/refusjon/HentAdressebeskyttetPersonBolkPdlQuery.kt index 1196aa64e3..00c49ccc23 100644 --- a/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/okonomi/refusjon/HentAdressebeskyttetPersonBolkPdlQuery.kt +++ b/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/okonomi/refusjon/HentAdressebeskyttetPersonBolkPdlQuery.kt @@ -79,7 +79,7 @@ data class HentPersonBolkResponse( @Serializable data class Adressebeskyttelse( - val gradering: PdlGradering?, + val gradering: PdlGradering = PdlGradering.UGRADERT, ) @Serializable diff --git a/mulighetsrommet-api/src/test/kotlin/no/nav/mulighetsrommet/api/clients/pdl/HentPersonBolkPdlQueryTest.kt b/mulighetsrommet-api/src/test/kotlin/no/nav/mulighetsrommet/api/clients/pdl/HentPersonBolkPdlQueryTest.kt index ecadbc81c4..4ab914f29a 100644 --- a/mulighetsrommet-api/src/test/kotlin/no/nav/mulighetsrommet/api/clients/pdl/HentPersonBolkPdlQueryTest.kt +++ b/mulighetsrommet-api/src/test/kotlin/no/nav/mulighetsrommet/api/clients/pdl/HentPersonBolkPdlQueryTest.kt @@ -4,6 +4,7 @@ import arrow.core.nonEmptySetOf import io.kotest.assertions.arrow.core.shouldBeRight import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.shouldBe +import io.ktor.client.engine.mock.* import io.ktor.http.content.* import kotlinx.serialization.json.Json import no.nav.mulighetsrommet.api.okonomi.refusjon.HentAdressebeskyttetPersonBolkPdlQuery @@ -15,74 +16,68 @@ class HentPersonBolkPdlQueryTest : FunSpec({ test("happy case hentPersonBolk") { val identer = nonEmptySetOf(PdlIdent("12345678910"), PdlIdent("12345678911"), PdlIdent("test")) - val pdl = PdlClient( - config = PdlClient.Config(baseUrl = "https://pdl.no"), - tokenProvider = { "token" }, - clientEngine = createMockEngine( - "/graphql" to { + val clientEngine = createMockEngine( + "/graphql" to { - val body = Json.decodeFromString>( - (it.body as TextContent).text, - ) - body.variables.identer shouldBe identer + val body = Json.decodeFromString>( + (it.body as TextContent).text, + ) + body.variables.identer shouldBe identer - respondJson( - """ - { - "data": { - "hentPersonBolk": [ - { - "ident": "12345678910", - "person": { - "navn": [ - { - "fornavn": "Ola", - "mellomnavn": null, - "etternavn": "Normann" - } - ], - "adressebeskyttelse": { - "gradering": null - }, - "foedselsdato": [ - { - "foedselsaar": 1980, - "foedselsdato": null - } - ] - }, - "code": "ok" + respondJson( + """ + { + "data": { + "hentPersonBolk": [ + { + "ident": "12345678910", + "person": { + "navn": [ + { + "fornavn": "Ola", + "mellomnavn": null, + "etternavn": "Normann" + } + ], + "adressebeskyttelse": { + "gradering": "STRENGT_FORTROLIG" + }, + "foedselsdato": [ + { + "foedselsaar": 1980, + "foedselsdato": null + } + ] }, - { - "ident": "12345678911", - "person": null, - "code": "not_found" - }, - { - "ident": "test", - "person": null, - "code": "bad_request" - } - ] - } + "code": "ok" + }, + { + "ident": "12345678911", + "person": null, + "code": "not_found" + }, + { + "ident": "test", + "person": null, + "code": "bad_request" + } + ] } - """.trimIndent(), - ) - }, - ), + } + """.trimIndent(), + ) + }, ) - val query = HentAdressebeskyttetPersonBolkPdlQuery(pdl) + val query = HentAdressebeskyttetPersonBolkPdlQuery(createPdlClient(clientEngine)) - val response = query.hentPersonBolk(identer).shouldBeRight() - - response shouldBe mapOf( + query.hentPersonBolk(identer) shouldBeRight mapOf( PdlIdent("12345678910") to HentPersonBolkResponse.Person( navn = listOf( PdlNavn(fornavn = "Ola", etternavn = "Normann"), ), adressebeskyttelse = HentPersonBolkResponse.Adressebeskyttelse( - gradering = null, + gradering = PdlGradering.STRENGT_FORTROLIG, ), foedselsdato = listOf( HentPersonBolkResponse.Foedselsdato( @@ -93,4 +88,50 @@ class HentPersonBolkPdlQueryTest : FunSpec({ ), ) } + + test("tolker manglende gradering som UGRADERT") { + val clientEngine = createMockEngine( + "/graphql" to { + respondJson( + """ + { + "data": { + "hentPersonBolk": [ + { + "ident": "12345678910", + "person": { + "navn": [], + "adressebeskyttelse": { + "gradering": null + }, + "foedselsdato": [] + }, + "code": "ok" + } + ] + } + } + """.trimIndent(), + ) + }, + ) + + val query = HentAdressebeskyttetPersonBolkPdlQuery(createPdlClient(clientEngine)) + + query.hentPersonBolk(nonEmptySetOf(PdlIdent("12345678910"))) shouldBeRight mapOf( + PdlIdent("12345678910") to HentPersonBolkResponse.Person( + navn = listOf(), + adressebeskyttelse = HentPersonBolkResponse.Adressebeskyttelse( + gradering = PdlGradering.UGRADERT, + ), + foedselsdato = listOf(), + ), + ) + } }) + +private fun createPdlClient(clientEngine: MockEngine) = PdlClient( + config = PdlClient.Config(baseUrl = "https://pdl.no"), + tokenProvider = { "token" }, + clientEngine = clientEngine, +)