Skip to content

Commit

Permalink
Feature/add legacy search functionality and mapping strategies
Browse files Browse the repository at this point in the history
  • Loading branch information
krharum committed Mar 5, 2025
1 parent baa084a commit 3213f93
Show file tree
Hide file tree
Showing 10 changed files with 733 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,12 @@
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import no.nav.testnav.libs.data.pdlforvalter.v1.FolkeregisterPersonstatusDTO;
import no.nav.testnav.libs.data.pdlforvalter.v1.ForelderBarnRelasjonDTO;
import no.nav.testnav.libs.data.pdlforvalter.v1.KjoennDTO;
import no.nav.testnav.libs.data.pdlforvalter.v1.SivilstandDTO;

import java.time.LocalDate;
import java.util.List;

@Data
Expand All @@ -15,6 +20,7 @@ public class Person {

private HentIdenter hentIdenter;
private HentPerson hentPerson;
private List<String> tags;

@Data
@Builder
Expand All @@ -31,6 +37,7 @@ public static class HentIdenter {
public static class Identer {
private String gruppe;
private String ident;
private Boolean historisk;
}

@Data
Expand All @@ -39,6 +46,15 @@ public static class Identer {
@AllArgsConstructor
public static class HentPerson {
private List<Navn> navn;
private List<Foedselsdato> foedselsdato;
private List<Kjoenn> kjoenn;
private List<Sivilstand> sivilstand;
private List<Statsborgerskap> statsborgerskap;
private List<Folkeregisterpersonstatus> folkeregisterpersonstatus;
private List<Doedsfall> doedsfall;
private List<InnflyttingTilNorge> innflyttingTilNorge;
private List<UtflyttingFraNorge> utflyttingFraNorge;
private List<ForelderBarnRelasjon> forelderBarnRelasjon;
}

@Data
Expand All @@ -51,4 +67,109 @@ public static class Navn {
private String mellomnavn;
private String etternavn;
}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class Foedselsdato {

private LocalDate foedselsdato;
}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class Kjoenn {

private KjoennDTO.Kjoenn kjoenn;
}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class Sivilstand {

private SivilstandDTO.Sivilstand type;
private String relatertVedSivilstand;
}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class Statsborgerskap {

private String land;
}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class Folkeregisterpersonstatus {

private FolkeregisterPersonstatusDTO.FolkeregisterPersonstatus status;
private Folkeregistermetadata folkeregistermetadata;
}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class Folkeregistermetadata {

private LocalDate gyldighetstidspunkt;
}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class Doedsfall {

private LocalDate doedsdato;
}

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public static class InnflyttingTilNorge {

private String fraflyttingsland;
private String fraflyttingsstedIUtlandet;
}

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public static class UtflyttingFraNorge {

private String tilflyttingsland;
private String tilflyttingsstedIUtlandet;
private LocalDate utflyttingsdato;
}

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public static class ForelderBarnRelasjon {

private String relatertPersonsIdent;
private ForelderBarnRelasjonDTO.Rolle relatertPersonsRolle;
private ForelderBarnRelasjonDTO.Rolle minRolleForPerson;

public boolean isBarn() {
return relatertPersonsRolle == ForelderBarnRelasjonDTO.Rolle.BARN;
}

public boolean isForelder() {
return minRolleForPerson == ForelderBarnRelasjonDTO.Rolle.BARN;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package no.nav.testnav.dollysearchservice.mapper;

import ma.glasnost.orika.CustomMapper;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.MappingContext;
import no.nav.testnav.libs.data.dollysearchservice.v1.PersonRequest;
import no.nav.testnav.libs.data.dollysearchservice.v1.PersonSearch;
import no.nav.testnav.libs.data.pdlforvalter.v1.FolkeregisterPersonstatusDTO.FolkeregisterPersonstatus;
import no.nav.testnav.libs.data.pdlforvalter.v1.KjoennDTO;
import org.springframework.stereotype.Component;

import java.util.Optional;

import static java.util.Objects.nonNull;
import static org.apache.commons.lang3.StringUtils.isNotBlank;

@Component
public class LegacyRequestMappingStrategy implements MappingStrategy {

@Override
public void register(MapperFactory factory) {

factory.classMap(PersonSearch.class, PersonRequest.class)
.customize(new CustomMapper<PersonSearch, PersonRequest>() {
@Override
public void mapAtoB(PersonSearch personSearch, PersonRequest personRequest, MappingContext context) {

Optional.ofNullable(personSearch.getAlder())
.ifPresent(alder -> {
personRequest.setAlderFom(nonNull(alder.getFra()) ?
alder.getFra().intValue() : null);
personRequest.setAlderTom(nonNull(alder.getTil()) ?
alder.getTil().intValue() : null);
});

Optional.ofNullable(personSearch.getPersonstatus())
.ifPresent(personstatus ->
personRequest.setPersonStatus(FolkeregisterPersonstatus.valueOf(personstatus.getStatus())));

Optional.ofNullable(personSearch.getKjoenn())
.ifPresent(kjoenn -> personRequest.setKjoenn(KjoennDTO.Kjoenn.valueOf(kjoenn)));

Optional.ofNullable(personSearch.getNasjonalitet())
.ifPresent(nasjonalitet -> personRequest.setStatsborgerskap(nasjonalitet.getStatsborgerskap()));

Optional.ofNullable(personSearch.getAdresser())
.ifPresent(adresser -> {
personRequest.setAdresse(PersonRequest.AdresseRequest.builder()
.harUtenlandsadresse(isNotBlank(adresser.getHarUtenlandskAdresse()))
.harKontaktadresse(isNotBlank(adresser.getHarKontaktadresse()))
.harOppholdsadresse(isNotBlank(adresser.getHarOppholdsadresse()))
.build());
});
}
}).register();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
package no.nav.testnav.dollysearchservice.mapper;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import ma.glasnost.orika.CustomMapper;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.MappingContext;
import no.nav.testnav.dollysearchservice.dto.Person;
import no.nav.testnav.libs.data.dollysearchservice.v1.PersonDTO;
import org.springframework.stereotype.Component;

import static java.util.Objects.nonNull;
import static org.apache.commons.lang3.BooleanUtils.isFalse;

@Component
@RequiredArgsConstructor
public class LegacyResponseMappingStrategy implements MappingStrategy {

private final ObjectMapper objectMapper;

@Override
public void register(MapperFactory factory) {
factory.classMap(JsonNode.class, PersonDTO.class)
.customize(new CustomMapper<>() {

@Override
public void mapAtoB(JsonNode response, PersonDTO personDTO, MappingContext context) {

var person = objectMapper.convertValue(response, Person.class);
personDTO.setTags(person.getTags());
mapIdent(personDTO, person);
mapAktoerId(personDTO, person);
mapNavn(personDTO, person);
mapFoedselsdato(personDTO, person);
mapKjoenn(personDTO, person);
mapStatsborgerskap(personDTO, person);
mapSivilstand(personDTO, person);
mapPersonstatus(personDTO, person);
mapDoedsdato(personDTO, person);
mapInnflyttingTilNorge(personDTO, person);
mapUtflyttingFraNorge(personDTO, person);
mapForelderBarnRelasjoner(personDTO, person);
}
})
.register();
}

private static void mapIdent(PersonDTO personDTO, Person person) {

personDTO.setIdent(person.getHentIdenter().getIdenter().stream()
.filter(identer -> "FOLKEREGISTERIDENT".equals(identer.getGruppe()) &&
isFalse(identer.getHistorisk()))
.map(Person.Identer::getIdent)
.findFirst().orElse(null));
}

private static void mapAktoerId(PersonDTO personDTO, Person person) {

person.getHentIdenter().getIdenter().stream()
.filter(identer -> "AKTORID".equals(identer.getGruppe()) &&
isFalse(identer.getHistorisk()))
.map(Person.Identer::getIdent)
.findFirst()
.ifPresent(personDTO::setAktorId);
}

private static void mapNavn(PersonDTO personDTO, Person person) {

person.getHentPerson().getNavn().stream()
.findFirst()
.ifPresent(navn -> {
personDTO.setFornavn(navn.getFornavn());
personDTO.setMellomnavn(navn.getMellomnavn());
personDTO.setEtternavn(navn.getEtternavn());
});
}

private static void mapFoedselsdato(PersonDTO personDTO, Person person) {

person.getHentPerson().getFoedselsdato().stream()
.findFirst()
.ifPresent(foedselsdato ->
personDTO.setFoedselsdato(PersonDTO.FoedselsdatoDTO.builder()
.foedselsdato(foedselsdato.getFoedselsdato())
.build()));
}

private static void mapKjoenn(PersonDTO personDTO, Person person) {

person.getHentPerson().getKjoenn().stream()
.findFirst()
.ifPresent(kjoenn ->
personDTO.setKjoenn(kjoenn.getKjoenn().name()));
}

private static void mapStatsborgerskap(PersonDTO personDTO, Person person) {

if (nonNull(person.getHentPerson().getStatsborgerskap())) {
personDTO.setStatsborgerskap(PersonDTO.StatsborgerskapDTO.builder()
.land(person.getHentPerson().getStatsborgerskap().stream()
.map(Person.Statsborgerskap::getLand)
.distinct()
.toList())
.build());
}
}

private static void mapSivilstand(PersonDTO personDTO, Person person) {

person.getHentPerson().getSivilstand().stream()
.findFirst()
.ifPresent(sivilstand ->
personDTO.setSivilstand(PersonDTO.SivilstandDTO.builder()
.type(sivilstand.getType().name())
.relatertVedSivilstand(sivilstand.getRelatertVedSivilstand())
.build()));
}

private static void mapPersonstatus(PersonDTO personDTO, Person person) {

if (nonNull(person.getHentPerson().getFolkeregisterpersonstatus())) {
personDTO.setFolkeregisterpersonstatus(person.getHentPerson().getFolkeregisterpersonstatus().stream()
.map(personstatus -> PersonDTO.FolkeregisterpersonstatusDTO.builder()
.status(personstatus.getStatus().name())
.gyldighetstidspunkt(personstatus.getFolkeregistermetadata().getGyldighetstidspunkt())
.build())
.toList());
}
}

private void mapDoedsdato(PersonDTO personDTO, Person person) {

person.getHentPerson().getDoedsfall().stream()
.filter(doedsfall -> nonNull(doedsfall.getDoedsdato()))
.findFirst()
.ifPresent(doedsfall -> personDTO.setDoedsfall(PersonDTO.DoedsfallDTO.builder()
.doedsdato(doedsfall.getDoedsdato())
.build()));
}

private void mapInnflyttingTilNorge(PersonDTO personDTO, Person person) {

person.getHentPerson().getInnflyttingTilNorge().stream()
.findFirst()
.ifPresent(innflyttingTilNorge -> personDTO.setInnfyttingTilNorge(PersonDTO.InnflyttingTilNorgeDTO.builder()
.fraflyttingsland(innflyttingTilNorge.getFraflyttingsland())
.fraflyttingsstedIUtlandet(innflyttingTilNorge.getFraflyttingsstedIUtlandet())
.build()));
}

private void mapUtflyttingFraNorge(PersonDTO personDTO, Person person) {

person.getHentPerson().getUtflyttingFraNorge().stream()
.findFirst()
.ifPresent(utflyttingFraNorge -> personDTO.setUtfyttingFraNorge(PersonDTO.UtfyttingFraNorgeDTO.builder()
.tilflyttingsland(utflyttingFraNorge.getTilflyttingsland())
.tilflyttingsstedIUtlandet(utflyttingFraNorge.getTilflyttingsstedIUtlandet())
.utflyttingsdato(utflyttingFraNorge.getUtflyttingsdato())
.build()));
}

private void mapForelderBarnRelasjoner(PersonDTO personDTO, Person person) {

if (nonNull(person.getHentPerson().getForelderBarnRelasjon())) {
personDTO.setForelderBarnRelasjoner(PersonDTO.ForelderBarnRelasjonDTO.builder()
.barn(person.getHentPerson().getForelderBarnRelasjon().stream()
.filter(Person.ForelderBarnRelasjon::isBarn)
.map(Person.ForelderBarnRelasjon::getRelatertPersonsIdent)
.toList())
.foreldre(person.getHentPerson().getForelderBarnRelasjon().stream()
.filter(Person.ForelderBarnRelasjon::isForelder)
.map(forelderBarnRelasjon -> PersonDTO.ForelderDTO.builder()
.ident(forelderBarnRelasjon.getRelatertPersonsIdent())
.rolle(forelderBarnRelasjon.getRelatertPersonsRolle().name())
.build())
.toList())
.build());
}
}
}
Loading

0 comments on commit 3213f93

Please sign in to comment.