diff --git a/integrasjon/arbeidsfordeling-klient/src/main/java/no/nav/vedtak/felles/integrasjon/skjerming/AbstractSkjermetPersonGCPKlient.java b/integrasjon/arbeidsfordeling-klient/src/main/java/no/nav/vedtak/felles/integrasjon/skjerming/AbstractSkjermetPersonGCPKlient.java index 83adc305a..5af890cf4 100644 --- a/integrasjon/arbeidsfordeling-klient/src/main/java/no/nav/vedtak/felles/integrasjon/skjerming/AbstractSkjermetPersonGCPKlient.java +++ b/integrasjon/arbeidsfordeling-klient/src/main/java/no/nav/vedtak/felles/integrasjon/skjerming/AbstractSkjermetPersonGCPKlient.java @@ -15,7 +15,7 @@ import no.nav.vedtak.felles.integrasjon.rest.RestRequest; // Extend og annoter med endpoint+default og scopes/default + tokenConfig = AzureAD_CC -//@RestClientConfig(tokenConfig = TokenFlow.AZUREAD_CC, endpointProperty = "skjermet.person.rs.url", endpointDefault = "https://skjermede-personer-pip.intern.nav.no/skjermet", +//@RestClientConfig(tokenConfig = TokenFlow.AZUREAD_CC, endpointProperty = "skjermet.person.rs.url", endpointDefault = "https://skjermede-personer-pip.intern.nav.no", // scopesProperty = "skjermet.person.rs.azure.scope", scopesDefault = "api://prod-gcp.nom.skjermede-personer-pip/.default") public abstract class AbstractSkjermetPersonGCPKlient implements Skjerming { diff --git a/integrasjon/pip-klient/README.md b/integrasjon/pip-klient/README.md new file mode 100644 index 000000000..637d750bd --- /dev/null +++ b/integrasjon/pip-klient/README.md @@ -0,0 +1,13 @@ +# pip-klient + +Samling av pip-klienter som brukes til å henter informasjon for tilgangskontroll og ruting av saker + +## Hensikten + +Tilby data til applikasjoner som implementerer tilgangskontrollvurderinger + +## Integrasjoner + +* PDL-PIP-API +* SKJERMET PERSON +* Muligens FP-sak diff --git a/integrasjon/pip-klient/pom.xml b/integrasjon/pip-klient/pom.xml new file mode 100644 index 000000000..950b35334 --- /dev/null +++ b/integrasjon/pip-klient/pom.xml @@ -0,0 +1,23 @@ + + + 4.0.0 + + no.nav.foreldrepenger.felles.integrasjon + felles-integrasjon-pom + 0.0.0-SNAPSHOT + + pip-klient + jar + Felles :: Integrasjonsendepunkt - pip-klient + + + + no.nav.foreldrepenger.felles.integrasjon + felles-integrasjon-rest-klient + + + jakarta.validation + jakarta.validation-api + + + diff --git a/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/fpsakpip/AbstractForeldrepengerPipKlient.java b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/fpsakpip/AbstractForeldrepengerPipKlient.java new file mode 100644 index 000000000..2278762ce --- /dev/null +++ b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/fpsakpip/AbstractForeldrepengerPipKlient.java @@ -0,0 +1,69 @@ +package no.nav.vedtak.felles.integrasjon.fpsakpip; + +import java.net.URI; +import java.util.List; +import java.util.Objects; + +import jakarta.validation.constraints.NotNull; +import jakarta.ws.rs.core.UriBuilder; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import no.nav.vedtak.felles.integrasjon.rest.RestClient; +import no.nav.vedtak.felles.integrasjon.rest.RestConfig; +import no.nav.vedtak.felles.integrasjon.rest.RestRequest; + +/* + * Informasjon fra skjermingsløsningen til bruk for tilgangskontroll. Registrer klientapps hos nom + */ + +// Extend og annoter med @RestClientConfig(tokenConfig = TokenFlow.AZUREAD_CC, application = FpApplication.FPSAK) +public abstract class AbstractForeldrepengerPipKlient implements ForeldrepengerPip { + + private static final Logger LOG = LoggerFactory.getLogger(AbstractForeldrepengerPipKlient.class); + + private static final String SAK_AKTØR_PATH = "/api/pip/aktoer-for-sak"; + + private final RestClient restClient; + private final RestConfig restConfig; + + private final URI sakAktørerEndpoint; + + protected AbstractForeldrepengerPipKlient() { + this(RestClient.client()); + } + + protected AbstractForeldrepengerPipKlient(RestClient restClient) { + this.restClient = restClient; + this.restConfig = RestConfig.forClient(this.getClass()); + this.sakAktørerEndpoint = UriBuilder.fromUri(restConfig.fpContextPath()).path(SAK_AKTØR_PATH).build(); + if (!restConfig.tokenConfig().isAzureAD()) { + throw new IllegalArgumentException("Utviklerfeil: klient må annoteres med Azure CC"); + } + } + + + @Override + public List personerForSak(String saksnummer) { + if (saksnummer == null) { + return List.of(); + } + + var request = RestRequest.newPOSTJson(new SaksnummerDto(saksnummer), sakAktørerEndpoint, restConfig); + + try { + return restClient.sendReturnList(request, ForeldrepengerPipAktørId.class); + } catch (Exception e) { + LOG.info("ForeldrepengerPip fikk feil", e); + } + return restClient.sendReturnList(request, ForeldrepengerPipAktørId.class); + } + + public record SaksnummerDto(@NotNull String saksnummer) { + public SaksnummerDto { + Objects.requireNonNull(saksnummer, "saksnummer"); + } + } + +} diff --git a/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/fpsakpip/ForeldrepengerPip.java b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/fpsakpip/ForeldrepengerPip.java new file mode 100644 index 000000000..d230cb5ab --- /dev/null +++ b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/fpsakpip/ForeldrepengerPip.java @@ -0,0 +1,9 @@ +package no.nav.vedtak.felles.integrasjon.fpsakpip; + +import java.util.List; + +public interface ForeldrepengerPip { + + List personerForSak(String fnr); + +} diff --git "a/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/fpsakpip/ForeldrepengerPipAkt\303\270rId.java" "b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/fpsakpip/ForeldrepengerPipAkt\303\270rId.java" new file mode 100644 index 000000000..6d3286dc8 --- /dev/null +++ "b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/fpsakpip/ForeldrepengerPipAkt\303\270rId.java" @@ -0,0 +1,68 @@ +package no.nav.vedtak.felles.integrasjon.fpsakpip; + +import java.io.Serializable; +import java.util.Objects; +import java.util.regex.Pattern; + +import jakarta.validation.constraints.NotNull; + +import com.fasterxml.jackson.annotation.JsonValue; + +/** + * Id som genereres fra NAV Aktørregister. + * Denne iden benyttes til interne forhold i Nav og vil ikke endres f.eks. dersom bruker går fra DNR til FNR i Folkeregisteret. + */ +public class ForeldrepengerPipAktørId implements Serializable, Comparable { + private static final String VALID_REGEXP = "^\\d{13}$"; + + private static final Pattern VALID = Pattern.compile(VALID_REGEXP, Pattern.CASE_INSENSITIVE); + + @JsonValue + @NotNull + @jakarta.validation.constraints.Pattern(regexp = VALID_REGEXP, message = "aktørId ${validatedValue} har ikke gyldig verdi (pattern '{regexp}')") + private String aktørId; + + public ForeldrepengerPipAktørId(Long aktørId) { + Objects.requireNonNull(aktørId, "aktørId"); + this.aktørId = validateAktørId(aktørId.toString()); + } + + public ForeldrepengerPipAktørId(String aktørId) { + this.aktørId = validateAktørId(aktørId); + } + + private String validateAktørId(String aktørId) { + Objects.requireNonNull(aktørId, "aktørId"); + if (!VALID.matcher(aktørId).matches()) { + // skal ikke skje, funksjonelle feilmeldinger håndteres ikke her. + throw new IllegalArgumentException("Ugyldig aktørId '" + aktørId + "', tillatt pattern: " + VALID_REGEXP); + } + return aktørId; + } + + public String getVerdi() { + return aktørId; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof ForeldrepengerPipAktørId annen && Objects.equals(aktørId, annen.aktørId); + } + + @Override + public int hashCode() { + return Objects.hash(aktørId); + } + + @Override + public String toString() { + return getClass().getSimpleName() + ""; + } + + @Override + public int compareTo(ForeldrepengerPipAktørId o) { + // TODO: Burde ikke finnes + return aktørId.compareTo(o.aktørId); + } + +} diff --git a/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/pdlpip/AbstractPersondataPipKlient.java b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/pdlpip/AbstractPersondataPipKlient.java new file mode 100644 index 000000000..6aefd3383 --- /dev/null +++ b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/pdlpip/AbstractPersondataPipKlient.java @@ -0,0 +1,79 @@ +package no.nav.vedtak.felles.integrasjon.pdlpip; + +import java.net.URI; +import java.time.Duration; +import java.util.List; +import java.util.Map; + +import jakarta.ws.rs.core.UriBuilder; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import no.nav.vedtak.felles.integrasjon.rest.RestClient; +import no.nav.vedtak.felles.integrasjon.rest.RestConfig; +import no.nav.vedtak.felles.integrasjon.rest.RestRequest; + +/* + * Informasjon fra PDL til bruk kun for tilgangskontroll. Registrer klientapps hos pdl + * + * PROD: SD innenfor FSS ellers https pdl-pip-api.intern.nav.no (scope: prod-fss:pdl:pdl-pip-api) + * DEV: SD innenfor FSS ellers https pdl-pip-api.dev.intern.nav.no (scope: dev-fss:pdl:pdl-pip-api) + */ + +// Extend og annoter med endpoint+default og scopes/default + tokenConfig = AzureAD_CC +//@RestClientConfig(tokenConfig = TokenFlow.AZUREAD_CC, endpointProperty = "pdl.pip.base.url", +// endpointDefault = "http://pdl-pip-api.pdl/api/v1", // For FSS - apps i GCP bruker https://pdl-pip-api.intern.nav.no/api/v1 +// scopesProperty = "pdl.pip.scope", scopesDefault = "api://prod-fss:pdl:pdl-pip-api/.default") +public abstract class AbstractPersondataPipKlient implements PersondataPip { + + private static final Logger LOG = LoggerFactory.getLogger(AbstractPersondataPipKlient.class); + private static final String PERSON_PATH = "person"; + private static final String PERSON_BOLK_PATH = "personBolk"; + + private final RestClient client; + private final RestConfig restConfig; + private final URI pipPersonBolkEndpoint; + private final URI pipPersonEndpoint; + + + protected AbstractPersondataPipKlient() { + this(RestClient.client()); + } + + protected AbstractPersondataPipKlient(RestClient restClient) { + this.client = restClient; + this.restConfig = RestConfig.forClient(this.getClass()); + this.pipPersonEndpoint = UriBuilder.fromUri(restConfig.endpoint()).path(PERSON_PATH).build(); + this.pipPersonBolkEndpoint = UriBuilder.fromUri(restConfig.endpoint()).path(PERSON_BOLK_PATH).build(); + if (!restConfig.tokenConfig().isAzureAD()) { + throw new IllegalArgumentException("Utviklerfeil: klient må annoteres med Azure CC"); + } + } + + @Override + public PersondataPipDto hentTilgangPersondata(String ident) { + var request = RestRequest.newGET(pipPersonEndpoint, restConfig) + .header("ident", ident) + .timeout(Duration.ofSeconds(5)); + try { + return client.send(request, PersondataPipDto.class); + } catch (Exception e) { + LOG.info("PdlPip fikk feil", e); + } + return client.send(request, PersondataPipDto.class); + } + + @Override + public Map hentTilgangPersondataBolk(List identer) { + var request = RestRequest.newPOSTJson(identer, pipPersonBolkEndpoint, restConfig) + .timeout(Duration.ofSeconds(5)); + try { + return client.sendReturnMap(request, PersondataPipDto.class); + } catch (Exception e) { + LOG.info("PdlPip fikk feil", e); + } + return client.sendReturnMap(request, PersondataPipDto.class); + } + +} diff --git a/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/pdlpip/PersondataPip.java b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/pdlpip/PersondataPip.java new file mode 100644 index 000000000..a4f0d3810 --- /dev/null +++ b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/pdlpip/PersondataPip.java @@ -0,0 +1,12 @@ +package no.nav.vedtak.felles.integrasjon.pdlpip; + +import java.util.List; +import java.util.Map; + +public interface PersondataPip { + + PersondataPipDto hentTilgangPersondata(String ident); + + Map hentTilgangPersondataBolk(List identer); + +} diff --git a/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/pdlpip/PersondataPipDto.java b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/pdlpip/PersondataPipDto.java new file mode 100644 index 000000000..284c1a0bb --- /dev/null +++ b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/pdlpip/PersondataPipDto.java @@ -0,0 +1,97 @@ +package no.nav.vedtak.felles.integrasjon.pdlpip; + +import java.time.LocalDate; +import java.util.List; +import java.util.Optional; + +import com.fasterxml.jackson.annotation.JsonEnumDefaultValue; + +public record PersondataPipDto(String aktoerId, Person person, Identer identer, GeografiskTilknytning geografiskTilknytning) { + + public record Person(List adressebeskyttelse, List foedsel, + List doedsfall, List familierelasjoner) { + } + + public record Adressebeskyttelse(Gradering gradering) { } + + public record Fødsel(LocalDate foedselsdato) { } + + public record Dødsfall(LocalDate doedsdato) { } + + public record Familierelasjon(String relatertPersonsIdent) { } // en personIdent (FNR/DNR) + + public record Identer(List identer) { } + + public record Ident(String ident, Boolean historisk, IdentGruppe gruppe) { } + + public record GeografiskTilknytning(GtType gtType, String gtKommune, String gtBydel, String gtLand, String regel) { } + + public enum Gradering { STRENGT_FORTROLIG_UTLAND, STRENGT_FORTROLIG, FORTROLIG, @JsonEnumDefaultValue UDEFINERT } + + public enum IdentGruppe { AKTORID, FOLKEREGISTERIDENT, NPID, @JsonEnumDefaultValue UDEFINERT } + + public enum GtType { KOMMUNE, BYDEL, UTLAND, @JsonEnumDefaultValue UDEFINERT } + + public enum Relasjonsrolle { FAR, MOR, MEDMOR, BARN, @JsonEnumDefaultValue UDEFINERT } + + public boolean harStrengAdresseBeskyttelse() { + return Optional.ofNullable(person()).map(Person::adressebeskyttelse).orElse(List.of()).stream() + .map(Adressebeskyttelse::gradering) + .anyMatch(g -> Gradering.STRENGT_FORTROLIG.equals(g) || Gradering.STRENGT_FORTROLIG_UTLAND.equals(g)); + } + + public boolean harAdresseBeskyttelse() { + return Optional.ofNullable(person()).map(Person::adressebeskyttelse).orElse(List.of()).stream() + .map(Adressebeskyttelse::gradering) + .anyMatch(g -> g != null && !Gradering.UDEFINERT.equals(g)); + } + + public boolean erIkkeMyndig() { + return Optional.ofNullable(person()).map(Person::foedsel).orElse(List.of()).stream() + .map(Fødsel::foedselsdato) + .anyMatch(f -> f == null || f.plusYears(18).isAfter(LocalDate.now())); + } + + public String personIdent() { + return Optional.ofNullable(identer()).map(Identer::identer).orElse(List.of()).stream() + .filter(i -> IdentGruppe.FOLKEREGISTERIDENT.equals(i.gruppe())) + .filter(i -> !i.historisk()) + .map(Ident::ident) + .findFirst().orElse(null); + } + + public List personIdenter() { + return Optional.ofNullable(identer()).map(Identer::identer).orElse(List.of()).stream() + .filter(i -> IdentGruppe.FOLKEREGISTERIDENT.equals(i.gruppe())) + .map(Ident::ident) + .toList(); + } + + public String aktørId() { + return Optional.ofNullable(identer()).map(Identer::identer).orElse(List.of()).stream() + .filter(i -> IdentGruppe.AKTORID.equals(i.gruppe())) + .filter(i -> !i.historisk()) + .map(Ident::ident) + .findFirst().orElse(null); + } + + public List aktørIdMedHistoriske() { + return Optional.ofNullable(identer()).map(Identer::identer).orElse(List.of()).stream() + .filter(i -> IdentGruppe.AKTORID.equals(i.gruppe())) + .map(Ident::ident) + .toList(); + } + + public boolean harNasjonalTilknytning() { + return Optional.ofNullable(geografiskTilknytning()).map(GeografiskTilknytning::gtType) + .filter(gtt -> GtType.KOMMUNE.equals(gtt) || GtType.BYDEL.equals(gtt)) + .isPresent(); + } + + public boolean harIkkeNasjonalTilknytning() { + return Optional.ofNullable(geografiskTilknytning()).map(GeografiskTilknytning::gtType) + .filter(gtt -> GtType.KOMMUNE.equals(gtt) || GtType.BYDEL.equals(gtt)) + .isEmpty(); + } + +} diff --git a/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/skjermingpip/AbstractSkjermetPersonPipKlient.java b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/skjermingpip/AbstractSkjermetPersonPipKlient.java new file mode 100644 index 000000000..6cd40b314 --- /dev/null +++ b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/skjermingpip/AbstractSkjermetPersonPipKlient.java @@ -0,0 +1,99 @@ +package no.nav.vedtak.felles.integrasjon.skjermingpip; + +import java.net.URI; +import java.util.List; +import java.util.Map; + +import jakarta.ws.rs.core.UriBuilder; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import no.nav.vedtak.felles.integrasjon.rest.RestClient; +import no.nav.vedtak.felles.integrasjon.rest.RestConfig; +import no.nav.vedtak.felles.integrasjon.rest.RestRequest; + +/* + * Informasjon fra skjermingsløsningen til bruk for tilgangskontroll. Registrer klientapps hos nom + */ + +// Extend og annoter med endpoint+default og scopes/default + tokenConfig = AzureAD_CC +//@RestClientConfig(tokenConfig = TokenFlow.AZUREAD_CC, endpointProperty = "skjermet.person.pip.base.url", +// endpointDefault = "https://skjermede-personer-pip.intern.nav.no", // For FSS - apps i GCP bruker http://skjermede-personer-pip.nom +// scopesProperty = "skjermet.person.pip.scope", scopesDefault = "api://prod-gcp.nom.skjermede-personer-pip/.default") +public abstract class AbstractSkjermetPersonPipKlient implements SkjermetPersonPip { + + private static final Logger LOG = LoggerFactory.getLogger(AbstractSkjermetPersonPipKlient.class); + + private static final String SKJERMET_PATH = "skjermet"; + private static final String BULK_PATH = "skjermetBulk"; + + private final RestClient client; + private final RestConfig restConfig; + private final URI bulkEndpoint; + private final URI skjermetEndpoint; + + protected AbstractSkjermetPersonPipKlient() { + this(RestClient.client()); + } + + protected AbstractSkjermetPersonPipKlient(RestClient restClient) { + this.client = restClient; + this.restConfig = RestConfig.forClient(this.getClass()); + this.skjermetEndpoint = UriBuilder.fromUri(restConfig.endpoint()).path(SKJERMET_PATH).build(); + this.bulkEndpoint = UriBuilder.fromUri(restConfig.endpoint()).path(BULK_PATH).build(); + if (!restConfig.tokenConfig().isAzureAD()) { + throw new IllegalArgumentException("Utviklerfeil: klient må annoteres med Azure CC"); + } + } + + + @Override + public boolean erSkjermet(String fnr) { + if (fnr == null) { + return false; + } + + var request = RestRequest.newPOSTJson(new SkjermetRequestDto(fnr), skjermetEndpoint, restConfig); + + try { + return kallMedSjekk(request); + } catch (Exception e) { + LOG.info("SkjermetPerson fikk feil", e); + } + return kallMedSjekk(request); + } + + private boolean kallMedSjekk(RestRequest request) { + var skjermet = client.send(request, String.class); + return "true".equalsIgnoreCase(skjermet); + } + + @Override + public boolean erNoenSkjermet(List fnr) { + if (fnr == null || fnr.isEmpty()) { + return false; + } + + var request = RestRequest.newPOSTJson(new SkjermetBulkRequestDto(fnr), bulkEndpoint, restConfig); + + try { + return kallBulkMedSjekk(request); + } catch (Exception e) { + LOG.info("SkjermetPerson fikk feil", e); + } + return kallBulkMedSjekk(request); + } + + @SuppressWarnings("unchecked") + private boolean kallBulkMedSjekk(RestRequest request) { + // Se github / skjerming / PipController + Map skjermet = client.send(request, Map.class); + return skjermet.values().stream().anyMatch(v -> v); + } + + private record SkjermetRequestDto(String personident) { } + + private record SkjermetBulkRequestDto(List personidenter) { } + +} diff --git a/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/skjermingpip/SkjermetPersonPip.java b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/skjermingpip/SkjermetPersonPip.java new file mode 100644 index 000000000..b19455d95 --- /dev/null +++ b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/skjermingpip/SkjermetPersonPip.java @@ -0,0 +1,11 @@ +package no.nav.vedtak.felles.integrasjon.skjermingpip; + +import java.util.List; + +public interface SkjermetPersonPip { + + boolean erSkjermet(String fnr); + + boolean erNoenSkjermet(List fnr); + +} diff --git a/integrasjon/pip-klient/src/test/java/no/nav/vedtak/felles/integrasjon/pdlpip/PersondataPipTest.java b/integrasjon/pip-klient/src/test/java/no/nav/vedtak/felles/integrasjon/pdlpip/PersondataPipTest.java new file mode 100644 index 000000000..a96c0bfc1 --- /dev/null +++ b/integrasjon/pip-klient/src/test/java/no/nav/vedtak/felles/integrasjon/pdlpip/PersondataPipTest.java @@ -0,0 +1,151 @@ +package no.nav.vedtak.felles.integrasjon.pdlpip; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +import no.nav.vedtak.mapper.json.DefaultJsonMapper; + + + +public class PersondataPipTest { + + private static final String PERSON_RESPONS = """ + { + "person": { + "adressebeskyttelse": [ + { + "gradering": "STRENGT_FORTROLIG_UTLAND" + } + ], + "foedsel": [ + { + "foedselsdato": "1911-01-01" + } + ], + "doedsfall": [ + { + "doedsdato": "1977-07-07" + } + ], + "familierelasjoner": [ + { + "relatertPersonsIdent": "11223344550" + } + ] + }, + "identer": { + "identer": [ + { + "ident": "1234567890123", + "historisk": false, + "gruppe": "AKTORID" + }, + { + "ident": "9876543210987", + "historisk": true, + "gruppe": "AKTORID" + }, + { + "ident": "12345678901", + "historisk": false, + "gruppe": "FOLKEREGISTERIDENT" + }, + { + "ident": "98765432109", + "historisk": true, + "gruppe": "FOLKEREGISTERIDENT" + } + ] + }, + "geografiskTilknytning": { + "gtType": null, + "gtKommune": "kommune", + "gtBydel": "bydel", + "gtLand": "sørlandet", + "regel": "42" + } + } + """; + + private static final String PERSON_BOLK_RESPONS = """ + { + "12345678901": { + "person": { + "adressebeskyttelse": [], + "foedsel": [ + { + "foedselsdato": "1998-05-09" + } + ], + "doedsfall": [ + ], + "familierelasjoner": [ + { + "relatertPersonsIdent": "23456789012" + }, + { + "relatertPersonsIdent": "34567890123" + } + ] + }, + "identer": { + "identer": [ + { + "ident": "2052090676205", + "historisk": false, + "gruppe": "AKTORID" + }, + { + "ident": "12345678901", + "historisk": false, + "gruppe": "FOLKEREGISTERIDENT" + } + ] + }, + "geografiskTilknytning": { + "gtType": "KOMMUNE", + "gtKommune": "4644", + "gtBydel": null, + "gtLand": null, + "regel": "18" + } + }, + "10111111111": null + } + """; + + @Test + void test_response() { + var deserialized = DefaultJsonMapper.fromJson(PERSON_RESPONS, PersondataPipDto.class); + assertThat(deserialized).isNotNull(); + assertThat(deserialized.harStrengAdresseBeskyttelse()).isTrue(); + assertThat(deserialized.harAdresseBeskyttelse()).isTrue(); + assertThat(deserialized.harIkkeNasjonalTilknytning()).isTrue(); + assertThat(deserialized.harNasjonalTilknytning()).isFalse(); + assertThat(deserialized.erIkkeMyndig()).isFalse(); + assertThat(deserialized.aktørIdMedHistoriske()).hasSize(2); + assertThat(deserialized.aktørId()).isEqualTo("1234567890123"); + assertThat(deserialized.personIdent()).isEqualTo("12345678901"); + } + + @Test + void test_response_bolk() { + var deserialized = DefaultJsonMapper.mapFromJson(PERSON_BOLK_RESPONS, PersondataPipDto.class); + assertThat(deserialized).isNotNull(); + assertThat(deserialized).isNotEmpty(); + assertThat(deserialized.keySet()).hasSize(2); + assertThat(deserialized.values()).hasSize(2); + assertThat(deserialized.get("10111111111")).isNull();; + var element = deserialized.get("12345678901"); + assertThat(element.harStrengAdresseBeskyttelse()).isFalse(); + assertThat(element.harAdresseBeskyttelse()).isFalse(); + assertThat(element.harNasjonalTilknytning()).isTrue(); + assertThat(element.harIkkeNasjonalTilknytning()).isFalse(); + assertThat(element.erIkkeMyndig()).isFalse(); + assertThat(element.aktørIdMedHistoriske()).hasSize(1); + assertThat(element.aktørId()).isEqualTo("2052090676205"); + assertThat(element.personIdent()).isEqualTo("12345678901"); + } + +} diff --git a/integrasjon/pom.xml b/integrasjon/pom.xml index c6681f183..08a8d6671 100644 --- a/integrasjon/pom.xml +++ b/integrasjon/pom.xml @@ -20,6 +20,7 @@ infotrygd-grunnlag-klient dokarkiv-klient person-klient + pip-klient oppgave-rest-klient ereg-klient saf-klient