diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/DollyBackendApplicationStarter.java b/apps/dolly-backend/src/main/java/no/nav/dolly/DollyBackendApplicationStarter.java index 6af8668f777..f0ef428e58d 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/DollyBackendApplicationStarter.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/DollyBackendApplicationStarter.java @@ -10,4 +10,4 @@ public static void main(String[] args) { SpringApplication.run(DollyBackendApplicationStarter.class, args); } -} \ No newline at end of file +} diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClient.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClient.java index 45ff286e457..b4aabdc45b5 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClient.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClient.java @@ -9,6 +9,7 @@ import no.nav.dolly.bestilling.ClientFuture; import no.nav.dolly.bestilling.ClientRegister; import no.nav.dolly.bestilling.pdldata.PdlDataConsumer; +import no.nav.dolly.bestilling.pensjonforvalter.domain.AfpOffentligRequest; import no.nav.dolly.bestilling.pensjonforvalter.domain.AlderspensjonRequest; import no.nav.dolly.bestilling.pensjonforvalter.domain.AlderspensjonSoknadRequest; import no.nav.dolly.bestilling.pensjonforvalter.domain.AlderspensjonVedtakRequest; @@ -87,6 +88,7 @@ public class PensjonforvalterClient implements ClientRegister { private static final String PEN_ALDERSPENSJON = "AP#"; private static final String PEN_UFORETRYGD = "Ufoer#"; private static final String PEN_PENSJONSAVTALE = "Pensjonsavtale#"; + private static final String PEN_AFP_OFFENTLIG = "AfpOffentlig#"; private static final String PERIODE = "/periode/"; private final PensjonforvalterConsumer pensjonforvalterConsumer; @@ -165,7 +167,10 @@ public Flux gjenopprett(RsDollyUtvidetBestilling bestilling, Dolly .map(response -> TP_FORHOLD + decodeStatus(response, dollyPerson.getIdent())), lagrePensjonsavtale(pensjon, dollyPerson.getIdent(), bestilteMiljoer.get()) - .map(response -> PEN_PENSJONSAVTALE + decodeStatus(response, dollyPerson.getIdent())) + .map(response -> PEN_PENSJONSAVTALE + decodeStatus(response, dollyPerson.getIdent())), + + lagreAfpOffentlig(pensjon, dollyPerson.getIdent(), bestilteMiljoer.get()) + .map(response -> PEN_AFP_OFFENTLIG + decodeStatus(response, dollyPerson.getIdent())) ) .collectList() .doOnNext(statusResultat::addAll) @@ -210,6 +215,7 @@ public void release(List identer) { pensjonforvalterConsumer.sletteTpForhold(identer); pensjonforvalterConsumer.slettePensjonsavtale(identer); + pensjonforvalterConsumer.sletteAfpOffentlig(identer); } public static PensjonforvalterResponse mergePensjonforvalterResponses(List responser) { @@ -540,6 +546,21 @@ private Flux lagrePensjonsavtale(PensjonData pensjon, })); } + private Flux lagreAfpOffentlig(PensjonData pensjonData, String ident, Set miljoer) { + + return Flux.just(pensjonData) + .filter(PensjonData::hasAfpOffentlig) + .map(PensjonData::getAfpOffentlig) + .flatMap(pensjon -> Flux.fromIterable(miljoer) + .flatMap(miljoe -> { + + var context = MappingContextUtils.getMappingContext(); + context.setProperty(IDENT, ident); + var request = mapperFacade.map(pensjon, AfpOffentligRequest.class, context); + return pensjonforvalterConsumer.lagreAfpOffentlig(request, miljoe); + })); + } + private String decodeStatus(PensjonforvalterResponse response, String ident) { log.info("Mottatt status på {} fra Pensjon-Testdata-Facade: {}", ident, response); diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterConsumer.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterConsumer.java index c442b6957cf..b7e83723674 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterConsumer.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterConsumer.java @@ -6,6 +6,7 @@ import no.nav.dolly.bestilling.pensjonforvalter.command.AnnullerSamboerCommand; import no.nav.dolly.bestilling.pensjonforvalter.command.HentMiljoerCommand; import no.nav.dolly.bestilling.pensjonforvalter.command.HentSamboerCommand; +import no.nav.dolly.bestilling.pensjonforvalter.command.LagreAfpOffentligCommand; import no.nav.dolly.bestilling.pensjonforvalter.command.LagreAlderspensjonCommand; import no.nav.dolly.bestilling.pensjonforvalter.command.LagreGenerertPoppInntektCommand; import no.nav.dolly.bestilling.pensjonforvalter.command.LagrePensjonsavtaleCommand; @@ -16,8 +17,10 @@ import no.nav.dolly.bestilling.pensjonforvalter.command.LagreUforetrygdCommand; import no.nav.dolly.bestilling.pensjonforvalter.command.OpprettPersonCommand; import no.nav.dolly.bestilling.pensjonforvalter.command.PensjonHentVedtakCommand; +import no.nav.dolly.bestilling.pensjonforvalter.command.SletteAfpOffentligCommand; import no.nav.dolly.bestilling.pensjonforvalter.command.SlettePensjonsavtaleCommand; import no.nav.dolly.bestilling.pensjonforvalter.command.SletteTpForholdCommand; +import no.nav.dolly.bestilling.pensjonforvalter.domain.AfpOffentligRequest; import no.nav.dolly.bestilling.pensjonforvalter.domain.AlderspensjonRequest; import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonPersonRequest; import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonPoppGenerertInntektRequest; @@ -66,14 +69,14 @@ public PensjonforvalterConsumer( .build(); } - @Timed(name = "providers", tags = { "operation", "pen_getMiljoer" }) + @Timed(name = "providers", tags = {"operation", "pen_getMiljoer"}) public Mono> getMiljoer() { return tokenService.exchange(serverProperties) .flatMap(token -> new HentMiljoerCommand(webClient, token.getTokenValue()).call()); } - @Timed(name = "providers", tags = { "operation", "popp_lagreInntekt" }) + @Timed(name = "providers", tags = {"operation", "popp_lagreInntekt"}) public Flux lagreInntekter(PensjonPoppInntektRequest pensjonPoppInntektRequest) { return tokenService.exchange(serverProperties) @@ -81,7 +84,7 @@ public Flux lagreInntekter(PensjonPoppInntektRequest p pensjonPoppInntektRequest).call()); } - @Timed(name = "providers", tags = { "operation", "popp_lagreGenerertInntekt" }) + @Timed(name = "providers", tags = {"operation", "popp_lagreGenerertInntekt"}) public Flux lagreGenererteInntekter(PensjonPoppGenerertInntektRequest pensjonPoppGenerertInntektRequest) { return tokenService.exchange(serverProperties) @@ -89,7 +92,7 @@ public Flux lagreGenererteInntekter(PensjonPoppGenerer pensjonPoppGenerertInntektRequest).call()); } - @Timed(name = "providers", tags = { "operation", "pen_opprettPerson" }) + @Timed(name = "providers", tags = {"operation", "pen_opprettPerson"}) public Flux opprettPerson(PensjonPersonRequest pensjonPersonRequest, Set miljoer) { @@ -99,7 +102,7 @@ public Flux opprettPerson(PensjonPersonRequest pensjon .doOnNext(response -> log.info("Opprettet person for {}: {}", pensjonPersonRequest.getFnr(), response)); } - @Timed(name = "providers", tags = { "operation", "pen_hentSamboer" }) + @Timed(name = "providers", tags = {"operation", "pen_hentSamboer"}) public Flux hentSamboer(String ident, String miljoe) { return tokenService.exchange(serverProperties) @@ -107,7 +110,7 @@ public Flux hentSamboer(String ident, String miljoe) { .doOnNext(response -> log.info("Pensjon samboer for {} i {} hentet {}", ident, miljoe, response)); } - @Timed(name = "providers", tags = { "operation", "pen_opprettSamboer" }) + @Timed(name = "providers", tags = {"operation", "pen_opprettSamboer"}) public Flux lagreSamboer(PensjonSamboerRequest pensjonSamboerRequest, String miljoe) { @@ -115,14 +118,14 @@ public Flux lagreSamboer(PensjonSamboerRequest pensjon .flatMapMany(token -> new LagreSamboerCommand(webClient, pensjonSamboerRequest, miljoe, token.getTokenValue()).call()); } - @Timed(name = "providers", tags = { "operation", "pen_opprettSamboer" }) + @Timed(name = "providers", tags = {"operation", "pen_opprettSamboer"}) public Flux annullerSamboer(String periodeId, String miljoe) { return tokenService.exchange(serverProperties) .flatMapMany(token -> new AnnullerSamboerCommand(webClient, periodeId, miljoe, token.getTokenValue()).call()); } - @Timed(name = "providers", tags = { "operation", "pen_lagreAlderspensjon" }) + @Timed(name = "providers", tags = {"operation", "pen_lagreAlderspensjon"}) public Flux lagreAlderspensjon(AlderspensjonRequest request) { return tokenService.exchange(serverProperties) @@ -130,21 +133,21 @@ public Flux lagreAlderspensjon(AlderspensjonRequest re new LagreAlderspensjonCommand(webClient, token.getTokenValue(), request).call()); } - @Timed(name = "providers", tags = { "operation", "pen_lagreUforetrygd" }) + @Timed(name = "providers", tags = {"operation", "pen_lagreUforetrygd"}) public Flux lagreUforetrygd(PensjonUforetrygdRequest request) { return tokenService.exchange(serverProperties) .flatMapMany(token -> new LagreUforetrygdCommand(webClient, token.getTokenValue(), request).call()); } - @Timed(name = "providers", tags = { "operation", "pen_lagreTpForhold" }) + @Timed(name = "providers", tags = {"operation", "pen_lagreTpForhold"}) public Flux lagreTpForhold(PensjonTpForholdRequest pensjonTpForholdRequest) { return tokenService.exchange(serverProperties) .flatMapMany(token -> new LagreTpForholdCommand(webClient, token.getTokenValue(), pensjonTpForholdRequest).call()); } - @Timed(name = "providers", tags = { "operation", "pen_sletteTpForhold" }) + @Timed(name = "providers", tags = {"operation", "pen_sletteTpForhold"}) public void sletteTpForhold(List identer) { tokenService.exchange(serverProperties) @@ -156,21 +159,21 @@ public void sletteTpForhold(List identer) { .subscribe(response -> log.info("Slettet mot PESYS (tp) i alle miljoer")); } - @Timed(name = "providers", tags = { "operation", "pen_lagreTpYtelse" }) + @Timed(name = "providers", tags = {"operation", "pen_lagreTpYtelse"}) public Flux lagreTpYtelse(PensjonTpYtelseRequest pensjonTpYtelseRequest) { return tokenService.exchange(serverProperties) .flatMapMany(token -> new LagreTpYtelseCommand(webClient, token.getTokenValue(), pensjonTpYtelseRequest).call()); } - @Timed(name = "providers", tags = { "operation", "pen_lagrePensjpnsavtale" }) + @Timed(name = "providers", tags = {"operation", "pen_lagrePensjpnsavtale"}) public Flux lagrePensjonsavtale(PensjonsavtaleRequest pensjonsavtaleRequest) { return tokenService.exchange(serverProperties) .flatMapMany(token -> new LagrePensjonsavtaleCommand(webClient, pensjonsavtaleRequest, token.getTokenValue()).call()); } - @Timed(name = "providers", tags = { "operation", "pen_slettePensjpnsavtale" }) + @Timed(name = "providers", tags = {"operation", "pen_slettePensjpnsavtale"}) public void slettePensjonsavtale(List identer) { tokenService.exchange(serverProperties) @@ -180,15 +183,35 @@ public void slettePensjonsavtale(List identer) { .subscribe(resultat -> log.info("Slettet pensjonsavtaler (PEN), alle miljøer")); } - @Timed(name = "providers", tags = { "operation", "pen_hentVedtak" }) + @Timed(name = "providers", tags = {"operation", "pen_hentVedtak"}) public Flux hentVedtak(String ident, String miljoe) { return tokenService.exchange(serverProperties) - .flatMapMany(token -> new PensjonHentVedtakCommand(webClient, ident, miljoe, token.getTokenValue()).call()) + .flatMapMany(token -> new PensjonHentVedtakCommand(webClient, ident, miljoe, token.getTokenValue()).call()) .doOnNext(response -> log.info("Pensjon vedtak for ident {}, miljoe {} mottatt {}", ident, miljoe, response)); } + @Timed(name = "providers", tags = {"operation", "pen_lagreAfpOffentlig"}) + public Flux lagreAfpOffentlig(AfpOffentligRequest afpOffentligRequest, String miljoe) { + + return tokenService.exchange(serverProperties) + .flatMapMany(token -> new LagreAfpOffentligCommand(webClient, afpOffentligRequest, miljoe, token.getTokenValue()).call()); + } + + @Timed(name = "providers", tags = {"operation", "pen_sletteAfpOffentlig"}) + public void sletteAfpOffentlig(List identer) { + + tokenService.exchange(serverProperties) + .flatMapMany(token -> Flux.from(getMiljoer()) + .flatMap(Flux::fromIterable) + .flatMap(miljoe -> Flux.fromIterable(identer) + .map(ident -> new SletteAfpOffentligCommand(webClient, ident, miljoe, token.getTokenValue()).call())) + .flatMap(Flux::from)) + .collectList() + .subscribe(resultat -> log.info("Slettet AfpOffentlig (PEN), alle miljøer")); + } + @Override public String serviceUrl() { return serverProperties.getUrl(); diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/command/LagreAfpOffentligCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/command/LagreAfpOffentligCommand.java new file mode 100644 index 00000000000..8bcbe60a52b --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/command/LagreAfpOffentligCommand.java @@ -0,0 +1,93 @@ +package no.nav.dolly.bestilling.pensjonforvalter.command; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.dolly.bestilling.pensjonforvalter.domain.AfpOffentligRequest; +import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonforvalterResponse; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; +import org.springframework.http.HttpStatus; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.util.Collections; +import java.util.concurrent.Callable; + +import static no.nav.dolly.domain.CommonKeysAndUtils.CONSUMER; +import static no.nav.dolly.domain.CommonKeysAndUtils.HEADER_NAV_CALL_ID; +import static no.nav.dolly.domain.CommonKeysAndUtils.HEADER_NAV_CONSUMER_ID; +import static no.nav.dolly.util.CallIdUtil.generateCallId; +import static org.springframework.http.HttpHeaders.AUTHORIZATION; + +@Slf4j +@RequiredArgsConstructor +public class LagreAfpOffentligCommand implements Callable> { + private static final String PEN_AFP_OFFENTLIG_URL = "/{miljoe}/api/mock-oppsett/{ident}"; + + private final WebClient webClient; + private final AfpOffentligRequest afpOffentligRequest; + private final String miljoe; + private final String token; + + public Mono call() { + + var ident = afpOffentligRequest + .getMocksvar().stream() + .map(AfpOffentligRequest.AfpOffentligStub::getFnr) + .findFirst().orElse(null); + + var callId = generateCallId(); + log.info("Pensjon afp-offentlig {} {}, callId: {}", miljoe, afpOffentligRequest, callId); + + return webClient + .put() + .uri(uriBuilder -> uriBuilder + .path(PEN_AFP_OFFENTLIG_URL) + .build(miljoe, ident)) + .header(AUTHORIZATION, "Bearer " + token) + .header(HEADER_NAV_CALL_ID, callId) + .header(HEADER_NAV_CONSUMER_ID, CONSUMER) + .bodyValue(afpOffentligRequest) + .retrieve() + .toBodilessEntity() + .map(response -> pensjonforvalterResponse(miljoe, ident, HttpStatus.valueOf(response.getStatusCode().value()))) + .doOnError(WebClientFilter::logErrorMessage) + .onErrorResume(error -> Mono.just(pensjonforvalterResponseFromError(miljoe, ident, error))); + } + + private static PensjonforvalterResponse pensjonforvalterResponse(String miljoe, String ident, HttpStatus status) { + + var miljoeResponse = PensjonforvalterResponse.ResponseEnvironment.builder() + .miljo(miljoe) + .response(PensjonforvalterResponse.Response.builder() + .httpStatus(PensjonforvalterResponse.HttpStatus.builder() + .status(status.value()) + .reasonPhrase(status.getReasonPhrase()) + .build()) + .path(PEN_AFP_OFFENTLIG_URL.replace("{miljoe}", miljoe).replace("{ident}", ident)) + .build()) + .build(); + + return PensjonforvalterResponse.builder() + .status(Collections.singletonList(miljoeResponse)) + .build(); + } + + private static PensjonforvalterResponse pensjonforvalterResponseFromError(String miljoe, String ident, Throwable error) { + + var miljoeResponse = PensjonforvalterResponse.ResponseEnvironment.builder() + .miljo(miljoe) + .response(PensjonforvalterResponse.Response.builder() + .httpStatus(PensjonforvalterResponse.HttpStatus.builder() + .status(WebClientFilter.getStatus(error).value()) + .reasonPhrase(WebClientFilter.getStatus(error).getReasonPhrase()) + .build()) + .message(WebClientFilter.getMessage(error)) + .path(PEN_AFP_OFFENTLIG_URL.replace("{miljoe}", miljoe).replace("{ident}", ident)) + .build()) + .build(); + + return PensjonforvalterResponse.builder() + .status(Collections.singletonList(miljoeResponse)) + .build(); + } +} \ No newline at end of file diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/command/SletteAfpOffentligCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/command/SletteAfpOffentligCommand.java new file mode 100644 index 00000000000..af238eef7ee --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/command/SletteAfpOffentligCommand.java @@ -0,0 +1,90 @@ +package no.nav.dolly.bestilling.pensjonforvalter.command; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonforvalterResponse; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; +import no.nav.testnav.libs.securitycore.config.UserConstant; +import org.springframework.http.HttpStatus; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.util.Collections; +import java.util.concurrent.Callable; + +import static no.nav.dolly.domain.CommonKeysAndUtils.CONSUMER; +import static no.nav.dolly.domain.CommonKeysAndUtils.HEADER_NAV_CALL_ID; +import static no.nav.dolly.domain.CommonKeysAndUtils.HEADER_NAV_CONSUMER_ID; +import static no.nav.dolly.util.CallIdUtil.generateCallId; +import static no.nav.dolly.util.TokenXUtil.getUserJwt; +import static org.springframework.http.HttpHeaders.AUTHORIZATION; + +@Slf4j +@RequiredArgsConstructor +public class SletteAfpOffentligCommand implements Callable> { + + private static final String AFP_OFFENTLIG_URL = "/{miljoe}/api/mock-oppsett/{ident}"; + + private final WebClient webClient; + private final String ident; + private final String miljoe; + private final String token; + + + public Mono call() { + + var callId = generateCallId(); + log.info("Pensjon slette AFP-Offentlig callId: {}", callId); + + return webClient + .delete() + .uri(uriBuilder -> uriBuilder + .path(AFP_OFFENTLIG_URL) + .build(miljoe, ident)) + .header(AUTHORIZATION, "Bearer " + token) + .header(UserConstant.USER_HEADER_JWT, getUserJwt()) + .header(HEADER_NAV_CALL_ID, callId) + .header(HEADER_NAV_CONSUMER_ID, CONSUMER) + .retrieve() + .toBodilessEntity() + .map(response -> pensjonforvalterResponse(miljoe, ident, HttpStatus.valueOf(response.getStatusCode().value()))) + .doOnError(WebClientFilter::logErrorMessage) + .onErrorResume(error -> Mono.just(pensjonforvalterResponseFromError(miljoe, ident, error))); + } + + private static PensjonforvalterResponse pensjonforvalterResponse(String miljoe, String ident, HttpStatus status) { + + var miljoeResponse = PensjonforvalterResponse.ResponseEnvironment.builder() + .miljo(miljoe) + .response(PensjonforvalterResponse.Response.builder() + .httpStatus(PensjonforvalterResponse.HttpStatus.builder() + .status(status.value()) + .reasonPhrase(status.getReasonPhrase()) + .build()) + .path(AFP_OFFENTLIG_URL.replace("{miljoe}", miljoe).replace("{ident}", ident)) + .build()) + .build(); + + return PensjonforvalterResponse.builder() + .status(Collections.singletonList(miljoeResponse)) + .build(); + } + + private static PensjonforvalterResponse pensjonforvalterResponseFromError(String miljoe, String ident, Throwable error) { + + var miljoeResponse = PensjonforvalterResponse.ResponseEnvironment.builder() + .miljo(miljoe) + .response(PensjonforvalterResponse.Response.builder() + .httpStatus(PensjonforvalterResponse.HttpStatus.builder() + .status(WebClientFilter.getStatus(error).value()) + .reasonPhrase(WebClientFilter.getStatus(error).getReasonPhrase()) + .build()) + .message(WebClientFilter.getMessage(error)) + .path(AFP_OFFENTLIG_URL.replace("{miljoe}", miljoe).replace("{ident}", ident)) + .build()) + .build(); + + return PensjonforvalterResponse.builder() + .status(Collections.singletonList(miljoeResponse)) + .build(); + }} \ No newline at end of file diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/domain/AfpOffentligRequest.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/domain/AfpOffentligRequest.java new file mode 100644 index 00000000000..38d086942ba --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/domain/AfpOffentligRequest.java @@ -0,0 +1,68 @@ +package no.nav.dolly.bestilling.pensjonforvalter.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +import static java.util.Objects.isNull; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class AfpOffentligRequest { + + private List direktekall; + private List mocksvar; + + public List getDirektekall() { + + if (isNull(direktekall)) { + direktekall = new ArrayList<>(); + } + return direktekall; + } + + public List getMocksvar() { + + if (isNull(mocksvar)) { + mocksvar = new ArrayList<>(); + } + return mocksvar; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class AfpOffentligStub { + + private String tpId; + private String fnr; + private StatusAfp statusAfp; + private LocalDate virkningsDato; + private Integer sistBenyttetG; + private List belopsListe; + + public List getBelopsListe() { + + if (isNull(belopsListe)) { + belopsListe = new ArrayList<>(); + } + return belopsListe; + } + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class DatoBeloep { + + private LocalDate fomDato; + private Integer belop; + } + + public enum StatusAfp {UKJENT, INNVILGET, SOKT, AVSLAG, IKKE_SOKT} +} diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/mapper/PensjonAfpOffentligMappingStrategy.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/mapper/PensjonAfpOffentligMappingStrategy.java new file mode 100644 index 00000000000..e55f12e8f57 --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/mapper/PensjonAfpOffentligMappingStrategy.java @@ -0,0 +1,30 @@ +package no.nav.dolly.bestilling.pensjonforvalter.mapper; + +import ma.glasnost.orika.CustomMapper; +import ma.glasnost.orika.MapperFactory; +import ma.glasnost.orika.MappingContext; +import no.nav.dolly.bestilling.pensjonforvalter.domain.AfpOffentligRequest; +import no.nav.dolly.domain.resultset.pensjon.PensjonData; +import no.nav.dolly.mapper.MappingStrategy; +import org.springframework.stereotype.Component; + +@Component +public class PensjonAfpOffentligMappingStrategy implements MappingStrategy { + + @Override + public void register(MapperFactory factory) { + + factory.classMap(PensjonData.AfpOffentlig.class, AfpOffentligRequest.class) + .customize(new CustomMapper<>() { + @Override + public void mapAtoB(PensjonData.AfpOffentlig kilde, AfpOffentligRequest target, MappingContext context) { + + var ident = (String) context.getProperty("ident"); + target.getMocksvar() + .forEach(mocksvar -> mocksvar.setFnr(ident)); + } + }) + .byDefault() + .register(); + } +} diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/SystemTyper.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/SystemTyper.java index 5bb1cdb6edb..3eae32959e0 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/SystemTyper.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/SystemTyper.java @@ -30,6 +30,7 @@ public enum SystemTyper { PDL_ORDRE("Ordre til PDL"), PDL_PERSONSTATUS("Person finnes i PDL"), PEN_AP("Alderspensjon (AP)"), + PEN_AFP_OFFENTLIG("AFP offentlig (PEN)"), PEN_FORVALTER("Pensjon persondata (PEN)"), PEN_INNTEKT("Pensjonsopptjening (POPP)"), PEN_PENSJONSAVTALE("Pensjonsavtale (PEN)"), diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/pensjon/PensjonData.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/pensjon/PensjonData.java index 7fe6a82686f..d43f8a1b9bc 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/pensjon/PensjonData.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/pensjon/PensjonData.java @@ -3,6 +3,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -45,11 +47,15 @@ public class PensjonData { @Schema(description = "Data for uføretrygd (UT)") private Uforetrygd uforetrygd; + @Schema(description = "Data for AFP offentlig") + private AfpOffentlig afpOffentlig; + @JsonIgnore public boolean hasInntekt() { return nonNull(inntekt); } + @JsonIgnore public boolean hasGenerertInntekt() { return nonNull(generertInntekt); } @@ -75,6 +81,11 @@ public boolean hasPensjonsavtale() { return !getPensjonsavtale().isEmpty(); } + @JsonIgnore + public boolean hasAfpOffentlig() { + return nonNull(afpOffentlig); + } + public List getPensjonsavtale() { if (isNull(pensjonsavtale)) { @@ -376,4 +387,72 @@ public static class ForventetInntekt { private InntektType inntektType; private Integer belop; } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class AfpOffentlig { + + @Schema(description = "Liste av tpId som støttes direkte for denne personen, " + + "mulige verdier hentes her: /api/mock-oppsett/muligedirektekall") + private List direktekall; + + @Schema(description = "AFP offentlig som denne personen har (stub)") + private List mocksvar; + + public List getDirektekall() { + + if (isNull(direktekall)) { + direktekall = new ArrayList<>(); + } + return direktekall; + } + + public List getMocksvar() { + + if (isNull(mocksvar)) { + mocksvar = new ArrayList<>(); + } + return mocksvar; + } + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class AfpOffentligStub { + + @Schema(description = "TpId som skal stubbes, liste kan hentes her /api/v1/tp/ordning") + private String tpId; + + private StatusAfp statusAfp; + @Field(type = FieldType.Date, format = DateFormat.basic_date, pattern = "uuuu-MM-dd") + private LocalDate virkningsDato; + @Min(2024) + @Schema(description = "Årstall (fra dropdown?), laveste verdi er 2024") + private Integer sistBenyttetG; + private List belopsListe; + + public List getBelopsListe() { + + if (isNull(belopsListe)) { + belopsListe = new ArrayList<>(); + } + return belopsListe; + } + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class DatoBeloep { + + @Field(type = FieldType.Date, format = DateFormat.basic_date, pattern = "uuuu-MM-dd") + private LocalDate fomDato; + @Min(1) + @Max(2147483647) + private Integer belop; + } + + public enum StatusAfp {UKJENT, INNVILGET, SOKT, AVSLAG, IKKE_SOKT} } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingPensjonforvalterStatusMapper.java b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingPensjonforvalterStatusMapper.java index 54aaf40538b..c04d76911f4 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingPensjonforvalterStatusMapper.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingPensjonforvalterStatusMapper.java @@ -15,6 +15,7 @@ import java.util.Set; import static java.util.Objects.nonNull; +import static no.nav.dolly.domain.resultset.SystemTyper.PEN_AFP_OFFENTLIG; import static no.nav.dolly.domain.resultset.SystemTyper.PEN_AP; import static no.nav.dolly.domain.resultset.SystemTyper.PEN_FORVALTER; import static no.nav.dolly.domain.resultset.SystemTyper.PEN_INNTEKT; @@ -35,6 +36,7 @@ public final class BestillingPensjonforvalterStatusMapper { private static final String UFORETRYGD = "Ufoer"; private static final String SAMBOER = "Samboer"; private static final String PENSJONSAVTALE = "Pensjonsavtale"; + private static final String PEN_AFPOFFENTLIG = "AfpOffentlig"; public static List buildPensjonforvalterStatusMap(List progressList) { @@ -68,6 +70,7 @@ public static List buildPensjonforvalterStatusMap(List> getPerson(String ident) { }); } - private boolean isNotPresent(PdlAktoer pdlAktoer) { + public Mono> getAktoer(String ident) { + + log.info("Henter ident {} fra PDL", ident); + return tokenExchange + .exchange(serverProperties) + .flatMap(token -> Mono.zip(new GetPdlAktoerCommand(webClient, PDL_URL, ident, token.getTokenValue()).call(), + new GetPdlAktoerCommand(webClient, PDL_Q1_URL, ident, token.getTokenValue()).call()) + .map(tuple -> { + if (isNotPresent(tuple.getT1()) || isNotPresent(tuple.getT2())) { + return Optional.empty(); + } + return Optional.of(tuple.getT1().getData().getHentIdenter().getIdenter().getFirst()); + })); + } + + public Mono isPerson(String ident, Set opplysningId) { + + return tokenExchange + .exchange(serverProperties) + .flatMap(token -> Mono.zip(new GetPdlAktoerCommand(webClient, PDL_Q1_URL, ident, token.getTokenValue()).call(), + new GetPdlAktoerCommand(webClient, PDL_URL, ident, token.getTokenValue()).call()) + .map(tuple -> isPresent(ident, tuple, opplysningId))); + } + + private static boolean isNotPresent(PdlAktoer pdlAktoer) { return pdlAktoer.getErrors().stream().anyMatch(value -> value.getMessage().equals("Fant ikke person")); } - private boolean isGruppe(PdlAktoer.AktoerIdent ident, String gruppe) { + private static boolean isGruppe(PdlAktoer.AktoerIdent ident, String gruppe) { return isNotBlank(ident.getIdent()) && !ident.getHistorisk() && gruppe.equals(ident.getGruppe()); } - private boolean isPresent(String ident, Tuple2 pdlAktoer, Set opplysningId) { + private static boolean isPresent(String ident, Tuple2 pdlAktoer, Set opplysningId) { var statusQ1 = isPresent(ident, pdlAktoer.getT1(), "q1", opplysningId); var statusQ2 = isPresent(ident, pdlAktoer.getT2(), "q2", opplysningId); @@ -99,67 +127,52 @@ private boolean isPresent(String ident, Tuple2 pdlAktoer, return statusQ1 && statusQ2; } - private boolean isPresent(String ident, PdlAktoer pdlAktoer, String miljoe, Set opplysningId) { + private static boolean isPresent(String ident, PdlAktoer pdlAktoer, String miljoe, Set opplysningId) { + + var opplysningIdsFraPdl = getOpplysningIds(pdlAktoer.getData().getHentPerson()); - var person = pdlAktoer.getData().getHentPerson(); log.info("Sjekker ident {} i miljø {}, med PDL opplysningId {}, sjekkes for mottatt opplysningId {}", ident, miljoe, - nonNull(person) ? - Stream.of(person.getNavn(), person.getFoedselsdato(), person.getKjoenn(), person.getFolkeregisterpersonstatus()) - .flatMap(Collection::stream) - .map(MetadataDTO::getMetadata) - .map(MetadataDTO.Metadata::getOpplysningsId) - .collect(Collectors.joining(", ")) : null, + String.join(",",opplysningIdsFraPdl), nonNull(opplysningId) ? String.join(", ", opplysningId) : null); - boolean resultat; + if (nonNull(opplysningId)) { - resultat = nonNull(person) && - Stream.of(person.getNavn(), person.getFoedselsdato(), person.getKjoenn(), person.getFolkeregisterpersonstatus()) - .flatMap(Collection::stream) - .map(MetadataDTO::getMetadata) - .map(MetadataDTO.Metadata::getOpplysningsId) - .anyMatch(opplysningId::contains); + return opplysningId.stream() + .anyMatch(opplysningIdsFraPdl::contains); } else { - List identer = nonNull(pdlAktoer) && nonNull(pdlAktoer.getData()) && nonNull(pdlAktoer.getData().getHentIdenter()) ? + List identer = nonNull(pdlAktoer.getData().getHentIdenter()) ? pdlAktoer.getData().getHentIdenter().getIdenter() : emptyList(); - resultat = nonNull(pdlAktoer) && + return pdlAktoer.getErrors().stream().noneMatch(value -> value.getMessage().equals("Fant ikke person")) && identer.stream() .filter(ident1 -> identer.stream().anyMatch(ident2 -> isGruppe(ident2, "AKTORID"))) .anyMatch(ident1 -> identer.stream().anyMatch(ident2 -> isGruppe(ident2, "FOLKEREGISTERIDENT")) || identer.stream().anyMatch(ident2 -> isGruppe(ident2, "NPID"))); } - - return resultat; - } - - public Mono> getAktoer(String ident) { - - log.info("Henter ident {} fra PDL", ident); - return tokenExchange - .exchange(serverProperties) - .flatMap(token -> Mono.zip(new GetPdlAktoerCommand(webClient, PDL_URL, ident, token.getTokenValue()).call(), - new GetPdlAktoerCommand(webClient, PDL_Q1_URL, ident, token.getTokenValue()).call()) - .map(tuple -> { - if (isNotPresent(tuple.getT1()) || isNotPresent(tuple.getT2())) { - return Optional.empty(); - } - return Optional.of(tuple.getT1().getData().getHentIdenter().getIdenter().get(0)); - })); } - public Mono isPerson(String ident, Set opplysningId) { - - return tokenExchange - .exchange(serverProperties) - .flatMap(token -> Mono.zip(new GetPdlAktoerCommand(webClient, PDL_Q1_URL, ident, token.getTokenValue()).call(), - new GetPdlAktoerCommand(webClient, PDL_URL, ident, token.getTokenValue()).call()) - .map(tuple -> isPresent(ident, tuple, opplysningId))); + private static Set getOpplysningIds(HentPerson hentPerson) { + + return nonNull(hentPerson) ? Arrays.stream(hentPerson.getClass().getMethods()) + .filter(method -> method.getName().contains("get")) + .filter(method -> method.getReturnType().equals(List.class)) + .map(method -> { + try { + return (List) method.invoke(hentPerson); + } catch (IllegalAccessException | InvocationTargetException e) { + log.error("Feilet å lese verdi fra getter {} ", e.getMessage(), e); + return new ArrayList(); + } + }) + .flatMap(Collection::stream) + .map(MetadataDTO::getMetadata) + .map(MetadataDTO.Metadata::getOpplysningsId) + .collect(Collectors.toSet()) : emptySet(); } } diff --git a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/v1/pdl/graphql/HentPerson.java b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/v1/pdl/graphql/HentPerson.java index 16cbcf4aad4..2c64a320cba 100644 --- a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/v1/pdl/graphql/HentPerson.java +++ b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/v1/pdl/graphql/HentPerson.java @@ -19,6 +19,28 @@ public class HentPerson { List bostedsadresse; List folkeregisteridentifikator; List folkeregisterpersonstatus; + List foedested; + List doedsfall; + List sivilstand; + List oppholdsadresse; + List kontaktadresse; + List innflyttingTilNorge; + List utflyttingFraNorge; + List vergemaalEllerFremtidsfullmakt; + List doedfoedtBarn; + List adressebeskyttelse; + List falskIdentitet; + List utenlandskIdentifikasjonsnummer; + List tilrettelagtKommunikasjon; + List sikkerhetstiltak; + List deltBosted; + List forelderBarnRelasjon; + List foreldreansvar; + List kontaktinformasjonForDoedsbo; + List navspersonidentifikator; + List statsborgerskap; + List opphold; + List fullmakt; public List getNavn() { @@ -54,7 +76,7 @@ public List getFolkeregisteridentifikator() { public List getBostedsadresse() { - if(isNull(bostedsadresse)) { + if (isNull(bostedsadresse)) { bostedsadresse = new ArrayList<>(); } return bostedsadresse; @@ -67,4 +89,180 @@ public List getFolkeregisterpersonstatus() { } return folkeregisterpersonstatus; } + + public List getFoedested() { + + if (isNull(foedested)) { + foedested = new ArrayList<>(); + } + return foedested; + } + + public List getDoedsfall() { + + if (isNull(doedsfall)) { + doedsfall = new ArrayList<>(); + } + return doedsfall; + } + + public List getVergemaalEllerFremtidsfullmakt() { + + if (isNull(vergemaalEllerFremtidsfullmakt)) { + vergemaalEllerFremtidsfullmakt = new ArrayList<>(); + } + return vergemaalEllerFremtidsfullmakt; + } + + public List getDoedfoedtBarn() { + + if (isNull(doedfoedtBarn)) { + doedfoedtBarn = new ArrayList<>(); + } + return doedfoedtBarn; + } + + public List getAdressebeskyttelse() { + + if (isNull(adressebeskyttelse)) { + adressebeskyttelse = new ArrayList<>(); + } + return adressebeskyttelse; + } + + public List getFalskIdentitet() { + + if (isNull(falskIdentitet)) { + falskIdentitet = new ArrayList<>(); + } + return falskIdentitet; + } + + public List getUtenlandskIdentifikasjonsnummer() { + + if (isNull(utenlandskIdentifikasjonsnummer)) { + utenlandskIdentifikasjonsnummer = new ArrayList<>(); + } + return utenlandskIdentifikasjonsnummer; + } + + public List getTilrettelagtKommunikasjon() { + + if (isNull(tilrettelagtKommunikasjon)) { + tilrettelagtKommunikasjon = new ArrayList<>(); + } + return tilrettelagtKommunikasjon; + } + + public List getSikkerhetstiltak() { + + if (isNull(sikkerhetstiltak)) { + sikkerhetstiltak = new ArrayList<>(); + } + return sikkerhetstiltak; + } + + public List getDeltBosted() { + + if (isNull(deltBosted)) { + deltBosted = new ArrayList<>(); + } + return deltBosted; + } + + public List getForelderBarnRelasjon() { + + if (isNull(forelderBarnRelasjon)) { + forelderBarnRelasjon = new ArrayList<>(); + } + return forelderBarnRelasjon; + } + + public List getForeldreansvar() { + + if (isNull(foreldreansvar)) { + foreldreansvar = new ArrayList<>(); + } + return foreldreansvar; + } + + public List getKontaktinformasjonForDoedsbo() { + + if (isNull(kontaktinformasjonForDoedsbo)) { + kontaktinformasjonForDoedsbo = new ArrayList<>(); + } + return kontaktinformasjonForDoedsbo; + } + + public List getNavspersonidentifikator() { + + if (isNull(navspersonidentifikator)) { + navspersonidentifikator = new ArrayList<>(); + } + return navspersonidentifikator; + } + + public List getSivilstand() { + + if (isNull(sivilstand)) { + sivilstand = new ArrayList<>(); + } + return sivilstand; + } + + public List getStatsborgerskap() { + + if (isNull(statsborgerskap)) { + statsborgerskap = new ArrayList<>(); + } + return statsborgerskap; + } + + public List getOppholdsadresse() { + + if (isNull(oppholdsadresse)) { + oppholdsadresse = new ArrayList<>(); + } + return oppholdsadresse; + } + + public List getKontaktadresse() { + + if (isNull(kontaktadresse)) { + kontaktadresse = new ArrayList<>(); + } + return kontaktadresse; + } + + public List getInnflyttingTilNorge() { + + if (isNull(innflyttingTilNorge)) { + innflyttingTilNorge = new ArrayList<>(); + } + return innflyttingTilNorge; + } + + public List getUtflyttingFraNorge() { + + if (isNull(utflyttingFraNorge)) { + utflyttingFraNorge = new ArrayList<>(); + } + return utflyttingFraNorge; + } + + public List getOpphold() { + + if (isNull(opphold)) { + opphold = new ArrayList<>(); + } + return opphold; + } + + public List getFullmakt() { + + if (isNull(fullmakt)) { + fullmakt = new ArrayList<>(); + } + return fullmakt; + } } diff --git a/apps/person-service/src/main/resources/pdl/pdl-api-schema.graphql b/apps/person-service/src/main/resources/pdl/pdl-api-schema.graphql index cc4a8c90344..db34cec7313 100644 --- a/apps/person-service/src/main/resources/pdl/pdl-api-schema.graphql +++ b/apps/person-service/src/main/resources/pdl/pdl-api-schema.graphql @@ -899,7 +899,7 @@ input SearchRule { " Begrenser treff til kun de hvor felt har input verdi" equals: String " Sjekker om feltet finnes / at det ikke har en null verdi." - exists: String + exists: Boolean """ Søk fra og med (se fromExcluding for bare fra men ikke med) @@ -921,7 +921,7 @@ input SearchRule { " Filtrerer bort treff hvor felt inneholder input verdi" notEquals: String " Søk som gir tilfeldig poengsum til hvert treff (kun ment til generering av testdata)" - random: String + random: Float " Regex søk for spesielle situasjoner (Dette er en treg opprasjon og bør ikke brukes)" regex: String " Gir treff når opgitt feltstarter med opgitt verdi." diff --git a/apps/person-service/src/main/resources/pdl/pdlPersonQuery.graphql b/apps/person-service/src/main/resources/pdl/pdlPersonQuery.graphql index 4b4068538ff..ec6ab1fd0b7 100644 --- a/apps/person-service/src/main/resources/pdl/pdlPersonQuery.graphql +++ b/apps/person-service/src/main/resources/pdl/pdlPersonQuery.graphql @@ -11,16 +11,141 @@ query($ident1: ID!) { opplysningsId } } + foedested { + metadata { + opplysningsId + } + } kjoenn { metadata { opplysningsId } } + bostedsadresse { + metadata { + opplysningsId + } + } + oppholdsadresse { + metadata { + opplysningsId + } + } + kontaktadresse { + metadata { + opplysningsId + } + } + innflyttingTilNorge { + metadata { + opplysningsId + } + } + utflyttingFraNorge { + metadata { + opplysningsId + } + } + doedsfall { + metadata { + opplysningsId + } + } + vergemaalEllerFremtidsfullmakt { + metadata { + opplysningsId + } + } + doedfoedtBarn { + metadata { + opplysningsId + } + } + adressebeskyttelse { + metadata { + opplysningsId + } + } + falskIdentitet { + metadata { + opplysningsId + } + } + utenlandskIdentifikasjonsnummer { + metadata { + opplysningsId + } + } + tilrettelagtKommunikasjon { + metadata { + opplysningsId + } + } + sikkerhetstiltak { + metadata { + opplysningsId + } + } folkeregisterpersonstatus { metadata { opplysningsId } } + deltBosted { + metadata { + opplysningsId + } + } + forelderBarnRelasjon { + metadata { + opplysningsId + } + } + foreldreansvar { + metadata { + opplysningsId + } + } + kontaktinformasjonForDoedsbo { + metadata { + opplysningsId + } + } + navspersonidentifikator { + metadata { + opplysningsId + } + } + folkeregisteridentifikator { + metadata { + opplysningsId + } + } + sivilstand { + metadata { + opplysningsId + } + } + statsborgerskap { + metadata { + opplysningsId + } + } + telefonnummer { + metadata { + opplysningsId + } + } + opphold { + metadata { + opplysningsId + } + } + fullmakt { + metadata { + opplysningsId + } + } }, hentIdenter(ident: $ident1, historikk: true, grupper: [AKTORID, FOLKEREGISTERIDENT, NPID]) { identer { diff --git a/navikt/dolly-assets/package-lock.json b/navikt/dolly-assets/package-lock.json index e7e071760df..cf4e3d002aa 100644 --- a/navikt/dolly-assets/package-lock.json +++ b/navikt/dolly-assets/package-lock.json @@ -1782,7 +1782,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -1851,11 +1850,10 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true, - "license": "ISC" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true }, "node_modules/picomatch": { "version": "2.3.1", @@ -1871,9 +1869,9 @@ } }, "node_modules/postcss": { - "version": "8.4.41", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", - "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "dev": true, "funding": [ { @@ -1889,11 +1887,10 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -1993,11 +1990,10 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -2092,15 +2088,14 @@ } }, "node_modules/vite": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", - "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.6.tgz", + "integrity": "sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==", "dev": true, - "license": "MIT", "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.39", - "rollup": "^4.13.0" + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" @@ -2119,6 +2114,7 @@ "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -2136,6 +2132,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, diff --git a/proxies/pensjon-testdata-facade-proxy/config.yml b/proxies/pensjon-testdata-facade-proxy/config.yml index d4b82f58e4c..c57e676b1dd 100644 --- a/proxies/pensjon-testdata-facade-proxy/config.yml +++ b/proxies/pensjon-testdata-facade-proxy/config.yml @@ -56,8 +56,11 @@ spec: - application: pensjon-samboerforhold-backend-q2 namespace: pensjon-person cluster: dev-gcp - - application: popp-testdata - namespace: pensjonopptjening + - application: pensjon-afp-offentlig-mock-q1 + namespace: pensjon-saksbehandling + cluster: dev-gcp + - application: pensjon-afp-offentlig-mock-q2 + namespace: pensjon-saksbehandling cluster: dev-gcp liveness: path: /internal/isAlive diff --git a/proxies/pensjon-testdata-facade-proxy/src/main/java/no/nav/testnav/proxies/pensjontestdatafacadeproxy/PensjonTestdataFacadeProxyApplicationStarter.java b/proxies/pensjon-testdata-facade-proxy/src/main/java/no/nav/testnav/proxies/pensjontestdatafacadeproxy/PensjonTestdataFacadeProxyApplicationStarter.java index 729787956e5..49072216df3 100644 --- a/proxies/pensjon-testdata-facade-proxy/src/main/java/no/nav/testnav/proxies/pensjontestdatafacadeproxy/PensjonTestdataFacadeProxyApplicationStarter.java +++ b/proxies/pensjon-testdata-facade-proxy/src/main/java/no/nav/testnav/proxies/pensjontestdatafacadeproxy/PensjonTestdataFacadeProxyApplicationStarter.java @@ -39,13 +39,23 @@ public RouteLocator customRouteLocator(RouteLocatorBuilder builder, Arrays .stream(MILJOER) .forEach( - miljoe -> - routes.route( - spec -> spec - .path("/" + miljoe + "/api/samboer/**") - .filters(filterSPec -> filterSPec.filter(getAuthenticationFilter(tokenService, consumers.getSamboerTestdata(), miljoe)) - .rewritePath("/" + miljoe + "/(?.*)", "/${segment}")) - .uri(forEnvironment(consumers.getSamboerTestdata(), miljoe).getUrl()))); + miljoe -> { + routes.route( + spec -> spec + .path("/" + miljoe + "/api/samboer/**") + .filters(filterSPec -> filterSPec.filter(getAuthenticationFilter(tokenService, + consumers.getSamboerTestdata().getMiljoe(miljoe))) + .rewritePath("/" + miljoe + "/(?.*)", "/${segment}")) + .uri(consumers.getSamboerTestdata().getMiljoe(miljoe).getUrl())); + + routes.route( + spec -> spec + .path("/" + miljoe + "/api/mock-oppsett/**") + .filters(filterSpec -> filterSpec.filter(getAuthenticationFilter(tokenService, + consumers.getAfpOffentlig().getMiljoe(miljoe))) + .rewritePath("/" + miljoe + "/(?.*)", "/${segment}")) + .uri(consumers.getAfpOffentlig().getMiljoe(miljoe).getUrl())); + }); routes .route( spec -> spec @@ -53,33 +63,22 @@ public RouteLocator customRouteLocator(RouteLocatorBuilder builder, .filters(gatewayFilterSpec -> gatewayFilterSpec .addRequestHeader(HttpHeaders.AUTHORIZATION, "dolly") ) //Auth header er required men sjekkes ikke utover det - .uri("http://pensjon-testdata-facade.pensjontestdata.svc.nais.local/")) + .uri(consumers.getPensjonTestdataFacade().getUrl())) .build(); return routes.build(); } private GatewayFilter getAuthenticationFilter(TrygdeetatenAzureAdTokenService tokenService, - ServerProperties serverProperties, - String miljoe) { + ServerProperties serverProperties) { return AddAuthenticationRequestGatewayFilterFactory .bearerAuthenticationHeaderFilter( () -> tokenService - .exchange(forEnvironment(serverProperties, miljoe)) + .exchange(serverProperties) .map(AccessToken::getTokenValue)); } - private static ServerProperties forEnvironment(ServerProperties original, String env) { - return ServerProperties.of( - original.getCluster(), - original.getNamespace(), - original.getName().replace("MILJOE", env), - original.getUrl().replace("MILJOE", env + ("q1".equals(env) ? ".very" : "")) - ); - } - public static void main(String[] args) { SpringApplication.run(PensjonTestdataFacadeProxyApplicationStarter.class, args); } - } \ No newline at end of file diff --git a/proxies/pensjon-testdata-facade-proxy/src/main/java/no/nav/testnav/proxies/pensjontestdatafacadeproxy/config/Consumers.java b/proxies/pensjon-testdata-facade-proxy/src/main/java/no/nav/testnav/proxies/pensjontestdatafacadeproxy/config/Consumers.java index 814a4d8b2c6..d0829370416 100644 --- a/proxies/pensjon-testdata-facade-proxy/src/main/java/no/nav/testnav/proxies/pensjontestdatafacadeproxy/config/Consumers.java +++ b/proxies/pensjon-testdata-facade-proxy/src/main/java/no/nav/testnav/proxies/pensjontestdatafacadeproxy/config/Consumers.java @@ -24,6 +24,33 @@ @Setter(PACKAGE) public class Consumers { - private ServerProperties samboerTestdata; + private SamboerServerProperties samboerTestdata; + private AfpOffentligServerProperties afpOffentlig; + private ServerProperties pensjonTestdataFacade; + public static class SamboerServerProperties extends ServerProperties { + + public ServerProperties getMiljoe(String env) { + + return ServerProperties.of( + this.getCluster(), + this.getNamespace(), + this.getName().replace("{miljoe}", env), + this.getUrl().replace("{miljoe}", env + ("q1".equals(env) ? ".very" : "")) + ); + } + } + + public static class AfpOffentligServerProperties extends ServerProperties { + + public ServerProperties getMiljoe(String env) { + + return ServerProperties.of( + this.getCluster(), + this.getNamespace(), + this.getName().replace("{miljoe}", env), + this.getUrl().replace("{miljoe}", env) + ); + } + } } diff --git a/proxies/pensjon-testdata-facade-proxy/src/main/java/no/nav/testnav/proxies/pensjontestdatafacadeproxy/config/LocalVaultConfig.java b/proxies/pensjon-testdata-facade-proxy/src/main/java/no/nav/testnav/proxies/pensjontestdatafacadeproxy/config/LocalVaultConfig.java index a516197c0f1..92ba1cb5d79 100644 --- a/proxies/pensjon-testdata-facade-proxy/src/main/java/no/nav/testnav/proxies/pensjontestdatafacadeproxy/config/LocalVaultConfig.java +++ b/proxies/pensjon-testdata-facade-proxy/src/main/java/no/nav/testnav/proxies/pensjontestdatafacadeproxy/config/LocalVaultConfig.java @@ -2,35 +2,25 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; -import org.springframework.vault.annotation.VaultPropertySource; +import org.springframework.lang.NonNull; import org.springframework.vault.authentication.ClientAuthentication; import org.springframework.vault.authentication.TokenAuthentication; import org.springframework.vault.client.VaultEndpoint; import org.springframework.vault.config.AbstractVaultConfiguration; -import static io.micrometer.common.util.StringUtils.isBlank; - @Configuration @Profile("dev") -@VaultPropertySource(value = "azuread/prod/creds/team-dolly-lokal-app", ignoreSecretNotFound = false) public class LocalVaultConfig extends AbstractVaultConfiguration { - private static final String VAULT_TOKEN = "spring.cloud.vault.token"; - @Override + @NonNull public VaultEndpoint vaultEndpoint() { return VaultEndpoint.create("vault.adeo.no", 443); } @Override + @NonNull public ClientAuthentication clientAuthentication() { - if (System.getenv().containsKey("VAULT_TOKEN")) { - System.setProperty(VAULT_TOKEN, System.getenv("VAULT_TOKEN")); - } - var token = System.getProperty(VAULT_TOKEN); - if (isBlank(token)) { - throw new IllegalArgumentException("Påkrevet property 'spring.cloud.vault.token' er ikke satt."); - } - return new TokenAuthentication(System.getProperty(VAULT_TOKEN)); + return new TokenAuthentication(System.getProperty("spring.cloud.vault.token")); } } diff --git a/proxies/pensjon-testdata-facade-proxy/src/main/resources/application-dev.yml b/proxies/pensjon-testdata-facade-proxy/src/main/resources/application-dev.yml new file mode 100644 index 00000000000..70af6cc16b1 --- /dev/null +++ b/proxies/pensjon-testdata-facade-proxy/src/main/resources/application-dev.yml @@ -0,0 +1,4 @@ + +consumers: + pensjon-testdata-facade: + url: https://pensjon-testdata-facade.dev.intern.nav.no diff --git a/proxies/pensjon-testdata-facade-proxy/src/main/resources/application-prod.yml b/proxies/pensjon-testdata-facade-proxy/src/main/resources/application-prod.yml new file mode 100644 index 00000000000..0311ce578e3 --- /dev/null +++ b/proxies/pensjon-testdata-facade-proxy/src/main/resources/application-prod.yml @@ -0,0 +1,8 @@ +spring: + security: + oauth2: + resourceserver: + tokenx: + issuer-uri: ${TOKEN_X_ISSUER} + jwk-set-uri: ${TOKEN_X_JWKS_URI} + accepted-audience: ${TOKEN_X_CLIENT_ID} \ No newline at end of file diff --git a/proxies/pensjon-testdata-facade-proxy/src/main/resources/application.yml b/proxies/pensjon-testdata-facade-proxy/src/main/resources/application.yml index 80815dce95e..6c15990c604 100644 --- a/proxies/pensjon-testdata-facade-proxy/src/main/resources/application.yml +++ b/proxies/pensjon-testdata-facade-proxy/src/main/resources/application.yml @@ -11,17 +11,25 @@ spring: issuer-uri: ${AAD_ISSUER_URI}/v2.0 jwk-set-uri: ${AAD_ISSUER_URI}/discovery/v2.0/keys accepted-audience: ${azure.app.client.id}, api://${azure.app.client.id} - tokenx: - issuer-uri: ${TOKEN_X_ISSUER} - jwk-set-uri: ${TOKEN_X_JWKS_URI} - accepted-audience: ${TOKEN_X_CLIENT_ID} cloud: gateway: httpclient: - response-timeout: 1200s + response-timeout: 30s + wiretap: true + httpserver: + wiretap: true vault: enabled: false +logging: + level: + reactor: + netty: INFO + org: + springframework: + cloud: + gateway: TRACE + server: servlet: encoding: @@ -30,8 +38,15 @@ server: include-message: always consumers: + pensjon-testdata-facade: + url: http://pensjon-testdata-facade.pensjontestdata.svc.nais.local samboer-testdata: - name: pensjon-samboerforhold-backend-MILJOE + name: pensjon-samboerforhold-backend-{miljoe} namespace: pensjon-person - url: https://pensjon-samboerforhold-backend-MILJOE.intern.dev.nav.no + url: https://pensjon-samboerforhold-backend-{miljoe}.intern.dev.nav.no + cluster: dev-gcp + afp-offentlig: + name: pensjon-afp-offentlig-mock-{miljoe} + namespace: pensjon-saksbehandling + url: https://pensjon-afp-offentlig-mock-{miljoe}.intern.dev.nav.no cluster: dev-gcp \ No newline at end of file diff --git a/proxies/pensjon-testdata-facade-proxy/src/test/resources/application-test.yml b/proxies/pensjon-testdata-facade-proxy/src/test/resources/application-test.yml index 30e48d6e0e9..9b722c3bc51 100644 --- a/proxies/pensjon-testdata-facade-proxy/src/test/resources/application-test.yml +++ b/proxies/pensjon-testdata-facade-proxy/src/test/resources/application-test.yml @@ -1,7 +1,10 @@ -TOKEN_X_ISSUER: dummy consumers: samboer-testdata: name: pensjon-dummy namespace: dummy url: https://pensjon-dummy.dummy.no + afp-offentlig: + name: pensjon-dummy + namespace: dummy + url: https://pensjon-dummy.dummy.no