Skip to content

Commit d53473c

Browse files
committed
F Bruk pdl-klient direkte i personopplysninger-routes, i stedet for å bruke det som ligger i basen
1 parent e411a80 commit d53473c

File tree

14 files changed

+192
-48
lines changed

14 files changed

+192
-48
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package no.nav.tiltakspenger.vedtak.clients.person
2+
3+
import arrow.core.getOrElse
4+
import com.fasterxml.jackson.module.kotlin.readValue
5+
import no.nav.tiltakspenger.libs.common.Fnr
6+
import no.nav.tiltakspenger.libs.personklient.pdl.dto.AdressebeskyttelseGradering
7+
import no.nav.tiltakspenger.libs.personklient.pdl.dto.Navn
8+
import no.nav.tiltakspenger.libs.personklient.pdl.dto.PdlPerson
9+
import no.nav.tiltakspenger.libs.personklient.pdl.dto.avklarGradering
10+
import no.nav.tiltakspenger.libs.personklient.pdl.dto.avklarNavn
11+
import no.nav.tiltakspenger.saksbehandling.domene.personopplysninger.EnkelPerson
12+
13+
internal data class PdlResponse(
14+
val hentPerson: PdlPerson,
15+
)
16+
17+
fun String.toEnkelPerson(
18+
fnr: Fnr,
19+
): EnkelPerson {
20+
val data: PdlResponse = objectMapper.readValue<PdlResponse>(this)
21+
val person: PdlPerson = data.hentPerson
22+
val navn: Navn = avklarNavn(person.navn).getOrElse { it.mapError() }
23+
val adressebeskyttelse: AdressebeskyttelseGradering =
24+
avklarGradering(person.adressebeskyttelse).getOrElse { it.mapError() }
25+
return EnkelPerson(
26+
fnr = fnr,
27+
fornavn = navn.fornavn,
28+
mellomnavn = navn.mellomnavn,
29+
etternavn = navn.etternavn,
30+
fortrolig = adressebeskyttelse.erFortrolig(),
31+
strengtFortrolig = adressebeskyttelse.erStrengtFortrolig(),
32+
strengtFortroligUtland = adressebeskyttelse.erStrengtFortroligUtland(),
33+
skjermet = null,
34+
)
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package no.nav.tiltakspenger.vedtak.clients.person
2+
3+
import no.nav.tiltakspenger.libs.common.Fnr
4+
import no.nav.tiltakspenger.libs.personklient.pdl.GraphqlQuery
5+
6+
internal fun hentEnkelPersonQuery(fnr: Fnr): GraphqlQuery {
7+
return GraphqlQuery(
8+
query = query,
9+
variables = mapOf(
10+
"ident" to fnr.verdi,
11+
),
12+
)
13+
}
14+
15+
private val query = """
16+
query(${'$'}ident: ID!){
17+
hentPerson(ident: ${'$'}ident) {
18+
adressebeskyttelse(historikk: false) {
19+
gradering
20+
folkeregistermetadata {
21+
...folkeregistermetadataDetails
22+
}
23+
metadata {
24+
...metadataDetails
25+
}
26+
}
27+
navn(historikk: false) {
28+
fornavn
29+
mellomnavn
30+
etternavn
31+
folkeregistermetadata {
32+
...folkeregistermetadataDetails
33+
}
34+
metadata {
35+
...metadataDetails
36+
}
37+
}
38+
}
39+
}
40+
fragment folkeregistermetadataDetails on Folkeregistermetadata {
41+
aarsak
42+
ajourholdstidspunkt
43+
gyldighetstidspunkt
44+
kilde
45+
opphoerstidspunkt
46+
sekvens
47+
}
48+
49+
fragment metadataDetails on Metadata {
50+
endringer {
51+
kilde
52+
registrert
53+
registrertAv
54+
systemkilde
55+
type
56+
}
57+
master
58+
}
59+
""".trimIndent()

app/src/main/kotlin/no/nav/tiltakspenger/vedtak/clients/person/PersonHttpklient.kt

+9
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
99
import com.fasterxml.jackson.module.kotlin.KotlinModule
1010
import no.nav.tiltakspenger.libs.common.Fnr
1111
import no.nav.tiltakspenger.libs.personklient.pdl.FellesPersonklient
12+
import no.nav.tiltakspenger.saksbehandling.domene.personopplysninger.EnkelPerson
1213
import no.nav.tiltakspenger.saksbehandling.domene.personopplysninger.Personopplysninger
1314
import no.nav.tiltakspenger.saksbehandling.ports.PersonGateway
1415
import no.nav.tiltakspenger.vedtak.auth.AzureTokenProvider
@@ -46,4 +47,12 @@ class PersonHttpklient(
4647
.map { mapPersonopplysninger(it, LocalDateTime.now(), fnr) }
4748
.getOrElse { it.mapError() }
4849
}
50+
51+
override suspend fun hentEnkelPerson(fnr: Fnr): EnkelPerson {
52+
val token = azureTokenProvider::getToken
53+
val body = objectMapper.writeValueAsString(hentEnkelPersonQuery(fnr))
54+
return personklient.hentPerson(fnr, token(), body).map { it.toEnkelPerson(fnr) }.getOrElse { it.mapError() }
55+
}
56+
57+
// TODO: hent navn på person (etternavn + fornavn)
4958
}

app/src/main/kotlin/no/nav/tiltakspenger/vedtak/clients/person/PersonMapper.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ private data class PdlResponseData(
9595
val hentPerson: PdlPerson,
9696
)
9797

98-
private val objectMapper: ObjectMapper =
98+
internal val objectMapper: ObjectMapper =
9999
JsonMapper
100100
.builder()
101101
.addModule(JavaTimeModule())

app/src/main/kotlin/no/nav/tiltakspenger/vedtak/routes/VedtakApi.kt

+1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ internal fun Application.vedtakApi(
7474
kvpVilkårService = applicationContext.førstegangsbehandlingContext.kvpVilkårService,
7575
livsoppholdVilkårService = applicationContext.førstegangsbehandlingContext.livsoppholdVilkårService,
7676
auditService = applicationContext.personContext.auditService,
77+
personGateway = applicationContext.personContext.personGateway,
7778
)
7879
behandlingBenkRoutes(
7980
innloggetSaksbehandlerProvider = innloggetSaksbehandlerProvider,

app/src/main/kotlin/no/nav/tiltakspenger/vedtak/routes/behandling/BehandlingRoutes.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import mu.KotlinLogging
1111
import no.nav.tiltakspenger.felles.Saksbehandler
1212
import no.nav.tiltakspenger.felles.sikkerlogg
1313
import no.nav.tiltakspenger.libs.common.BehandlingId
14+
import no.nav.tiltakspenger.saksbehandling.ports.PersonGateway
1415
import no.nav.tiltakspenger.saksbehandling.service.behandling.BehandlingService
1516
import no.nav.tiltakspenger.saksbehandling.service.behandling.vilkår.kvp.KvpVilkårService
1617
import no.nav.tiltakspenger.saksbehandling.service.behandling.vilkår.livsopphold.LivsoppholdVilkårService
@@ -41,6 +42,7 @@ fun Route.behandlingRoutes(
4142
kvpVilkårService: KvpVilkårService,
4243
livsoppholdVilkårService: LivsoppholdVilkårService,
4344
auditService: AuditService,
45+
personGateway: PersonGateway,
4446
) {
4547
get("$BEHANDLING_PATH/{behandlingId}") {
4648
sikkerlogg.debug("Mottatt request på $BEHANDLING_PATH/behandlingId")
@@ -98,7 +100,7 @@ fun Route.behandlingRoutes(
98100
call.respond(message = "{}", status = HttpStatusCode.OK)
99101
}
100102

101-
hentPersonRoute(innloggetSaksbehandlerProvider, sakService, auditService)
103+
hentPersonRoute(innloggetSaksbehandlerProvider, sakService, personGateway, auditService)
102104
tiltakDeltagelseRoutes(innloggetSaksbehandlerProvider, behandlingService, auditService)
103105
institusjonsoppholdRoutes(innloggetSaksbehandlerProvider, behandlingService, auditService)
104106
kvpRoutes(innloggetSaksbehandlerProvider, kvpVilkårService, behandlingService, auditService)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package no.nav.tiltakspenger.vedtak.routes.behandling.personopplysninger
2+
3+
import no.nav.tiltakspenger.libs.common.Fnr
4+
import no.nav.tiltakspenger.libs.personklient.pdl.dto.PdlPerson
5+
import no.nav.tiltakspenger.saksbehandling.domene.personopplysninger.EnkelPerson
6+
7+
data class EnkelPersonDTO(
8+
val fnr: Fnr,
9+
val fornavn: String,
10+
val mellomnavn: String?,
11+
val etternavn: String,
12+
val fortrolig: Boolean,
13+
val strengtFortrolig: Boolean,
14+
val strengtFortroligUtland: Boolean,
15+
val skjermet: Boolean?,
16+
)
17+
18+
internal data class PdlResponse(
19+
val hentPerson: PdlPerson,
20+
)
21+
22+
fun EnkelPerson.toDTO(): EnkelPersonDTO = EnkelPersonDTO(
23+
fnr = fnr,
24+
fornavn = fornavn,
25+
mellomnavn = mellomnavn,
26+
etternavn = etternavn,
27+
fortrolig = fortrolig,
28+
strengtFortrolig = strengtFortrolig,
29+
strengtFortroligUtland = strengtFortroligUtland,
30+
skjermet = null,
31+
)

app/src/main/kotlin/no/nav/tiltakspenger/vedtak/routes/behandling/personopplysninger/HentPersonopplysningerRoute.kt

+13-9
Original file line numberDiff line numberDiff line change
@@ -6,33 +6,37 @@ import io.ktor.server.plugins.callid.callId
66
import io.ktor.server.response.respond
77
import io.ktor.server.routing.Route
88
import io.ktor.server.routing.get
9+
import kotlinx.coroutines.runBlocking
910
import no.nav.tiltakspenger.felles.sikkerlogg
10-
import no.nav.tiltakspenger.libs.common.BehandlingId
11+
import no.nav.tiltakspenger.libs.common.SakId
12+
import no.nav.tiltakspenger.saksbehandling.ports.PersonGateway
1113
import no.nav.tiltakspenger.saksbehandling.service.sak.SakService
1214
import no.nav.tiltakspenger.vedtak.auditlog.AuditLogEvent
1315
import no.nav.tiltakspenger.vedtak.auditlog.AuditService
1416
import no.nav.tiltakspenger.vedtak.routes.behandling.BEHANDLING_PATH
1517
import no.nav.tiltakspenger.vedtak.routes.parameter
1618
import no.nav.tiltakspenger.vedtak.tilgang.InnloggetSaksbehandlerProvider
1719

18-
// TODO pre-mvp B: Midlertidig løsning for å ikke brekke dev. Denne skal skrives om til å hente personalia direkte fra pdl.
1920
fun Route.hentPersonRoute(
2021
innloggetSaksbehandlerProvider: InnloggetSaksbehandlerProvider,
2122
sakService: SakService,
23+
personGateway: PersonGateway,
2224
auditService: AuditService,
2325
) {
24-
get("$BEHANDLING_PATH/{behandlingId}/personopplysninger") {
25-
sikkerlogg.debug("Mottatt request på $BEHANDLING_PATH/{behandlingId}/personopplysninger")
26+
get("$BEHANDLING_PATH/{sakId}/personopplysninger") {
27+
sikkerlogg.debug("Mottatt request på $BEHANDLING_PATH/{sakId}/personopplysninger")
2628

2729
val saksbehandler = innloggetSaksbehandlerProvider.krevInnloggetSaksbehandler(call)
28-
val behandlingId = BehandlingId.fromString(call.parameter("behandlingId"))
30+
val sakId = SakId.fromString(call.parameter("sakId"))
2931

30-
val sak = sakService.hentForFørstegangsbehandlingId(behandlingId, saksbehandler)
32+
val fnr = sakService.hentFnrForSakId(sakId)
3133

32-
val personopplysninger = sak.personopplysninger.søker().toDTO()
34+
require(fnr != null) { "Fant ikke fødselsnummer på sak med sakId: $sakId" }
3335

34-
auditService.logMedBehandlingId(
35-
behandlingId = behandlingId,
36+
val personopplysninger = runBlocking { personGateway.hentEnkelPerson(fnr) }.toDTO()
37+
38+
auditService.logMedSakId(
39+
sakId = sakId,
3640
navIdent = saksbehandler.navIdent,
3741
action = AuditLogEvent.Action.ACCESS,
3842
contextMessage = "Henter personopplysninger for en behandling",

app/src/main/kotlin/no/nav/tiltakspenger/vedtak/routes/behandling/personopplysninger/PersonopplysningerDTO.kt

-29
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package no.nav.tiltakspenger.saksbehandling.domene.personopplysninger
2+
3+
import no.nav.tiltakspenger.libs.common.Fnr
4+
5+
data class EnkelPerson(
6+
val fnr: Fnr,
7+
val fornavn: String,
8+
val mellomnavn: String?,
9+
val etternavn: String,
10+
val fortrolig: Boolean,
11+
val strengtFortrolig: Boolean,
12+
val strengtFortroligUtland: Boolean,
13+
val skjermet: Boolean?,
14+
)
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package no.nav.tiltakspenger.saksbehandling.ports
22

33
import no.nav.tiltakspenger.libs.common.Fnr
4+
import no.nav.tiltakspenger.saksbehandling.domene.personopplysninger.EnkelPerson
45
import no.nav.tiltakspenger.saksbehandling.domene.personopplysninger.Personopplysninger
56

67
interface PersonGateway {
78
suspend fun hentPerson(fnr: Fnr): List<Personopplysninger>
9+
suspend fun hentEnkelPerson(fnr: Fnr): EnkelPerson
810
}

test-common/src/main/kotlin/no/nav/tiltakspenger/common/TestApplicationContext.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import no.nav.tiltakspenger.libs.common.AccessToken
2222
import no.nav.tiltakspenger.libs.common.Fnr
2323
import no.nav.tiltakspenger.libs.common.TestSessionFactory
2424
import no.nav.tiltakspenger.libs.personklient.tilgangsstyring.TilgangsstyringServiceImpl
25-
import no.nav.tiltakspenger.saksbehandling.domene.personopplysninger.Personopplysninger
25+
import no.nav.tiltakspenger.saksbehandling.domene.personopplysninger.PersonopplysningerSøker
2626
import no.nav.tiltakspenger.saksbehandling.domene.tiltak.Tiltak
2727
import no.nav.tiltakspenger.vedtak.context.ApplicationContext
2828
import no.nav.tiltakspenger.vedtak.context.DokumentContext
@@ -63,7 +63,7 @@ class TestApplicationContext : ApplicationContext(TestSessionFactory(), "fake-gi
6363
fun leggTilPerson(
6464
fnr: Fnr,
6565
erSkjermet: Boolean,
66-
personopplysningerForBruker: Personopplysninger,
66+
personopplysningerForBruker: PersonopplysningerSøker,
6767
tiltak: Tiltak,
6868
) {
6969
skjermingFakeGateway.leggTil(fnr = fnr, skjermet = erSkjermet)

test-common/src/main/kotlin/no/nav/tiltakspenger/fakes/clients/PersonFakeGateway.kt

+19-4
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,40 @@ package no.nav.tiltakspenger.fakes.clients
22

33
import arrow.atomic.Atomic
44
import no.nav.tiltakspenger.libs.common.Fnr
5-
import no.nav.tiltakspenger.saksbehandling.domene.personopplysninger.Personopplysninger
5+
import no.nav.tiltakspenger.saksbehandling.domene.personopplysninger.EnkelPerson
6+
import no.nav.tiltakspenger.saksbehandling.domene.personopplysninger.PersonopplysningerSøker
67
import no.nav.tiltakspenger.saksbehandling.ports.PersonGateway
78

89
class PersonFakeGateway : PersonGateway {
9-
private val data = Atomic(mutableMapOf<Fnr, List<Personopplysninger>>())
10+
private val data = Atomic(mutableMapOf<Fnr, List<PersonopplysningerSøker>>())
1011

1112
private val kall = Atomic(mutableListOf<Fnr>())
1213
val antallKall: Int get() = kall.get().size
1314
val alleKall: List<Fnr> get() = kall.get().toList()
1415

15-
override suspend fun hentPerson(fnr: Fnr): List<Personopplysninger> = data.get()[fnr]!!
16+
override suspend fun hentPerson(fnr: Fnr): List<PersonopplysningerSøker> = data.get()[fnr]!!
17+
18+
override suspend fun hentEnkelPerson(fnr: Fnr): EnkelPerson = data.get()[fnr]!!.single().let {
19+
EnkelPerson(
20+
fnr = fnr,
21+
fornavn = it.fornavn,
22+
mellomnavn = it.mellomnavn,
23+
etternavn = it.etternavn,
24+
fortrolig = it.fortrolig,
25+
strengtFortrolig = it.strengtFortrolig,
26+
strengtFortroligUtland = it.strengtFortroligUtland,
27+
skjermet = it.skjermet,
28+
29+
)
30+
}
1631

1732
/**
1833
* Denne bør kalles av testoppsettet før vi lager en søknad.
1934
* Overskriver eksisterende personopplysninger for personen.
2035
*/
2136
fun leggTilPersonopplysning(
2237
fnr: Fnr,
23-
personopplysninger: List<Personopplysninger>,
38+
personopplysninger: List<PersonopplysningerSøker>,
2439
) {
2540
data.get()[fnr] = personopplysninger
2641
}

test-common/src/main/kotlin/no/nav/tiltakspenger/objectmothers/BehandlingMother.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import no.nav.tiltakspenger.saksbehandling.domene.behandling.Attesteringsstatus
2222
import no.nav.tiltakspenger.saksbehandling.domene.behandling.Førstegangsbehandling
2323
import no.nav.tiltakspenger.saksbehandling.domene.behandling.Søknad
2424
import no.nav.tiltakspenger.saksbehandling.domene.personopplysninger.Personopplysninger
25+
import no.nav.tiltakspenger.saksbehandling.domene.personopplysninger.PersonopplysningerSøker
2526
import no.nav.tiltakspenger.saksbehandling.domene.sak.Sak
2627
import no.nav.tiltakspenger.saksbehandling.domene.sak.Saksnummer
2728
import no.nav.tiltakspenger.saksbehandling.domene.tiltak.Tiltak
@@ -212,7 +213,7 @@ fun TestApplicationContext.nySøknad(
212213
fornavn = fornavn,
213214
etternavn = etternavn,
214215
),
215-
personopplysningerForBrukerFraPdl: Personopplysninger =
216+
personopplysningerForBrukerFraPdl: PersonopplysningerSøker =
216217
ObjectMother.personopplysningKjedeligFyr(
217218
fnr = fnr,
218219
skjermet = erSkjermet,
@@ -250,7 +251,7 @@ fun TestApplicationContext.førstegangsbehandlingUavklart(
250251
saksbehandler: Saksbehandler = saksbehandler(),
251252
erSkjermet: Boolean = false,
252253
dselsdato: LocalDate = 1.januar(2000),
253-
personopplysningerForBrukerFraPdl: Personopplysninger =
254+
personopplysningerForBrukerFraPdl: PersonopplysningerSøker =
254255
ObjectMother.personopplysningKjedeligFyr(
255256
fnr = fnr,
256257
skjermet = erSkjermet,

0 commit comments

Comments
 (0)