From 7f7b2de69dfc9af5180f5981a0243c3bdb466d46 Mon Sep 17 00:00:00 2001 From: stigus Date: Wed, 23 Oct 2024 15:17:24 +0200 Subject: [PATCH 01/59] =?UTF-8?q?*=20Endrer=20litt=20p=C3=A5=20Histark=20P?= =?UTF-8?q?ost=20oppsett=20#deploy-test-dolly-backend?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../no/nav/dolly/bestilling/histark/domain/HistarkResponse.java | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/domain/HistarkResponse.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/domain/HistarkResponse.java index c69f5f6f22f..76a3324e4c5 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/domain/HistarkResponse.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/domain/HistarkResponse.java @@ -12,5 +12,6 @@ public class HistarkResponse { private String histarkId; + private String saksmappeId; private String feilmelding; } From eafaec6f451bc8b97af486d1451945b9c6ffbd9e Mon Sep 17 00:00:00 2001 From: stigus Date: Wed, 23 Oct 2024 15:17:29 +0200 Subject: [PATCH 02/59] =?UTF-8?q?*=20Endrer=20litt=20p=C3=A5=20Histark=20P?= =?UTF-8?q?ost=20oppsett=20#deploy-test-dolly-backend?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dolly/bestilling/histark/command/HistarkPostCommand.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java index ad20fb87941..44a9ffa05f9 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java @@ -1,5 +1,6 @@ package no.nav.dolly.bestilling.histark.command; +import com.fasterxml.jackson.databind.JsonNode; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.dolly.bestilling.histark.domain.HistarkRequest; @@ -44,10 +45,10 @@ public Flux call() { .header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE) .body(BodyInserters.fromMultipartData(bodyBuilder.build())) .retrieve() - .bodyToMono(String.class) + .bodyToMono(JsonNode.class) .doOnSuccess(response -> log.info("Response mottatt fra Histark service: {}", response)) .map(response -> HistarkResponse.builder() - .histarkId(response.replaceAll("[^\\d-]|-(?=\\D)", "")) + .histarkId(response.get("saksmappeId").asText().replaceAll("[^\\d-]|-(?=\\D)", "")) .build()) .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) .filter(WebClientFilter::is5xxException)) From 43712fc6867d853d4d8a041b514d80bcaf8c127f Mon Sep 17 00:00:00 2001 From: stigus Date: Wed, 23 Oct 2024 16:47:52 +0200 Subject: [PATCH 03/59] =?UTF-8?q?*=20Endrer=20litt=20p=C3=A5=20Histark=20P?= =?UTF-8?q?ost=20oppsett=20#deploy-test-dolly-backend?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/no/nav/dolly/bestilling/histark/HistarkClient.java | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/HistarkClient.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/HistarkClient.java index 3a3d585250d..2db66e5830b 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/HistarkClient.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/HistarkClient.java @@ -56,7 +56,6 @@ public Flux gjenopprett(RsDollyUtvidetBestilling bestilling, Dolly histarkConsumer.postHistark(request) .mapNotNull(status -> getStatus(dollyPerson.getIdent(), bestilling.getId(), status)) : - Mono.just("OK") ) .map(status -> futurePersist(progress, status)); From a0d73e434d7f7dfd5b95242ca5fda556dc0dba6c Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 24 Oct 2024 09:05:47 +0200 Subject: [PATCH 04/59] * Mindre endringer for Histark Post oppsett #deploy-test-dolly-backend --- .../java/no/nav/dolly/bestilling/fullmakt/FullmaktClient.java | 2 -- .../java/no/nav/dolly/bestilling/histark/HistarkConsumer.java | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/FullmaktClient.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/FullmaktClient.java index 5b48dade5c8..87c8bd8d144 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/FullmaktClient.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/fullmakt/FullmaktClient.java @@ -28,8 +28,6 @@ @RequiredArgsConstructor public class FullmaktClient implements ClientRegister { - private static final String FULLMAKT_REPRESENTASJON = "FULLMAKT_REPR#"; - private final ErrorStatusDecoder errorStatusDecoder; private final TransactionHelperService transactionHelperService; private final FullmaktConsumer fullmaktConsumer; diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/HistarkConsumer.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/HistarkConsumer.java index 4620666f522..5c683664571 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/HistarkConsumer.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/HistarkConsumer.java @@ -40,7 +40,7 @@ public HistarkConsumer( .build(); } - @Timed(name = "providers", tags = { "operation", "dokarkiv-opprett" }) + @Timed(name = "providers", tags = { "operation", "histark-opprett" }) public Flux postHistark(HistarkRequest histarkRequest) { var callId = getNavCallId(); From 6ece1be9b4813386210819a61bcf754354069db9 Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 24 Oct 2024 11:18:03 +0200 Subject: [PATCH 05/59] * Mindre endringer for Histark Post oppsett #deploy-test-dolly-backend --- .../nav/dolly/bestilling/histark/domain/HistarkRequest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/domain/HistarkRequest.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/domain/HistarkRequest.java index f3c17399b18..59d5311ce0d 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/domain/HistarkRequest.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/domain/HistarkRequest.java @@ -41,6 +41,10 @@ public static class HistarkDokument { @Schema(description = "Metadata tilhørende filen som sendes") private HistarkMetadata metadata; + @Override + public String toString() { + return "HistarkDokument{file='%s...', metadata=%s}".formatted(file.substring(0, 10), metadata); + } @Data @Builder From 32baeac4df9280393cd296259acebe8e2b329d26 Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 24 Oct 2024 11:21:58 +0200 Subject: [PATCH 06/59] =?UTF-8?q?*=20Laget=20egen=20komponent=20for=20?= =?UTF-8?q?=C3=A5=20vise=20feilmeldinger=20fra=20form=20p=C3=A5=20komponen?= =?UTF-8?q?ter=20som=20ikke=20har=20noe=20dedikert=20input=20field=20*=20F?= =?UTF-8?q?ikset=20Histark=20visning=20av=20feil=20i=20form=20og=20lagt=20?= =?UTF-8?q?p=C3=A5=20initialValue=20for=20den=20*=20Benytter=20ny=20feilme?= =?UTF-8?q?lding=20komponent=20istedenfor=20=C3=A5=20gjenbruke=20kode=20ov?= =?UTF-8?q?eralt=20hvor=20det=20trengtes=20#deploy-test-frontend?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../arbeidsplassen/form/initialValues.tsx | 2 +- .../fagsystem/fullmakt/form/FullmaktForm.tsx | 14 ++------ .../fagsystem/histark/form/HistarkForm.tsx | 2 ++ .../pensjon/form/GenerertInntektForm.tsx | 12 ++----- .../components/ui/toast/DisplayFormError.tsx | 32 +++++++++++++++++++ 5 files changed, 40 insertions(+), 22 deletions(-) create mode 100644 apps/dolly-frontend/src/main/js/src/components/ui/toast/DisplayFormError.tsx diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/arbeidsplassen/form/initialValues.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/arbeidsplassen/form/initialValues.tsx index 7ee4eb703e4..72dbfc364cd 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/arbeidsplassen/form/initialValues.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/arbeidsplassen/form/initialValues.tsx @@ -218,7 +218,7 @@ export const initialHistark = { tittel: '', antallSider: -1, skanner: '', - skannested: '', + skannested: 'FREDRIKSTAD', skanningsTidspunkt: new Date(), temakoder: [], enhetsnavn: '', diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/form/FullmaktForm.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/form/FullmaktForm.tsx index c707975c021..2ec95eafd97 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/form/FullmaktForm.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/form/FullmaktForm.tsx @@ -16,12 +16,12 @@ import { useFullmaktOmraader } from '@/utils/hooks/useFullmakt' import { Omraade } from '@/components/fagsystem/fullmakt/FullmaktType' import { Option } from '@/service/SelectOptionsOppslag' import Loading from '@/components/ui/loading/Loading' -import { ErrorMessage } from '@hookform/error-message' import { validation } from '@/components/fagsystem/fullmakt/form/validation' +import { DisplayFormError } from '@/components/ui/toast/DisplayFormError' interface FullmaktProps { formMethods: UseFormReturn - path?: string + path: string opts?: any eksisterendeNyPerson?: any } @@ -174,15 +174,7 @@ export const Fullmakt = ({ toggleExpansion={!isTestnorgeIdent} eksisterendeNyPerson={eksisterendeNyPerson} /> - {formMethods.formState.errors && ( - ( -

{message}

- )} - /> - )} + ) } diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/histark/form/HistarkForm.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/histark/form/HistarkForm.tsx index e0a02a615be..2ee2621ee3b 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/histark/form/HistarkForm.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/histark/form/HistarkForm.tsx @@ -17,6 +17,7 @@ import { FormTextInput } from '@/components/ui/form/inputs/textInput/TextInput' import { Yearpicker } from '@/components/ui/form/inputs/yearpicker/Yearpicker' import { testDatoFom, testDatoTom } from '@/components/fagsystem/utils' import { useFormContext } from 'react-hook-form' +import { DisplayFormError } from '@/components/ui/toast/DisplayFormError' const DokumentInfoListe = React.lazy( () => import('@/components/fagsystem/dokarkiv/modal/DokumentInfoListe'), @@ -168,6 +169,7 @@ export const HistarkForm = () => { /> )} + )} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pensjon/form/GenerertInntektForm.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pensjon/form/GenerertInntektForm.tsx index de7eae9011a..13a96ec158e 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pensjon/form/GenerertInntektForm.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pensjon/form/GenerertInntektForm.tsx @@ -9,8 +9,8 @@ import { FormDollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldA import { pensjonGenererPath } from '@/components/fagsystem/pensjon/form/Form' import styled from 'styled-components' import NavButton from '@/components/ui/button/NavButton/NavButton' -import { ErrorMessage } from '@hookform/error-message' import { usePensjonFacadeGenerer } from '@/utils/hooks/usePensjon' +import { DisplayFormError } from '@/components/ui/toast/DisplayFormError' const getTittel = (data) => { const inntektsaar = data?.map((inntekt) => inntekt.ar) @@ -117,15 +117,7 @@ export const GenerertInntektForm = ({ gyldigFraOgMedAar, formMethods }) => { - {formMethods.formState.errors && ( - ( -

{message}

- )} - /> - )} + {formInntekter?.length > 0 && ( diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/toast/DisplayFormError.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/toast/DisplayFormError.tsx new file mode 100644 index 00000000000..f125208cd0f --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/components/ui/toast/DisplayFormError.tsx @@ -0,0 +1,32 @@ +import 'react-toastify/dist/ReactToastify.css' +import { ErrorMessage } from '@hookform/error-message' +import * as React from 'react' +import { useContext } from 'react' +import { useFormContext } from 'react-hook-form' +import { + ShowErrorContext, + ShowErrorContextType, +} from '@/components/bestillingsveileder/ShowErrorContext' + +type Props = { + path: string + errorMessage?: string +} + +export const DisplayFormError = ({ path, errorMessage }: Props) => { + const formMethods = useFormContext() + const errorContext: ShowErrorContextType = useContext(ShowErrorContext) + + return ( + errorContext.showError && + formMethods.formState.errors && ( + ( +

{errorMessage || message}

+ )} + /> + ) + ) +} From 29b937f12dc6fe68cba86c7076fa3a33017168c6 Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 24 Oct 2024 14:00:47 +0200 Subject: [PATCH 07/59] * Mindre endringer for Histark Post oppsett #deploy-test-dolly-backend --- .../dolly/bestilling/histark/command/HistarkPostCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java index 44a9ffa05f9..1f67d5d7547 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java @@ -46,7 +46,7 @@ public Flux call() { .body(BodyInserters.fromMultipartData(bodyBuilder.build())) .retrieve() .bodyToMono(JsonNode.class) - .doOnSuccess(response -> log.info("Response mottatt fra Histark service: {}", response)) + .doOnSuccess(response -> response.fieldNames().forEachRemaining(fieldname -> log.info("Fieldname from histark: {}", fieldname))) .map(response -> HistarkResponse.builder() .histarkId(response.get("saksmappeId").asText().replaceAll("[^\\d-]|-(?=\\D)", "")) .build()) From f6b196959db5c8d7790de5125cbc5caaa0e81354 Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 24 Oct 2024 14:36:26 +0200 Subject: [PATCH 08/59] * Mindre endringer for Histark Post oppsett #deploy-test-dolly-backend --- .../bestilling/histark/command/HistarkPostCommand.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java index 1f67d5d7547..618f6a3c9c1 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java @@ -1,6 +1,6 @@ package no.nav.dolly.bestilling.histark.command; -import com.fasterxml.jackson.databind.JsonNode; +import io.swagger.v3.core.util.Json; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.dolly.bestilling.histark.domain.HistarkRequest; @@ -45,10 +45,10 @@ public Flux call() { .header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE) .body(BodyInserters.fromMultipartData(bodyBuilder.build())) .retrieve() - .bodyToMono(JsonNode.class) - .doOnSuccess(response -> response.fieldNames().forEachRemaining(fieldname -> log.info("Fieldname from histark: {}", fieldname))) + .bodyToMono(Object.class) + .doOnSuccess(response -> log.info("Histark response: {}", response)) .map(response -> HistarkResponse.builder() - .histarkId(response.get("saksmappeId").asText().replaceAll("[^\\d-]|-(?=\\D)", "")) + .histarkId(Json.pretty(response)) .build()) .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) .filter(WebClientFilter::is5xxException)) From 6ea56a073041a7f14bfbcaf3a31518181a1e1cc9 Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 24 Oct 2024 15:20:33 +0200 Subject: [PATCH 09/59] * Mindre endringer for Histark Post oppsett #deploy-test-dolly-backend --- .../dolly/bestilling/histark/command/HistarkPostCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java index 618f6a3c9c1..c0aaef95a2a 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java @@ -46,7 +46,7 @@ public Flux call() { .body(BodyInserters.fromMultipartData(bodyBuilder.build())) .retrieve() .bodyToMono(Object.class) - .doOnSuccess(response -> log.info("Histark response: {}", response)) + .doOnEach(response -> log.info("Histark response: {}", response)) .map(response -> HistarkResponse.builder() .histarkId(Json.pretty(response)) .build()) From 684419a47b68f18f28cc64be2731ee7bd18e97a7 Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 24 Oct 2024 15:30:31 +0200 Subject: [PATCH 10/59] * Mindre endringer for Histark Post oppsett #deploy-test-dolly-backend --- .../dolly/bestilling/histark/command/HistarkPostCommand.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java index c0aaef95a2a..cd2403685f8 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java @@ -7,6 +7,7 @@ import no.nav.dolly.bestilling.histark.domain.HistarkResponse; import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatusCode; import org.springframework.http.MediaType; import org.springframework.http.client.MultipartBodyBuilder; import org.springframework.web.reactive.function.BodyInserters; @@ -45,6 +46,10 @@ public Flux call() { .header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE) .body(BodyInserters.fromMultipartData(bodyBuilder.build())) .retrieve() + .onStatus(HttpStatusCode::is2xxSuccessful, response -> { + log.info("Histark response OK: {}", response); + return Mono.empty(); + }) .bodyToMono(Object.class) .doOnEach(response -> log.info("Histark response: {}", response)) .map(response -> HistarkResponse.builder() From a08f277032b0bd5f389c1a8318786e30ab1723a4 Mon Sep 17 00:00:00 2001 From: stigus Date: Fri, 25 Oct 2024 09:52:27 +0200 Subject: [PATCH 11/59] * Mindre endringer for Histark Post oppsett #deploy-test-dolly-backend --- .../histark/command/HistarkPostCommand.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java index cd2403685f8..a2c6d224f0e 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java @@ -7,7 +7,6 @@ import no.nav.dolly.bestilling.histark.domain.HistarkResponse; import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatusCode; import org.springframework.http.MediaType; import org.springframework.http.client.MultipartBodyBuilder; import org.springframework.web.reactive.function.BodyInserters; @@ -46,15 +45,14 @@ public Flux call() { .header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE) .body(BodyInserters.fromMultipartData(bodyBuilder.build())) .retrieve() - .onStatus(HttpStatusCode::is2xxSuccessful, response -> { - log.info("Histark response OK: {}", response); - return Mono.empty(); - }) .bodyToMono(Object.class) - .doOnEach(response -> log.info("Histark response: {}", response)) - .map(response -> HistarkResponse.builder() - .histarkId(Json.pretty(response)) - .build()) + .doOnNext(response -> log.info("Histark response: {}", response)) + .map(response -> { + log.info("Histark response: {}", response); + return HistarkResponse.builder() + .histarkId(Json.pretty(response)) + .build(); + }) .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) .filter(WebClientFilter::is5xxException)) .doOnError(WebClientFilter::logErrorMessage) From cbd01e499fc77739a6859ce34f19dd4a7e498dfa Mon Sep 17 00:00:00 2001 From: stigus Date: Fri, 25 Oct 2024 09:59:58 +0200 Subject: [PATCH 12/59] * Mindre endringer for Histark Post oppsett #deploy-test-dolly-backend --- .../histark/command/HistarkPostCommand.java | 55 ++++++++++--------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java index a2c6d224f0e..7fedafd0309 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java @@ -33,32 +33,33 @@ public class HistarkPostCommand implements Callable> { @Override public Flux call() { - return Flux.fromIterable(histarkRequest.getHistarkDokumenter()).flatMap(histarkDokument -> { - var bodyBuilder = new MultipartBodyBuilder(); - bodyBuilder.part("file", histarkDokument.getFile().getBytes(StandardCharsets.UTF_8)); - bodyBuilder.part("metadata", histarkDokument.getMetadata().toString()); - return webClient.post() - .uri(builder -> - builder.path("/api/saksmapper/import").build()) - .header(AUTHORIZATION, "Bearer " + token) - .contentType(MediaType.MULTIPART_FORM_DATA) - .header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE) - .body(BodyInserters.fromMultipartData(bodyBuilder.build())) - .retrieve() - .bodyToMono(Object.class) - .doOnNext(response -> log.info("Histark response: {}", response)) - .map(response -> { - log.info("Histark response: {}", response); - return HistarkResponse.builder() - .histarkId(Json.pretty(response)) - .build(); - }) - .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) - .filter(WebClientFilter::is5xxException)) - .doOnError(WebClientFilter::logErrorMessage) - .onErrorResume(error -> Mono.just(HistarkResponse.builder() - .feilmelding(WebClientFilter.getMessage(error)) - .build())); - }); + return Flux.fromIterable(histarkRequest.getHistarkDokumenter()) + .flatMap(histarkDokument -> { + var bodyBuilder = new MultipartBodyBuilder(); + bodyBuilder.part("file", histarkDokument.getFile().getBytes(StandardCharsets.UTF_8)); + bodyBuilder.part("metadata", histarkDokument.getMetadata().toString()); + return webClient.post() + .uri(builder -> + builder.path("/api/saksmapper/import").build()) + .header(AUTHORIZATION, "Bearer " + token) + .contentType(MediaType.MULTIPART_FORM_DATA) + .header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE) + .body(BodyInserters.fromMultipartData(bodyBuilder.build())) + .retrieve() + .bodyToMono(String.class) + .doOnNext(response -> log.info("Histark response: {}", response)) + .map(response -> { + log.info("Histark response: {}", response); + return HistarkResponse.builder() + .histarkId(Json.pretty(response)) + .build(); + }) + .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) + .filter(WebClientFilter::is5xxException)) + .doOnError(WebClientFilter::logErrorMessage) + .onErrorResume(error -> Mono.just(HistarkResponse.builder() + .feilmelding(WebClientFilter.getMessage(error)) + .build())); + }); } } \ No newline at end of file From ea03f12a9cff443963377f2fe56ef60b778b43e3 Mon Sep 17 00:00:00 2001 From: stigus Date: Fri, 25 Oct 2024 10:17:14 +0200 Subject: [PATCH 13/59] * Mindre endringer for Histark Post oppsett #deploy-test-dolly-backend --- .../histark/command/HistarkPostCommand.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java index 7fedafd0309..fe39a017def 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java @@ -1,6 +1,5 @@ package no.nav.dolly.bestilling.histark.command; -import io.swagger.v3.core.util.Json; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.dolly.bestilling.histark.domain.HistarkRequest; @@ -47,13 +46,10 @@ public Flux call() { .body(BodyInserters.fromMultipartData(bodyBuilder.build())) .retrieve() .bodyToMono(String.class) - .doOnNext(response -> log.info("Histark response: {}", response)) - .map(response -> { - log.info("Histark response: {}", response); - return HistarkResponse.builder() - .histarkId(Json.pretty(response)) - .build(); - }) + .doOnNext(response -> log.info("Histark post response: {}", response)) + .map(response -> HistarkResponse.builder() + .histarkId(response) + .build()) .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) .filter(WebClientFilter::is5xxException)) .doOnError(WebClientFilter::logErrorMessage) From 6a805bbb21a3233b2df97d3eae34a5d75cfefce2 Mon Sep 17 00:00:00 2001 From: stigus Date: Fri, 25 Oct 2024 10:35:04 +0200 Subject: [PATCH 14/59] * Mindre endringer for Histark Post oppsett #deploy-test-dolly-backend --- .../bestilling/histark/HistarkConsumer.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/HistarkConsumer.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/HistarkConsumer.java index 5c683664571..82c1d488e1b 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/HistarkConsumer.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/HistarkConsumer.java @@ -10,6 +10,7 @@ import no.nav.testnav.libs.securitycore.domain.ServerProperties; import no.nav.testnav.libs.standalone.servletsecurity.exchange.TokenExchange; import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.ExchangeFilterFunction; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Flux; @@ -36,6 +37,7 @@ public HistarkConsumer( this.tokenService = tokenService; this.webClient = webClientBuilder .baseUrl(serverProperties.getUrl()) + .filters(exchangeFilterFunctions -> exchangeFilterFunctions.add(logRequest())) .exchangeStrategies(getJacksonStrategy(objectMapper)) .build(); } @@ -51,6 +53,28 @@ public Flux postHistark(HistarkRequest histarkRequest) { token.getTokenValue()).call()); } + private ExchangeFilterFunction logRequest() { + + return (clientRequest, next) -> { + var buffer = new StringBuilder(250) + .append("Request: ") + .append(clientRequest.method()) + .append(' ') + .append(clientRequest.url()) + .append(System.lineSeparator()); + + clientRequest.headers() + .forEach((name, values) -> values + .forEach(value -> buffer.append('\t') + .append(name) + .append('=') + .append(value.contains("Bearer ") ? "Bearer token" : value) + .append(System.lineSeparator()))); + log.trace(buffer.substring(0, buffer.length() - 1)); + return next.exchange(clientRequest); + }; + } + private static String getNavCallId() { return format("%s %s", CONSUMER, UUID.randomUUID()); } From e34e925e848059e2588fe3e1719027e78ecbdab5 Mon Sep 17 00:00:00 2001 From: stigus Date: Fri, 25 Oct 2024 10:50:57 +0200 Subject: [PATCH 15/59] * Mindre endringer for Histark Post oppsett #deploy-test-dolly-backend --- .../java/no/nav/dolly/bestilling/histark/HistarkConsumer.java | 3 ++- apps/dolly-backend/src/main/resources/logback-spring.xml | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/HistarkConsumer.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/HistarkConsumer.java index 82c1d488e1b..0965c7236d5 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/HistarkConsumer.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/HistarkConsumer.java @@ -17,6 +17,7 @@ import java.util.UUID; import static java.lang.String.format; +import static java.util.Objects.nonNull; import static no.nav.dolly.domain.CommonKeysAndUtils.CONSUMER; import static no.nav.dolly.util.JacksonExchangeStrategyUtil.getJacksonStrategy; @@ -68,7 +69,7 @@ private ExchangeFilterFunction logRequest() { .forEach(value -> buffer.append('\t') .append(name) .append('=') - .append(value.contains("Bearer ") ? "Bearer token" : value) + .append(nonNull(value) && value.contains("Bearer ") ? "Bearer token" : value) .append(System.lineSeparator()))); log.trace(buffer.substring(0, buffer.length() - 1)); return next.exchange(clientRequest); diff --git a/apps/dolly-backend/src/main/resources/logback-spring.xml b/apps/dolly-backend/src/main/resources/logback-spring.xml index 6c4bba7270e..47d2cf6f19d 100644 --- a/apps/dolly-backend/src/main/resources/logback-spring.xml +++ b/apps/dolly-backend/src/main/resources/logback-spring.xml @@ -38,6 +38,7 @@ + From 77deb1b6f1241c1f321ff862020f38f3c38c8b94 Mon Sep 17 00:00:00 2001 From: stigus Date: Fri, 25 Oct 2024 11:30:20 +0200 Subject: [PATCH 16/59] * Mindre endringer for Histark Post oppsett #deploy-test-dolly-backend --- .../dolly/bestilling/histark/command/HistarkPostCommand.java | 4 +++- .../nav/dolly/bestilling/histark/domain/HistarkRequest.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java index fe39a017def..8d98e097993 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java @@ -37,13 +37,15 @@ public Flux call() { var bodyBuilder = new MultipartBodyBuilder(); bodyBuilder.part("file", histarkDokument.getFile().getBytes(StandardCharsets.UTF_8)); bodyBuilder.part("metadata", histarkDokument.getMetadata().toString()); + var body = bodyBuilder.build(); + log.info("Sending histark body: {}", body); return webClient.post() .uri(builder -> builder.path("/api/saksmapper/import").build()) .header(AUTHORIZATION, "Bearer " + token) .contentType(MediaType.MULTIPART_FORM_DATA) .header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE) - .body(BodyInserters.fromMultipartData(bodyBuilder.build())) + .body(BodyInserters.fromMultipartData(body)) .retrieve() .bodyToMono(String.class) .doOnNext(response -> log.info("Histark post response: {}", response)) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/domain/HistarkRequest.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/domain/HistarkRequest.java index 59d5311ce0d..bbdb16cdb30 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/domain/HistarkRequest.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/domain/HistarkRequest.java @@ -43,7 +43,7 @@ public static class HistarkDokument { @Override public String toString() { - return "HistarkDokument{file='%s...', metadata=%s}".formatted(file.substring(0, 10), metadata); + return "HistarkDokument{file='%s...', metadata=%s}".formatted(file.substring(file.length() - 21, file.length() - 1), metadata); } @Data From c7a614b0f8afb800c1d9757634946b84ebbac300 Mon Sep 17 00:00:00 2001 From: stigus Date: Fri, 25 Oct 2024 15:14:24 +0200 Subject: [PATCH 17/59] =?UTF-8?q?*=20=C3=98ker=20buffer=20size=20for=20Bac?= =?UTF-8?q?kend=20og=20Histark=20Proxy=20#deploy-test-dolly-backend=20#dep?= =?UTF-8?q?loy-proxy-histark?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/dolly-backend/config.test.yml | 1 + apps/dolly-backend/config.yml | 1 + .../histark/command/HistarkPostCommand.java | 20 +++++++++---------- proxies/histark-proxy/config.yml | 1 + 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/apps/dolly-backend/config.test.yml b/apps/dolly-backend/config.test.yml index c99e52ac2e3..fc01562b2e1 100644 --- a/apps/dolly-backend/config.test.yml +++ b/apps/dolly-backend/config.test.yml @@ -7,6 +7,7 @@ metadata: team: dolly annotations: nginx.ingress.kubernetes.io/proxy-body-size: "512m" + nginx.ingress.kubernetes.io/proxy-buffer-size: "8m" nginx.ingress.kubernetes.io/proxy-send-timeout: "600" nginx.ingress.kubernetes.io/proxy-read-timeout: "600" diff --git a/apps/dolly-backend/config.yml b/apps/dolly-backend/config.yml index 441586da91f..0f656c7ab3c 100644 --- a/apps/dolly-backend/config.yml +++ b/apps/dolly-backend/config.yml @@ -9,6 +9,7 @@ metadata: nginx.ingress.kubernetes.io/proxy-read-timeout: "3600" nginx.ingress.kubernetes.io/proxy-send-timeout: "3600" nginx.ingress.kubernetes.io/proxy-body-size: "512m" + nginx.ingress.kubernetes.io/proxy-buffer-size: "8m" spec: tokenx: diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java index 8d98e097993..65d4374cddf 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java @@ -7,6 +7,7 @@ import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.http.client.MultipartBodyBuilder; import org.springframework.web.reactive.function.BodyInserters; import org.springframework.web.reactive.function.client.WebClient; @@ -36,9 +37,8 @@ public Flux call() { .flatMap(histarkDokument -> { var bodyBuilder = new MultipartBodyBuilder(); bodyBuilder.part("file", histarkDokument.getFile().getBytes(StandardCharsets.UTF_8)); - bodyBuilder.part("metadata", histarkDokument.getMetadata().toString()); + bodyBuilder.part("metadata", histarkDokument.getMetadata()); var body = bodyBuilder.build(); - log.info("Sending histark body: {}", body); return webClient.post() .uri(builder -> builder.path("/api/saksmapper/import").build()) @@ -46,18 +46,16 @@ public Flux call() { .contentType(MediaType.MULTIPART_FORM_DATA) .header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE) .body(BodyInserters.fromMultipartData(body)) - .retrieve() - .bodyToMono(String.class) - .doOnNext(response -> log.info("Histark post response: {}", response)) - .map(response -> HistarkResponse.builder() - .histarkId(response) - .build()) + .exchangeToMono(clientResponse -> { + log.info("Status fra histark: {}", clientResponse.statusCode()); + return clientResponse.toEntity(HistarkResponse.class); + }) + .mapNotNull(ResponseEntity::getBody) + .doOnNext(response -> log.info("Response fraa histark: {}", response)) .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) .filter(WebClientFilter::is5xxException)) .doOnError(WebClientFilter::logErrorMessage) - .onErrorResume(error -> Mono.just(HistarkResponse.builder() - .feilmelding(WebClientFilter.getMessage(error)) - .build())); + .onErrorResume(throwable -> Mono.empty()); }); } } \ No newline at end of file diff --git a/proxies/histark-proxy/config.yml b/proxies/histark-proxy/config.yml index 6acaba2496b..3b48fe7c890 100644 --- a/proxies/histark-proxy/config.yml +++ b/proxies/histark-proxy/config.yml @@ -7,6 +7,7 @@ metadata: team: dolly annotations: nginx.ingress.kubernetes.io/proxy-body-size: "512m" + nginx.ingress.kubernetes.io/proxy-buffer-size: "8m" nginx.ingress.kubernetes.io/proxy-read-timeout: "300" spec: image: "{{image}}" From 7853535126cbd1b0aa7b40b62154f8f1e2051b01 Mon Sep 17 00:00:00 2001 From: stigus Date: Mon, 28 Oct 2024 09:29:57 +0100 Subject: [PATCH 18/59] * Histark mer logging #deploy-test-dolly-backend #deploy-proxy-histark --- .../dolly/bestilling/histark/command/HistarkPostCommand.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java index 65d4374cddf..9c77a988eb6 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java @@ -48,10 +48,11 @@ public Flux call() { .body(BodyInserters.fromMultipartData(body)) .exchangeToMono(clientResponse -> { log.info("Status fra histark: {}", clientResponse.statusCode()); + log.info("Responseheaders fra histark: {}", clientResponse.headers().asHttpHeaders()); return clientResponse.toEntity(HistarkResponse.class); }) .mapNotNull(ResponseEntity::getBody) - .doOnNext(response -> log.info("Response fraa histark: {}", response)) + .doOnNext(response -> log.info("Responsebody fra histark: {}", response)) .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) .filter(WebClientFilter::is5xxException)) .doOnError(WebClientFilter::logErrorMessage) From 425fa18c9d89f72ca8d911156b5fbd0aedc08874 Mon Sep 17 00:00:00 2001 From: stigus Date: Mon, 28 Oct 2024 10:25:44 +0100 Subject: [PATCH 19/59] * Histark mer logging #deploy-test-dolly-backend #deploy-proxy-histark --- .../dolly/bestilling/histark/command/HistarkPostCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java index 9c77a988eb6..10b99651898 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java @@ -59,4 +59,4 @@ public Flux call() { .onErrorResume(throwable -> Mono.empty()); }); } -} \ No newline at end of file +} From 6cf9ce332289407c2f7829d56d6bf4f093bbd98f Mon Sep 17 00:00:00 2001 From: stigus Date: Mon, 28 Oct 2024 11:01:02 +0100 Subject: [PATCH 20/59] * Histark mer logging #deploy-test-dolly-backend #deploy-proxy-histark --- .../dolly/bestilling/histark/command/HistarkPostCommand.java | 1 + .../no/nav/dolly/provider/api/advice/HttpExceptionAdvice.java | 3 +++ 2 files changed, 4 insertions(+) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java index 10b99651898..4d29ab6bcd9 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java @@ -39,6 +39,7 @@ public Flux call() { bodyBuilder.part("file", histarkDokument.getFile().getBytes(StandardCharsets.UTF_8)); bodyBuilder.part("metadata", histarkDokument.getMetadata()); var body = bodyBuilder.build(); + log.info("Poster body til histark: {}", body); return webClient.post() .uri(builder -> builder.path("/api/saksmapper/import").build()) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/provider/api/advice/HttpExceptionAdvice.java b/apps/dolly-backend/src/main/java/no/nav/dolly/provider/api/advice/HttpExceptionAdvice.java index 6c1d8427a97..cb7d3c6c17c 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/provider/api/advice/HttpExceptionAdvice.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/provider/api/advice/HttpExceptionAdvice.java @@ -6,6 +6,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import no.nav.dolly.exceptions.ConstraintViolationException; import no.nav.dolly.exceptions.DollyFunctionalException; import no.nav.dolly.exceptions.KodeverkException; @@ -22,6 +23,7 @@ import java.time.LocalDateTime; @ControllerAdvice +@Slf4j @RequiredArgsConstructor public class HttpExceptionAdvice { @@ -29,6 +31,7 @@ public class HttpExceptionAdvice { private final UrlPathHelper urlPathHelper; private ExceptionInformation informationForException(RuntimeException exception, HttpStatus status) { + log.error("HttpException: ", exception); return ExceptionInformation.builder() .error(status.getReasonPhrase()) .status(status.value()) From c314028ded985db5c4344f2c7d81b7f67044eaaf Mon Sep 17 00:00:00 2001 From: stigus Date: Mon, 28 Oct 2024 11:16:37 +0100 Subject: [PATCH 21/59] * Histark mer logging #deploy-test-dolly-backend #deploy-proxy-histark --- .../bestilling/histark/command/HistarkPostCommand.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java index 4d29ab6bcd9..400d4233265 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java @@ -5,7 +5,6 @@ import no.nav.dolly.bestilling.histark.domain.HistarkRequest; import no.nav.dolly.bestilling.histark.domain.HistarkResponse; import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; -import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.http.client.MultipartBodyBuilder; @@ -42,10 +41,11 @@ public Flux call() { log.info("Poster body til histark: {}", body); return webClient.post() .uri(builder -> - builder.path("/api/saksmapper/import").build()) + builder.path("/api/saksmapper/import") + .queryParam("metadata", histarkDokument.getMetadata()) + .build()) .header(AUTHORIZATION, "Bearer " + token) .contentType(MediaType.MULTIPART_FORM_DATA) - .header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE) .body(BodyInserters.fromMultipartData(body)) .exchangeToMono(clientResponse -> { log.info("Status fra histark: {}", clientResponse.statusCode()); From e143d6b23414cb286a1ce853f3eb6c160b602f43 Mon Sep 17 00:00:00 2001 From: stigus Date: Mon, 28 Oct 2024 11:35:23 +0100 Subject: [PATCH 22/59] * Histark endrer body #deploy-test-dolly-backend #deploy-proxy-histark --- .../histark/command/HistarkPostCommand.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java index 400d4233265..4acc9d5e9f6 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java @@ -7,8 +7,6 @@ import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.http.client.MultipartBodyBuilder; -import org.springframework.web.reactive.function.BodyInserters; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -16,9 +14,11 @@ import java.nio.charset.StandardCharsets; import java.time.Duration; +import java.util.Arrays; import java.util.concurrent.Callable; import static org.springframework.http.HttpHeaders.AUTHORIZATION; +import static org.springframework.web.reactive.function.BodyInserters.fromFormData; @Slf4j @RequiredArgsConstructor @@ -34,11 +34,7 @@ public Flux call() { return Flux.fromIterable(histarkRequest.getHistarkDokumenter()) .flatMap(histarkDokument -> { - var bodyBuilder = new MultipartBodyBuilder(); - bodyBuilder.part("file", histarkDokument.getFile().getBytes(StandardCharsets.UTF_8)); - bodyBuilder.part("metadata", histarkDokument.getMetadata()); - var body = bodyBuilder.build(); - log.info("Poster body til histark: {}", body); + log.info("Sender metadata: {}", histarkDokument.getMetadata().toString()); return webClient.post() .uri(builder -> builder.path("/api/saksmapper/import") @@ -46,7 +42,8 @@ public Flux call() { .build()) .header(AUTHORIZATION, "Bearer " + token) .contentType(MediaType.MULTIPART_FORM_DATA) - .body(BodyInserters.fromMultipartData(body)) + .body(fromFormData("metadata", histarkDokument.getMetadata().toString()) + .with("file", Arrays.toString(histarkDokument.getFile().getBytes(StandardCharsets.UTF_8)))) .exchangeToMono(clientResponse -> { log.info("Status fra histark: {}", clientResponse.statusCode()); log.info("Responseheaders fra histark: {}", clientResponse.headers().asHttpHeaders()); From cd7baa85999f644fcd61443c181187e2d609e10c Mon Sep 17 00:00:00 2001 From: stigus Date: Mon, 28 Oct 2024 11:48:14 +0100 Subject: [PATCH 23/59] * Histark endrer body #deploy-test-dolly-backend #deploy-proxy-histark --- .../dolly/bestilling/histark/command/HistarkPostCommand.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java index 4acc9d5e9f6..d493b7b041d 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java @@ -4,6 +4,7 @@ import lombok.extern.slf4j.Slf4j; import no.nav.dolly.bestilling.histark.domain.HistarkRequest; import no.nav.dolly.bestilling.histark.domain.HistarkResponse; +import no.nav.dolly.exceptions.DollyFunctionalException; import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -47,6 +48,9 @@ public Flux call() { .exchangeToMono(clientResponse -> { log.info("Status fra histark: {}", clientResponse.statusCode()); log.info("Responseheaders fra histark: {}", clientResponse.headers().asHttpHeaders()); + if (clientResponse.statusCode().isError()) { + return Mono.error(new DollyFunctionalException("Feil ved opprettelse av saksmapper i histark")); + } return clientResponse.toEntity(HistarkResponse.class); }) .mapNotNull(ResponseEntity::getBody) From f616743d5941976122b5c4200e510cd1d5e244b2 Mon Sep 17 00:00:00 2001 From: stigus Date: Mon, 28 Oct 2024 13:21:40 +0100 Subject: [PATCH 24/59] * Histark endrer body #deploy-test-dolly-backend #deploy-proxy-histark --- .../bestilling/histark/command/HistarkPostCommand.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java index d493b7b041d..a716a1c3ab2 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java @@ -4,10 +4,8 @@ import lombok.extern.slf4j.Slf4j; import no.nav.dolly.bestilling.histark.domain.HistarkRequest; import no.nav.dolly.bestilling.histark.domain.HistarkResponse; -import no.nav.dolly.exceptions.DollyFunctionalException; import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -49,11 +47,12 @@ public Flux call() { log.info("Status fra histark: {}", clientResponse.statusCode()); log.info("Responseheaders fra histark: {}", clientResponse.headers().asHttpHeaders()); if (clientResponse.statusCode().isError()) { - return Mono.error(new DollyFunctionalException("Feil ved opprettelse av saksmapper i histark")); + return Mono.just(HistarkResponse.builder() + .feilmelding("Feil ved opprettelse av saksmappe, status: " + clientResponse.statusCode()) + .build()); } - return clientResponse.toEntity(HistarkResponse.class); + return clientResponse.bodyToMono(HistarkResponse.class); }) - .mapNotNull(ResponseEntity::getBody) .doOnNext(response -> log.info("Responsebody fra histark: {}", response)) .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) .filter(WebClientFilter::is5xxException)) From c05a91fa65f819cdca63e882380edc9406fb1d49 Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 31 Oct 2024 09:59:28 +0100 Subject: [PATCH 25/59] * Histark endrer body #deploy-test-dolly-backend --- .../dolly/bestilling/histark/command/HistarkPostCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java index a716a1c3ab2..bdde77ece66 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/command/HistarkPostCommand.java @@ -37,7 +37,7 @@ public Flux call() { return webClient.post() .uri(builder -> builder.path("/api/saksmapper/import") - .queryParam("metadata", histarkDokument.getMetadata()) + .queryParam("metadata", histarkDokument.getMetadata().toString()) .build()) .header(AUTHORIZATION, "Bearer " + token) .contentType(MediaType.MULTIPART_FORM_DATA) From aa19aa081db33cf153247dd81f071ac9705f5fe2 Mon Sep 17 00:00:00 2001 From: "Kristen.Herum" Date: Tue, 10 Dec 2024 11:28:11 +0100 Subject: [PATCH 26/59] Add KontaktMedPasientDTO to SykemeldingDTO Introduce the KontaktMedPasientDTO class to capture patient contact details such as contact date and reasons for no contact. This addition allows for enhanced tracking of patient interaction in the sykemelding domain. --- .../sykemelding/v1/KontaktMedPasientDTO.java | 18 ++++++++++++++++++ .../dto/sykemelding/v1/SykemeldingDTO.java | 1 + 2 files changed, 19 insertions(+) create mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/sykemelding/v1/KontaktMedPasientDTO.java diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/sykemelding/v1/KontaktMedPasientDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/sykemelding/v1/KontaktMedPasientDTO.java new file mode 100644 index 00000000000..26a51009850 --- /dev/null +++ b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/sykemelding/v1/KontaktMedPasientDTO.java @@ -0,0 +1,18 @@ +package no.nav.testnav.libs.dto.sykemelding.v1; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class KontaktMedPasientDTO { + + private LocalDate kontaktDato; + private String begrunnelseIkkeKontakt; +} diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/sykemelding/v1/SykemeldingDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/sykemelding/v1/SykemeldingDTO.java index 5b51f04b3cd..951c512b59f 100644 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/sykemelding/v1/SykemeldingDTO.java +++ b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/sykemelding/v1/SykemeldingDTO.java @@ -30,6 +30,7 @@ public class SykemeldingDTO { private DetaljerDTO detaljer; private List utdypendeOpplysninger; private Boolean umiddelbarBistand; + private KontaktMedPasientDTO kontaktMedPasient; public List getPerioder() { From eca79657e6e4cb3d999724a45327e21c251e7d23 Mon Sep 17 00:00:00 2001 From: Cato Olsen Date: Tue, 10 Dec 2024 14:26:20 +0100 Subject: [PATCH 27/59] =?UTF-8?q?Oppdatert=20dok=20med=20info=20om=20?= =?UTF-8?q?=C3=A5=20sette=20prosjekt=20og=20huske=20--update-adc.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/local_secretmanager.md | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/docs/local_secretmanager.md b/docs/local_secretmanager.md index bad8222050d..030d8428314 100644 --- a/docs/local_secretmanager.md +++ b/docs/local_secretmanager.md @@ -2,17 +2,29 @@ Noen hemmeligheter lagres i [Secret Manager](https://console.cloud.google.com/security/secret-manager?project=dolly-dev-ff83), som tilsvarer gamle [Vault](https://vault.adeo.no/). Disse hentes automagisk av applikasjonen ved oppstart lokalt gitt at man autentiserer seg med [gcloud CLI](https://cloud.google.com/cli?hl=en) først. +Om du ikke har brukt gcloud CLI før må du angi hvilket prosjekt du skal jobbe på. For Dolly er dette `dolly-dev-ff83`: +``` +> gcloud config set project dolly-dev-ff83 +``` +Innloggingen gjøres med: +``` +> gcloud auth login --update-adc +``` +> NB: Det er viktig å få med seg `--update-adc` her. [Om ADC](https://cloud.google.com/docs/authentication/application-default-credentials). + +Alternativt kan man installere [NAIS CLI](https://doc.nais.io/operate/cli/), som gir en wrapper rundt `gcloud auth login --update-adc`: +``` +> nais login +``` Applikasjonen må ha en dependency på `com.google.cloud:spring-cloud-gcp-starter-secretmanager`. Denne er inkludert ved bruk av plugins [dolly-apps](../plugins/java/src/main/groovy/dolly-apps.gradle) eller [dolly-proxies](../plugins/java/src/main/groovy/dolly-proxies.gradle). -Konfigurasjonen importerer namespace `sm://` og refererer deretter til secrets i ordinær config med `${sm://SECRET_NAME}`. Eks. fra en `application-local.yml`: +La Spring Boot-config'en din importere namespace `sm://` og referer til secrets med `${sm://SECRET_NAME}`. Eks. fra en `application-local.yml`: ```yaml +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + spring: config: import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} ``` Ingen annen kode kreves. \ No newline at end of file From ab7d14886351dd5e7076ff40ef69586bdcbf7c03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristen=20H=C3=A6rum?= Date: Tue, 10 Dec 2024 17:35:25 +0100 Subject: [PATCH 28/59] Bugfix/valideringsendepunkt (#3691) * Add KontaktMedPasientDTO to SykemeldingDTO Introduce the KontaktMedPasientDTO class to capture patient contact details such as contact date and reasons for no contact. This addition allows for enhanced tracking of patient interaction in the sykemelding domain. * Add KontaktMedPasient mapping to sykemelding #deploy-test-sykemelding-api This update introduces a new class for handling KontaktMedPasient data, enriching the sykemelding model with contact information details. The changes ensure that KontaktMedPasient details are correctly included in the mapping strategy and are validated through updated test cases. * Add test for handling null KontaktDato #deploy-test-sykemelding-api This commit introduces a new test case to verify the correct handling of null values for KontaktDato in the Sykemelding mapping logic. Additionally, it refactors the KontaktMedPasient constructor by removing the redundant start date parameter, streamlining object creation. These changes enhance the reliability and clarity of the codebase with regard to contact date management in health certificates. * Handle null DTO in KontaktMedPasient constructor #deploy-test-sykemelding-api Ensure that the KontaktMedPasient constructor checks for a null DTO before creating a new XMLHelseOpplysningerArbeidsuforhet.KontaktMedPasient instance. This change prevents potential null pointer exceptions and improves the robustness of the code. --- .../sykemelding/domain/Dokument.java | 6 ++--- .../sykemelding/domain/KontaktMedPasient.java | 22 +++++++++++++++++++ .../SykemeldingValidateMappingStrategy.java | 15 +++++++++++-- ...ykemeldingValidateMappingStrategyTest.java | 22 +++++++++++++++++++ 4 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 apps/sykemelding-api/src/main/java/no/nav/registre/testnorge/sykemelding/domain/KontaktMedPasient.java diff --git a/apps/sykemelding-api/src/main/java/no/nav/registre/testnorge/sykemelding/domain/Dokument.java b/apps/sykemelding-api/src/main/java/no/nav/registre/testnorge/sykemelding/domain/Dokument.java index 7f047ee9610..28bee941472 100644 --- a/apps/sykemelding-api/src/main/java/no/nav/registre/testnorge/sykemelding/domain/Dokument.java +++ b/apps/sykemelding-api/src/main/java/no/nav/registre/testnorge/sykemelding/domain/Dokument.java @@ -20,6 +20,7 @@ class Dokument { var prognose = new Prognose(fomIArbeid, dto.getDetaljer()); var helsepersonell = new Helsepersonell(dto.getHelsepersonell()); + var kontaktMedPasient = new KontaktMedPasient(dto.getKontaktMedPasient()); xmlHelseOpplysningerArbeidsuforhet = new XMLHelseOpplysningerArbeidsuforhet() .withSyketilfelleStartDato(dto.getStartDato()) @@ -35,10 +36,7 @@ class Dokument { .withTiltakNAV(dto.getDetaljer().getTiltakNav()) .withAndreTiltak(dto.getDetaljer().getAndreTiltak()) ) - .withKontaktMedPasient( - new XMLHelseOpplysningerArbeidsuforhet.KontaktMedPasient() - .withBehandletDato(fom.atStartOfDay()) - ) + .withKontaktMedPasient(kontaktMedPasient.getXmlObject()) .withBehandler(helsepersonell.getXmlObject()) .withAvsenderSystem(new XMLHelseOpplysningerArbeidsuforhet.AvsenderSystem() .withSystemNavn(applicationInfo.getName()) diff --git a/apps/sykemelding-api/src/main/java/no/nav/registre/testnorge/sykemelding/domain/KontaktMedPasient.java b/apps/sykemelding-api/src/main/java/no/nav/registre/testnorge/sykemelding/domain/KontaktMedPasient.java new file mode 100644 index 00000000000..bb22536ba4e --- /dev/null +++ b/apps/sykemelding-api/src/main/java/no/nav/registre/testnorge/sykemelding/domain/KontaktMedPasient.java @@ -0,0 +1,22 @@ +package no.nav.registre.testnorge.sykemelding.domain; + +import no.nav.registre.testnorge.sykemelding.external.xmlstds.helseopplysningerarbeidsuforhet._2013_10_01.XMLHelseOpplysningerArbeidsuforhet; +import no.nav.testnav.libs.dto.sykemelding.v1.KontaktMedPasientDTO; + +import static java.util.Objects.nonNull; + +class KontaktMedPasient { + + private final XMLHelseOpplysningerArbeidsuforhet.KontaktMedPasient xmlKontaktMedPasient; + + KontaktMedPasient(KontaktMedPasientDTO dto) { + + xmlKontaktMedPasient = nonNull(dto) ? new XMLHelseOpplysningerArbeidsuforhet.KontaktMedPasient() + .withKontaktDato(dto.getKontaktDato()) + .withBegrunnIkkeKontakt(dto.getBegrunnelseIkkeKontakt()) : null; + } + + XMLHelseOpplysningerArbeidsuforhet.KontaktMedPasient getXmlObject() { + return xmlKontaktMedPasient; + } +} \ No newline at end of file diff --git a/apps/sykemelding-api/src/main/java/no/nav/registre/testnorge/sykemelding/mapper/SykemeldingValidateMappingStrategy.java b/apps/sykemelding-api/src/main/java/no/nav/registre/testnorge/sykemelding/mapper/SykemeldingValidateMappingStrategy.java index 92683ace21d..dfa902221f3 100644 --- a/apps/sykemelding-api/src/main/java/no/nav/registre/testnorge/sykemelding/mapper/SykemeldingValidateMappingStrategy.java +++ b/apps/sykemelding-api/src/main/java/no/nav/registre/testnorge/sykemelding/mapper/SykemeldingValidateMappingStrategy.java @@ -97,8 +97,7 @@ public void mapAtoB(Sykemelding source, ReceivedSykemeldingDTO target, MappingCo .navn(xmlHelseOpplysningerArbeidsuforhet.getAvsenderSystem().getSystemNavn()) .versjon(xmlHelseOpplysningerArbeidsuforhet.getAvsenderSystem().getSystemVersjon()) .build()) - .kontaktMedPasient(ReceivedSykemeldingDTO.KontaktMedpasient.builder() - .build()) + .kontaktMedPasient(mapKontaktMedPasient(xmlHelseOpplysningerArbeidsuforhet.getKontaktMedPasient())) .tiltakArbeidsplassen(nonNull(xmlHelseOpplysningerArbeidsuforhet.getTiltak()) ? xmlHelseOpplysningerArbeidsuforhet.getTiltak().getTiltakArbeidsplassen() : null) .tiltakNAV(nonNull(xmlHelseOpplysningerArbeidsuforhet.getTiltak()) ? @@ -128,6 +127,18 @@ public void mapAtoB(Sykemelding source, ReceivedSykemeldingDTO target, MappingCo .register(); } + private ReceivedSykemeldingDTO.KontaktMedpasient mapKontaktMedPasient(XMLHelseOpplysningerArbeidsuforhet.KontaktMedPasient kontaktMedPasient) { + + if (isNull(kontaktMedPasient)) { + return null; + } + + return ReceivedSykemeldingDTO.KontaktMedpasient.builder() + .begrunnelseIkkeKontakt(kontaktMedPasient.getBegrunnIkkeKontakt()) + .kontaktDato(kontaktMedPasient.getKontaktDato()) + .build(); + } + private ReceivedSykemeldingDTO.ArbeidsgiverType mapHarArbeidsgiver(XMLCS harArbeidsgiver) { if (isNull(harArbeidsgiver)) { diff --git a/apps/sykemelding-api/src/test/java/no/nav/registre/testnorge/sykemelding/mapper/SykemeldingValidateMappingStrategyTest.java b/apps/sykemelding-api/src/test/java/no/nav/registre/testnorge/sykemelding/mapper/SykemeldingValidateMappingStrategyTest.java index 990c4af8e97..bb94bb963aa 100644 --- a/apps/sykemelding-api/src/test/java/no/nav/registre/testnorge/sykemelding/mapper/SykemeldingValidateMappingStrategyTest.java +++ b/apps/sykemelding-api/src/test/java/no/nav/registre/testnorge/sykemelding/mapper/SykemeldingValidateMappingStrategyTest.java @@ -10,6 +10,7 @@ import no.nav.testnav.libs.dto.sykemelding.v1.DetaljerDTO; import no.nav.testnav.libs.dto.sykemelding.v1.DiagnoseDTO; import no.nav.testnav.libs.dto.sykemelding.v1.HelsepersonellDTO; +import no.nav.testnav.libs.dto.sykemelding.v1.KontaktMedPasientDTO; import no.nav.testnav.libs.dto.sykemelding.v1.OrganisasjonDTO; import no.nav.testnav.libs.dto.sykemelding.v1.PasientDTO; import no.nav.testnav.libs.dto.sykemelding.v1.PeriodeDTO; @@ -133,6 +134,10 @@ private SykemeldingDTO getSykemeldingOK() { .restriksjon(SKJERMET_FOR_PASIENT) .build())) .build())) + .kontaktMedPasient(KontaktMedPasientDTO.builder() + .kontaktDato(LocalDate.of(2024, 11, 28)) + .begrunnelseIkkeKontakt("Begrunnelse ikke kontakt") + .build()) .build(); } @@ -222,6 +227,10 @@ void validateAllFields_OK() { assertThat(target.getSykmelding().getAndreTiltak(), is(equalTo("Andre tiltak"))); assertThat(target.getPersonNrLege(), is(equalTo(sykemeldingDTO.getHelsepersonell().getIdent()))); + + assertThat(target.getSykmelding().getKontaktMedPasient(), allOf( + hasProperty("kontaktDato", is(equalTo(LocalDate.of(2024, 11, 28)))), + hasProperty("begrunnelseIkkeKontakt", is(equalTo("Begrunnelse ikke kontakt"))))); } @Test @@ -246,4 +255,17 @@ void validateNoPerioder_Failure() { var exception = assertThrows(ResponseStatusException.class, () -> new Sykemelding(sykemeldingDTO, applicationInfo)); assertThat(exception.getMessage(), is(equalTo("400 BAD_REQUEST \"Perioder må angis\""))); } + + @Test + void validateNoKontaktDato_() { + + var sykemeldingDTO = getSykemeldingOK(); + sykemeldingDTO.getKontaktMedPasient().setKontaktDato(null); + + var sykemelding = new Sykemelding(sykemeldingDTO, applicationInfo); + var target = mapperFacade.map(sykemelding, ReceivedSykemeldingDTO.class); + + assertThat(target.getSykmelding().getKontaktMedPasient(), allOf( + hasProperty("kontaktDato", is(nullValue())))); + } } \ No newline at end of file From 783636c091f15db48e5d0f7b8e7f780361e5bce4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristen=20H=C3=A6rum?= Date: Tue, 10 Dec 2024 17:36:11 +0100 Subject: [PATCH 29/59] Refactor address expiry handling in MetadataTidspunkterService (#3690) * Refactor address expiry handling in MetadataTidspunkterService #deploy-test-pdl-forvalter Replace fixOpphoert with fixAddrOpphoert to better describe the logic of setting address expiry dates. This change improves code clarity by using a more descriptive method name and ensures consistency in handling different address types. --- .../service/MetadataTidspunkterService.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/MetadataTidspunkterService.java b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/MetadataTidspunkterService.java index ac902cfde1c..9f1634245bb 100644 --- a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/MetadataTidspunkterService.java +++ b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/MetadataTidspunkterService.java @@ -61,13 +61,13 @@ private void fixPerson(String ident) { .forEach(MetadataTidspunkterService::fixVersioning); person.getBostedsadresse() .forEach(MetadataTidspunkterService::fixAdresser); - fixOpphoert(person.getBostedsadresse()); + fixAddrOpphoert(person.getBostedsadresse()); person.getOppholdsadresse() .forEach(MetadataTidspunkterService::fixAdresser); - fixOpphoert(person.getOppholdsadresse()); + fixAddrOpphoert(person.getOppholdsadresse()); person.getKontaktadresse() .forEach(MetadataTidspunkterService::fixAdresser); - fixOpphoert(person.getKontaktadresse()); + fixAddrOpphoert(person.getKontaktadresse()); person.getDeltBosted() .forEach(MetadataTidspunkterService::fixDeltBosted); person.getDoedfoedtBarn() @@ -120,6 +120,12 @@ private void fixPerson(String ident) { }); } + private static void fixAddrOpphoert(List adresseopplysning) { + + adresseopplysning.forEach(adresse -> + adresse.getFolkeregistermetadata().setOpphoerstidspunkt(adresse.getGyldigTilOgMed())); + } + private static void fixOpphoert(List opplysningstype) { for (var i = opplysningstype.size() - 1; i > 0; i--) { @@ -220,8 +226,8 @@ private static void fixSivilstand(PersonDTO person) { person.getSivilstand().sort(Comparator.comparing(SivilstandDTO::getId).reversed()); var counter = new AtomicInteger(0); - person.getSivilstand().stream() - .forEachOrdered(sivilstand -> { + person.getSivilstand() + .forEach(sivilstand -> { fixFolkeregisterMetadata(sivilstand); if (isNull(sivilstand.getFolkeregistermetadata().getGyldighetstidspunkt())) { From cc262c93956bd5dc4384b8e474a196a00b63f06a Mon Sep 17 00:00:00 2001 From: Cato Olsen Date: Wed, 11 Dec 2024 15:20:37 +0100 Subject: [PATCH 30/59] bugfix/missing_azure_app_client (#3689) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Oppdaterer håndteringen av AZURE_APP_CLIENT_[ID|SECRET]. --- .../src/main/resources/application-local.yml | 7 +++++ .../{application.yaml => application.yml} | 0 ...lication-dev.yml => application-local.yml} | 8 ++---- .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-local.yml | 9 ++---- .../main/resources/application-localdb.yml | 8 ++---- .../src/main/resources/application-dev.yml | 8 ------ .../src/main/resources/application-local.yml} | 3 +- .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 12 -------- .../src/main/resources/application-local.yml | 10 +++++++ .../src/main/resources/logback-spring.xml | 2 +- ...ation-local.yaml => application-local.yml} | 0 ...ication-prod.yaml => application-prod.yml} | 0 .../{application.yaml => application.yml} | 0 .../src/main/resources/application-local.yml | 10 +++++-- .../src/main/resources/application-local.yml | 10 +++---- .../src/main/resources/logback-spring.xml | 2 +- ...plication-dev.yaml => application-dev.yml} | 0 ...ation-local.yaml => application-local.yml} | 8 ++---- ...ication-prod.yaml => application-prod.yml} | 0 .../{application.yaml => application.yml} | 0 .../bestilling/aareg/AaregConsumerTest.java | 2 +- .../ArenaForvalterConsumerTest.java | 2 +- .../instdata/InstdataConsumerTest.java | 2 +- .../KontoregisterConsumerTest.java | 2 +- .../krrstub/KrrstubConsumerTest.java | 2 +- .../PensjonforvalterConsumerTest.java | 2 +- .../sigrunstub/SigrunStubConsumerTest.java | 2 +- .../TpsMessagingConsumerTest.java | 2 +- ...ication-test.yaml => application-test.yml} | 0 .../src/main/resources/application-local.yml | 4 +-- ...lication-dev.yml => application-local.yml} | 0 .../src/main/resources/logback-spring.xml | 2 +- ...lication-dev.yml => application-local.yml} | 11 ++------ .../src/main/resources/logback-spring.xml | 2 +- ...lication-dev.yml => application-local.yml} | 8 ++---- .../src/main/resources/logback-spring.xml | 2 +- ...lication-dev.yml => application-local.yml} | 11 ++------ .../src/main/resources/logback-spring.xml | 2 +- ...lication-dev.yml => application-local.yml} | 8 ++---- .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 8 ------ .../src/main/resources/application-local.yml | 6 ++++ .../src/main/resources/logback-spring.xml | 2 +- ...lication-dev.yml => application-local.yml} | 8 ++---- .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 8 ------ .../src/main/resources/application-local.yml | 6 ++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 8 ------ .../src/main/resources/application-local.yml | 6 ++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 8 ------ .../src/main/resources/application-local.yml | 6 ++++ .../src/main/resources/logback-spring.xml | 2 +- ...lication-dev.yml => application-local.yml} | 14 ++++------ .../src/main/resources/logback-spring.xml | 2 +- ...lication-dev.yml => application-local.yml} | 10 ++----- .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 8 ------ .../src/main/resources/application-local.yml | 6 ++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 8 ------ .../src/main/resources/application-local.yml | 6 ++++ .../src/main/resources/logback-spring.xml | 2 +- ...lication-dev.yml => application-local.yml} | 8 ++---- .../src/main/resources/logback-spring.xml | 2 +- ...lication-dev.yml => application-local.yml} | 8 ++---- .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 11 -------- .../src/main/resources/application-local.yml | 9 ++++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 8 ------ .../src/main/resources/application-local.yml | 6 ++++ .../src/main/resources/logback-spring.xml | 2 +- ...lication-dev.yml => application-local.yml} | 1 - .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 28 ------------------- .../src/main/resources/application-local.yml | 20 +++++++++++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 24 ---------------- .../src/main/resources/application-local.yml | 16 +++++++++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-local.yml | 10 +++---- ...lication-dev.yml => application-local.yml} | 8 ++---- .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 8 ------ .../src/main/resources/application-local.yml | 6 ++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-local.yml | 14 +++------- ...lication-dev.yml => application-local.yml} | 8 ++---- .../src/main/resources/logback-spring.xml | 2 +- ...lication-dev.yml => application-local.yml} | 7 ++--- .../src/main/resources/logback-spring.xml | 2 +- ...plication-dev.yaml => application-dev.yml} | 0 ...ation-local.yaml => application-local.yml} | 8 ++---- ...ication-prod.yaml => application-prod.yml} | 0 .../{application.yaml => application.yml} | 0 ...lication-dev.yml => application-local.yml} | 12 ++------ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-local.yml | 17 ++++------- .../src/main/resources/application-dev.yml | 8 ------ .../src/main/resources/application-local.yml | 6 ++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 8 ------ .../src/main/resources/application-local.yml | 6 ++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 15 ---------- .../src/main/resources/application-local.yml | 10 +++++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 8 ------ .../src/main/resources/application-local.yml | 6 ++++ ...ication-prod.yaml => application-prod.yml} | 0 .../{application.yaml => application.yml} | 0 .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-local.yml | 10 +++---- .../src/main/resources/application-local.yml | 9 ++---- ...lication-dev.yml => application-local.yml} | 8 ++---- .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-local.yml | 12 +++----- .../src/main/resources/application-local.yml | 11 +++----- ...ication-prod.yaml => application-prod.yml} | 0 .../{application.yaml => application.yml} | 0 .../src/main/resources/application-local.yml | 16 +++-------- ...lication-dev.yml => application-local.yml} | 3 -- .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-local.yml | 8 +++++- .../src/main/resources/application-local.yml | 5 ++++ .../src/main/resources/application-local.yml | 9 ++---- docs/{compose.yaml => compose.yml} | 0 .../azuread/AzureNavClientCredential.java | 5 ++-- ...ation-local.yaml => application-local.yml} | 7 ++--- .../{application.yaml => application.yml} | 0 .../src/main/resources/application-dev.yml | 14 ---------- .../src/main/resources/application-local.yml | 11 ++++++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 14 ---------- .../src/main/resources/application-local.yml | 11 ++++++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 14 ---------- .../src/main/resources/application-local.yml | 11 ++++++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 14 ---------- .../src/main/resources/application-local.yml | 11 ++++++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 14 ---------- .../src/main/resources/application-local.yml | 11 ++++++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 15 ---------- .../src/main/resources/application-local.yml | 12 ++++++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 14 ---------- .../src/main/resources/application-local.yml | 11 ++++++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-local.yml | 9 ++---- .../src/main/resources/application-dev.yml | 14 ---------- .../src/main/resources/application-local.yml | 11 ++++++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 14 ---------- .../src/main/resources/application-local.yml | 11 ++++++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 14 ---------- .../src/main/resources/application-local.yml | 11 ++++++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 14 ---------- .../src/main/resources/application-local.yml | 11 ++++++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 14 ---------- .../src/main/resources/application-local.yml | 11 ++++++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 14 ---------- .../src/main/resources/application-local.yml | 11 ++++++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 14 ---------- .../src/main/resources/application-local.yml | 11 ++++++++ .../src/main/resources/logback-spring.xml | 2 +- ...lication-dev.yml => application-local.yml} | 2 ++ .../src/main/resources/logback-spring.xml | 2 +- ...lication-dev.yml => application-local.yml} | 8 ++---- .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 14 ---------- .../src/main/resources/application-local.yml | 11 ++++++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 14 ---------- .../src/main/resources/application-local.yml | 11 ++++++++ .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-local.yml | 7 ++--- ...lication-dev.yml => application-local.yml} | 8 ++---- .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/application-dev.yml | 14 ---------- .../src/main/resources/application-local.yml | 11 ++++++++ .../src/main/resources/logback-spring.xml | 2 +- ...ication-dev.yaml => application-local.yml} | 5 ++-- .../src/main/resources/logback-spring.xml | 2 +- 195 files changed, 530 insertions(+), 724 deletions(-) create mode 100644 apps/adresse-service/src/main/resources/application-local.yml rename apps/adresse-service/src/main/resources/{application.yaml => application.yml} (100%) rename apps/amelding-service/src/main/resources/{application-dev.yml => application-local.yml} (50%) delete mode 100644 apps/arbeidsforhold-service/src/main/resources/application-dev.yml rename apps/{adresse-service/src/main/resources/application-local.yaml => arbeidsforhold-service/src/main/resources/application-local.yml} (64%) delete mode 100644 apps/batch-bestilling-service/src/main/resources/application-dev.yml create mode 100644 apps/batch-bestilling-service/src/main/resources/application-local.yml rename apps/brreg-stub/src/main/resources/{application-local.yaml => application-local.yml} (100%) rename apps/brreg-stub/src/main/resources/{application-prod.yaml => application-prod.yml} (100%) rename apps/brreg-stub/src/main/resources/{application.yaml => application.yml} (100%) rename apps/dolly-backend/src/main/resources/{application-dev.yaml => application-dev.yml} (100%) rename apps/dolly-backend/src/main/resources/{application-local.yaml => application-local.yml} (93%) rename apps/dolly-backend/src/main/resources/{application-prod.yaml => application-prod.yml} (100%) rename apps/dolly-backend/src/main/resources/{application.yaml => application.yml} (100%) rename apps/dolly-backend/src/test/resources/{application-test.yaml => application-test.yml} (100%) rename apps/dollystatus/src/main/resources/{application-dev.yml => application-local.yml} (100%) rename apps/endringsmelding-frontend/src/main/resources/{application-dev.yml => application-local.yml} (58%) rename apps/endringsmelding-service/src/main/resources/{application-dev.yml => application-local.yml} (70%) rename apps/faste-data-frontend/src/main/resources/{application-dev.yml => application-local.yml} (72%) rename apps/generer-arbeidsforhold-populasjon-service/src/main/resources/{application-dev.yml => application-local.yml} (71%) delete mode 100644 apps/generer-navn-service/src/main/resources/application-dev.yml create mode 100644 apps/generer-navn-service/src/main/resources/application-local.yml rename apps/generer-organisasjon-populasjon-service/src/main/resources/{application-dev.yml => application-local.yml} (78%) delete mode 100644 apps/generer-synt-amelding-service/src/main/resources/application-dev.yml create mode 100644 apps/generer-synt-amelding-service/src/main/resources/application-local.yml delete mode 100644 apps/helsepersonell-service/src/main/resources/application-dev.yml create mode 100644 apps/helsepersonell-service/src/main/resources/application-local.yml delete mode 100644 apps/inntektsmelding-generator-service/src/main/resources/application-dev.yml create mode 100644 apps/inntektsmelding-generator-service/src/main/resources/application-local.yml rename apps/inntektsmelding-service/src/main/resources/{application-dev.yml => application-local.yml} (74%) rename apps/jenkins-batch-status-service/src/main/resources/{application-dev.yml => application-local.yml} (50%) delete mode 100644 apps/joark-dokument-service/src/main/resources/application-dev.yml create mode 100644 apps/joark-dokument-service/src/main/resources/application-local.yml delete mode 100644 apps/kodeverk-service/src/main/resources/application-dev.yml create mode 100644 apps/kodeverk-service/src/main/resources/application-local.yml rename apps/levende-arbeidsforhold-ansettelse/src/main/resources/{application-dev.yml => application-local.yml} (79%) rename apps/levende-arbeidsforhold-scheduler/src/main/resources/{application-dev.yml => application-local.yml} (52%) delete mode 100644 apps/levende-arbeidsforhold-service/src/main/resources/application-dev.yml create mode 100644 apps/levende-arbeidsforhold-service/src/main/resources/application-local.yml delete mode 100644 apps/miljoer-service/src/main/resources/application-dev.yml create mode 100644 apps/miljoer-service/src/main/resources/application-local.yml rename apps/oppsummeringsdokument-service/src/main/resources/{application-dev.yml => application-local.yml} (98%) delete mode 100644 apps/organisasjon-bestilling-service/src/main/resources/application-dev.yml create mode 100644 apps/organisasjon-bestilling-service/src/main/resources/application-local.yml delete mode 100644 apps/organisasjon-faste-data-service/src/main/resources/application-dev.yml create mode 100644 apps/organisasjon-faste-data-service/src/main/resources/application-local.yml rename apps/organisasjon-mottak-service/src/main/resources/{application-dev.yml => application-local.yml} (61%) delete mode 100644 apps/organisasjon-service/src/main/resources/application-dev.yml create mode 100644 apps/organisasjon-service/src/main/resources/application-local.yml rename apps/orgnummer-service/src/main/resources/{application-dev.yml => application-local.yml} (72%) rename apps/oversikt-frontend/src/main/resources/{application-dev.yml => application-local.yml} (77%) rename apps/pdl-forvalter/src/main/resources/{application-dev.yaml => application-dev.yml} (100%) rename apps/pdl-forvalter/src/main/resources/{application-local.yaml => application-local.yml} (82%) rename apps/pdl-forvalter/src/main/resources/{application-prod.yaml => application-prod.yml} (100%) rename apps/pdl-forvalter/src/main/resources/{application.yaml => application.yml} (100%) rename apps/person-faste-data-service/src/main/resources/{application-dev.yml => application-local.yml} (50%) delete mode 100644 apps/person-search-service/src/main/resources/application-dev.yml create mode 100644 apps/person-search-service/src/main/resources/application-local.yml delete mode 100644 apps/person-service/src/main/resources/application-dev.yml create mode 100644 apps/person-service/src/main/resources/application-local.yml delete mode 100644 apps/profil-api/src/main/resources/application-dev.yml create mode 100644 apps/profil-api/src/main/resources/application-local.yml delete mode 100644 apps/skattekort-service/src/main/resources/application-dev.yml create mode 100644 apps/skattekort-service/src/main/resources/application-local.yml rename apps/skattekort-service/src/main/resources/{application-prod.yaml => application-prod.yml} (100%) rename apps/skattekort-service/src/main/resources/{application.yaml => application.yml} (100%) rename apps/synt-vedtakshistorikk-service/src/main/resources/{application-dev.yml => application-local.yml} (77%) rename apps/testnav-ident-pool/src/main/resources/{application-prod.yaml => application-prod.yml} (100%) rename apps/testnav-ident-pool/src/main/resources/{application.yaml => application.yml} (100%) rename apps/tilbakemelding-api/src/main/resources/{application-dev.yml => application-local.yml} (66%) rename docs/{compose.yaml => compose.yml} (100%) rename proxies/aareg-proxy/src/main/resources/{application-local.yaml => application-local.yml} (54%) rename proxies/aareg-proxy/src/main/resources/{application.yaml => application.yml} (100%) delete mode 100644 proxies/aareg-synt-services-proxy/src/main/resources/application-dev.yml create mode 100644 proxies/aareg-synt-services-proxy/src/main/resources/application-local.yml delete mode 100644 proxies/arbeidsplassencv-proxy/src/main/resources/application-dev.yml create mode 100644 proxies/arbeidsplassencv-proxy/src/main/resources/application-local.yml delete mode 100644 proxies/arena-forvalteren-proxy/src/main/resources/application-dev.yml create mode 100644 proxies/arena-forvalteren-proxy/src/main/resources/application-local.yml delete mode 100644 proxies/batch-adeo-proxy/src/main/resources/application-dev.yml create mode 100644 proxies/batch-adeo-proxy/src/main/resources/application-local.yml delete mode 100644 proxies/brregstub-proxy/src/main/resources/application-dev.yml create mode 100644 proxies/brregstub-proxy/src/main/resources/application-local.yml delete mode 100644 proxies/dokarkiv-proxy/src/main/resources/application-dev.yml create mode 100644 proxies/dokarkiv-proxy/src/main/resources/application-local.yml delete mode 100644 proxies/ereg-proxy/src/main/resources/application-dev.yml create mode 100644 proxies/ereg-proxy/src/main/resources/application-local.yml delete mode 100644 proxies/histark-proxy/src/main/resources/application-dev.yml create mode 100644 proxies/histark-proxy/src/main/resources/application-local.yml delete mode 100644 proxies/inntektstub-proxy/src/main/resources/application-dev.yml create mode 100644 proxies/inntektstub-proxy/src/main/resources/application-local.yml delete mode 100644 proxies/inst-proxy/src/main/resources/application-dev.yml create mode 100644 proxies/inst-proxy/src/main/resources/application-local.yml delete mode 100644 proxies/kontoregister-person-proxy/src/main/resources/application-dev.yml create mode 100644 proxies/kontoregister-person-proxy/src/main/resources/application-local.yml delete mode 100644 proxies/krrstub-proxy/src/main/resources/application-dev.yml create mode 100644 proxies/krrstub-proxy/src/main/resources/application-local.yml delete mode 100644 proxies/medl-proxy/src/main/resources/application-dev.yml create mode 100644 proxies/medl-proxy/src/main/resources/application-local.yml delete mode 100644 proxies/norg2-proxy/src/main/resources/application-dev.yml create mode 100644 proxies/norg2-proxy/src/main/resources/application-local.yml rename proxies/pdl-proxy/src/main/resources/{application-dev.yml => application-local.yml} (75%) rename proxies/pensjon-testdata-facade-proxy/src/main/resources/{application-dev.yml => application-local.yml} (56%) delete mode 100644 proxies/saf-proxy/src/main/resources/application-dev.yml create mode 100644 proxies/saf-proxy/src/main/resources/application-local.yml delete mode 100644 proxies/sigrunstub-proxy/src/main/resources/application-dev.yml create mode 100644 proxies/sigrunstub-proxy/src/main/resources/application-local.yml rename proxies/synthdata-meldekort-proxy/src/main/resources/{application-dev.yml => application-local.yml} (72%) delete mode 100644 proxies/udistub-proxy/src/main/resources/application-dev.yml create mode 100644 proxies/udistub-proxy/src/main/resources/application-local.yml rename proxies/yrkesskade-proxy/src/main/resources/{application-dev.yaml => application-local.yml} (72%) diff --git a/apps/adresse-service/src/main/resources/application-local.yml b/apps/adresse-service/src/main/resources/application-local.yml new file mode 100644 index 00000000000..d2582a766ea --- /dev/null +++ b/apps/adresse-service/src/main/resources/application-local.yml @@ -0,0 +1,7 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} +TOKEN_X_CLIENT_ID: dev-gcp:dolly:testnav-adresse-service + +spring: + config: + import: "sm://" diff --git a/apps/adresse-service/src/main/resources/application.yaml b/apps/adresse-service/src/main/resources/application.yml similarity index 100% rename from apps/adresse-service/src/main/resources/application.yaml rename to apps/adresse-service/src/main/resources/application.yml diff --git a/apps/amelding-service/src/main/resources/application-dev.yml b/apps/amelding-service/src/main/resources/application-local.yml similarity index 50% rename from apps/amelding-service/src/main/resources/application-dev.yml rename to apps/amelding-service/src/main/resources/application-local.yml index e222fbad757..fd9e94057e6 100644 --- a/apps/amelding-service/src/main/resources/application-dev.yml +++ b/apps/amelding-service/src/main/resources/application-local.yml @@ -1,11 +1,9 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + spring: config: import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} consumers: oppsummeringsdokument-service: diff --git a/apps/amelding-service/src/main/resources/logback-spring.xml b/apps/amelding-service/src/main/resources/logback-spring.xml index f874dcc44c1..ae836bf1b11 100644 --- a/apps/amelding-service/src/main/resources/logback-spring.xml +++ b/apps/amelding-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/app-tilgang-analyse-service/src/main/resources/application-local.yml b/apps/app-tilgang-analyse-service/src/main/resources/application-local.yml index 6e81acdc788..fa988806f6d 100644 --- a/apps/app-tilgang-analyse-service/src/main/resources/application-local.yml +++ b/apps/app-tilgang-analyse-service/src/main/resources/application-local.yml @@ -1,3 +1,6 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + spring: config: import: "sm://" @@ -5,9 +8,3 @@ spring: url: jdbc:h2:mem:testdb username: sa password: - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} - diff --git a/apps/app-tilgang-analyse-service/src/main/resources/application-localdb.yml b/apps/app-tilgang-analyse-service/src/main/resources/application-localdb.yml index baf2a030a5e..191fc5b367f 100644 --- a/apps/app-tilgang-analyse-service/src/main/resources/application-localdb.yml +++ b/apps/app-tilgang-analyse-service/src/main/resources/application-localdb.yml @@ -1,3 +1,6 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + spring: config: import: "sm://" @@ -9,8 +12,3 @@ spring: url: r2dbc:postgresql://localhost:3306/testnav-app-tilgang-analyse-service-db username: testnav-app-tilgang-analyse-service password: ${DB_PASSWORD} - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/apps/arbeidsforhold-service/src/main/resources/application-dev.yml b/apps/arbeidsforhold-service/src/main/resources/application-dev.yml deleted file mode 100644 index bea43da510a..00000000000 --- a/apps/arbeidsforhold-service/src/main/resources/application-dev.yml +++ /dev/null @@ -1,8 +0,0 @@ -spring: - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/apps/adresse-service/src/main/resources/application-local.yaml b/apps/arbeidsforhold-service/src/main/resources/application-local.yml similarity index 64% rename from apps/adresse-service/src/main/resources/application-local.yaml rename to apps/arbeidsforhold-service/src/main/resources/application-local.yml index 4b75550d16b..e36d70419c6 100644 --- a/apps/adresse-service/src/main/resources/application-local.yaml +++ b/apps/arbeidsforhold-service/src/main/resources/application-local.yml @@ -1,4 +1,5 @@ -TOKEN_X_CLIENT_ID: dev-gcp:dolly:testnav-adresse-service +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} spring: config: diff --git a/apps/arbeidsforhold-service/src/main/resources/logback-spring.xml b/apps/arbeidsforhold-service/src/main/resources/logback-spring.xml index 6e928942d90..c6f5a93ab27 100644 --- a/apps/arbeidsforhold-service/src/main/resources/logback-spring.xml +++ b/apps/arbeidsforhold-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/batch-bestilling-service/src/main/resources/application-dev.yml b/apps/batch-bestilling-service/src/main/resources/application-dev.yml deleted file mode 100644 index c3bbec56cd7..00000000000 --- a/apps/batch-bestilling-service/src/main/resources/application-dev.yml +++ /dev/null @@ -1,12 +0,0 @@ -spring: - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} - -consumers: - dolly-backend: - url: https://dolly-backend.intern.dev.nav.no \ No newline at end of file diff --git a/apps/batch-bestilling-service/src/main/resources/application-local.yml b/apps/batch-bestilling-service/src/main/resources/application-local.yml new file mode 100644 index 00000000000..ee40c021aad --- /dev/null +++ b/apps/batch-bestilling-service/src/main/resources/application-local.yml @@ -0,0 +1,10 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + +spring: + config: + import: "sm://" + +consumers: + dolly-backend: + url: https://dolly-backend.intern.dev.nav.no \ No newline at end of file diff --git a/apps/batch-bestilling-service/src/main/resources/logback-spring.xml b/apps/batch-bestilling-service/src/main/resources/logback-spring.xml index 7309420d4fd..7573f10edb7 100644 --- a/apps/batch-bestilling-service/src/main/resources/logback-spring.xml +++ b/apps/batch-bestilling-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/brreg-stub/src/main/resources/application-local.yaml b/apps/brreg-stub/src/main/resources/application-local.yml similarity index 100% rename from apps/brreg-stub/src/main/resources/application-local.yaml rename to apps/brreg-stub/src/main/resources/application-local.yml diff --git a/apps/brreg-stub/src/main/resources/application-prod.yaml b/apps/brreg-stub/src/main/resources/application-prod.yml similarity index 100% rename from apps/brreg-stub/src/main/resources/application-prod.yaml rename to apps/brreg-stub/src/main/resources/application-prod.yml diff --git a/apps/brreg-stub/src/main/resources/application.yaml b/apps/brreg-stub/src/main/resources/application.yml similarity index 100% rename from apps/brreg-stub/src/main/resources/application.yaml rename to apps/brreg-stub/src/main/resources/application.yml diff --git a/apps/bruker-service/src/main/resources/application-local.yml b/apps/bruker-service/src/main/resources/application-local.yml index e5668233f25..c348e6eb2a7 100644 --- a/apps/bruker-service/src/main/resources/application-local.yml +++ b/apps/bruker-service/src/main/resources/application-local.yml @@ -1,11 +1,15 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} CRYPTOGRAPHY_SECRET: DUMMY SUPER SECRET CRYPTOGRAPHY KEY THAT IS NOT SECURE JWT_SECRET: DUMMY SUPER SECRET JWT KEY THAT IS NOT SECURE - TOKEN_X_CLIENT_ID: dev-gcp:dolly:testnav-bruker-service-dev -TOKENDINGS_URL: ${TOKEN_X_ISSUER} +TOKENDINGS_URL: ${TOKEN_X_ISSUER} + spring: application: name: testnav-bruker-service-dev + config: + import: "sm://" flyway: url: jdbc:h2:mem:testdb username: sa @@ -14,4 +18,4 @@ spring: consumers: testnav-person-organisasjon-tilgang-service: url: https://testnav-person-organisasjon-tilgang-service-dev.intern.dev.nav.no - name: testnav-person-organisasjon-tilgang-service-dev \ No newline at end of file + name: testnav-person-organisasjon-tilgang-service-dev diff --git a/apps/budpro-service/src/main/resources/application-local.yml b/apps/budpro-service/src/main/resources/application-local.yml index 10148a7de46..675d84c40f0 100644 --- a/apps/budpro-service/src/main/resources/application-local.yml +++ b/apps/budpro-service/src/main/resources/application-local.yml @@ -1,11 +1,9 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + spring: config: import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} management: endpoints: @@ -15,4 +13,4 @@ management: consumers: generer-navn-service: - url: "https://generer-navn-service.intern.dev.nav.no" \ No newline at end of file + url: "https://generer-navn-service.intern.dev.nav.no" diff --git a/apps/budpro-service/src/main/resources/logback-spring.xml b/apps/budpro-service/src/main/resources/logback-spring.xml index 8d108ba7157..51d34a83c96 100644 --- a/apps/budpro-service/src/main/resources/logback-spring.xml +++ b/apps/budpro-service/src/main/resources/logback-spring.xml @@ -1,6 +1,6 @@ - + diff --git a/apps/dolly-backend/src/main/resources/application-dev.yaml b/apps/dolly-backend/src/main/resources/application-dev.yml similarity index 100% rename from apps/dolly-backend/src/main/resources/application-dev.yaml rename to apps/dolly-backend/src/main/resources/application-dev.yml diff --git a/apps/dolly-backend/src/main/resources/application-local.yaml b/apps/dolly-backend/src/main/resources/application-local.yml similarity index 93% rename from apps/dolly-backend/src/main/resources/application-local.yaml rename to apps/dolly-backend/src/main/resources/application-local.yml index e4f1a7387b8..ac07258e578 100644 --- a/apps/dolly-backend/src/main/resources/application-local.yaml +++ b/apps/dolly-backend/src/main/resources/application-local.yml @@ -1,3 +1,6 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + dolly: client: general: @@ -12,11 +15,6 @@ spring: url: jdbc:postgresql://localhost:5432/testnav-dolly-backend-local username: testnav-dolly-backend-local password: ${sm://testnav-dolly-backend-local} - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} management: endpoints: diff --git a/apps/dolly-backend/src/main/resources/application-prod.yaml b/apps/dolly-backend/src/main/resources/application-prod.yml similarity index 100% rename from apps/dolly-backend/src/main/resources/application-prod.yaml rename to apps/dolly-backend/src/main/resources/application-prod.yml diff --git a/apps/dolly-backend/src/main/resources/application.yaml b/apps/dolly-backend/src/main/resources/application.yml similarity index 100% rename from apps/dolly-backend/src/main/resources/application.yaml rename to apps/dolly-backend/src/main/resources/application.yml diff --git a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/aareg/AaregConsumerTest.java b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/aareg/AaregConsumerTest.java index 2a3a2c43845..217d0de176d 100644 --- a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/aareg/AaregConsumerTest.java +++ b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/aareg/AaregConsumerTest.java @@ -39,7 +39,7 @@ @ActiveProfiles("test") @ExtendWith(SpringExtension.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@TestPropertySource(locations = "classpath:application.yaml") +@TestPropertySource(locations = "classpath:application.yml") @AutoConfigureWireMock(port = 0) class AaregConsumerTest { diff --git a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/arenaforvalter/ArenaForvalterConsumerTest.java b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/arenaforvalter/ArenaForvalterConsumerTest.java index d8e29a9d42d..99f38233dbf 100644 --- a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/arenaforvalter/ArenaForvalterConsumerTest.java +++ b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/arenaforvalter/ArenaForvalterConsumerTest.java @@ -35,7 +35,7 @@ @ActiveProfiles("test") @ExtendWith(SpringExtension.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@TestPropertySource(locations = "classpath:application.yaml") +@TestPropertySource(locations = "classpath:application.yml") @AutoConfigureWireMock(port = 0) class ArenaForvalterConsumerTest { diff --git a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/instdata/InstdataConsumerTest.java b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/instdata/InstdataConsumerTest.java index 8a5bdf1c5ea..21b887d970e 100644 --- a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/instdata/InstdataConsumerTest.java +++ b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/instdata/InstdataConsumerTest.java @@ -37,7 +37,7 @@ @ActiveProfiles("test") @ExtendWith(SpringExtension.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@TestPropertySource(locations = "classpath:application.yaml") +@TestPropertySource(locations = "classpath:application.yml") @AutoConfigureWireMock(port = 0) class InstdataConsumerTest { diff --git a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/kontoregisterservice/KontoregisterConsumerTest.java b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/kontoregisterservice/KontoregisterConsumerTest.java index 2e26426511d..40a6ede774a 100644 --- a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/kontoregisterservice/KontoregisterConsumerTest.java +++ b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/kontoregisterservice/KontoregisterConsumerTest.java @@ -42,7 +42,7 @@ @ActiveProfiles("test") @ExtendWith(SpringExtension.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@TestPropertySource(locations = "classpath:application.yaml") +@TestPropertySource(locations = "classpath:application.yml") @AutoConfigureWireMock(port = 0) class KontoregisterConsumerTest { private static final String IDENT = "12345678901"; diff --git a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/krrstub/KrrstubConsumerTest.java b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/krrstub/KrrstubConsumerTest.java index d5afa94ac60..76437c53abc 100644 --- a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/krrstub/KrrstubConsumerTest.java +++ b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/krrstub/KrrstubConsumerTest.java @@ -44,7 +44,7 @@ @ActiveProfiles("test") @ExtendWith(SpringExtension.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@TestPropertySource(locations = "classpath:application.yaml") +@TestPropertySource(locations = "classpath:application.yml") @AutoConfigureWireMock(port = 0) class KrrstubConsumerTest { diff --git a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterConsumerTest.java b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterConsumerTest.java index 6aa4613ac43..58d401d7fae 100644 --- a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterConsumerTest.java +++ b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterConsumerTest.java @@ -38,7 +38,7 @@ @ActiveProfiles("test") @ExtendWith(SpringExtension.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@TestPropertySource(locations = "classpath:application.yaml") +@TestPropertySource(locations = "classpath:application.yml") @AutoConfigureWireMock(port = 0) class PensjonforvalterConsumerTest { diff --git a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/sigrunstub/SigrunStubConsumerTest.java b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/sigrunstub/SigrunStubConsumerTest.java index a2d09fd56ad..90d4946730c 100644 --- a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/sigrunstub/SigrunStubConsumerTest.java +++ b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/sigrunstub/SigrunStubConsumerTest.java @@ -41,7 +41,7 @@ @ActiveProfiles("test") @ExtendWith(SpringExtension.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@TestPropertySource(locations = "classpath:application.yaml") +@TestPropertySource(locations = "classpath:application.yml") @AutoConfigureWireMock(port = 0) class SigrunStubConsumerTest { diff --git a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/tpsmessagingservice/TpsMessagingConsumerTest.java b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/tpsmessagingservice/TpsMessagingConsumerTest.java index 8c3f2a441a9..4f29d5b8985 100644 --- a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/tpsmessagingservice/TpsMessagingConsumerTest.java +++ b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/tpsmessagingservice/TpsMessagingConsumerTest.java @@ -41,7 +41,7 @@ @ActiveProfiles("test") @ExtendWith(SpringExtension.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@TestPropertySource(locations = "classpath:application.yaml") +@TestPropertySource(locations = "classpath:application.yml") @AutoConfigureWireMock(port = 0) class TpsMessagingConsumerTest { diff --git a/apps/dolly-backend/src/test/resources/application-test.yaml b/apps/dolly-backend/src/test/resources/application-test.yml similarity index 100% rename from apps/dolly-backend/src/test/resources/application-test.yaml rename to apps/dolly-backend/src/test/resources/application-test.yml diff --git a/apps/dolly-frontend/src/main/resources/application-local.yml b/apps/dolly-frontend/src/main/resources/application-local.yml index 4d5c7544302..658916c4809 100644 --- a/apps/dolly-frontend/src/main/resources/application-local.yml +++ b/apps/dolly-frontend/src/main/resources/application-local.yml @@ -1,3 +1,5 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} POST_LOGOUT_REDIRECT_URI: 'http://localhost:3000/login' REDIS_HOST: localhost TOKEN_X_ISSUER: dummy @@ -13,8 +15,6 @@ spring: client: registration: aad: - client-id: ${sm://azure-app-client-id} - client-secret: ${sm://azure-app-client-secret} authorization-grant-type: authorization_code redirect-uri: 'http://localhost:3000/login/oauth2/code/{registrationId}' scope: openid, offline_access, ${sm://azure-app-client-id}/.default diff --git a/apps/dollystatus/src/main/resources/application-dev.yml b/apps/dollystatus/src/main/resources/application-local.yml similarity index 100% rename from apps/dollystatus/src/main/resources/application-dev.yml rename to apps/dollystatus/src/main/resources/application-local.yml diff --git a/apps/dollystatus/src/main/resources/logback-spring.xml b/apps/dollystatus/src/main/resources/logback-spring.xml index bda6e2fe01e..bfc6c10dbeb 100644 --- a/apps/dollystatus/src/main/resources/logback-spring.xml +++ b/apps/dollystatus/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/endringsmelding-frontend/src/main/resources/application-dev.yml b/apps/endringsmelding-frontend/src/main/resources/application-local.yml similarity index 58% rename from apps/endringsmelding-frontend/src/main/resources/application-dev.yml rename to apps/endringsmelding-frontend/src/main/resources/application-local.yml index f280c84ef1e..baa3afe677c 100644 --- a/apps/endringsmelding-frontend/src/main/resources/application-dev.yml +++ b/apps/endringsmelding-frontend/src/main/resources/application-local.yml @@ -1,14 +1,9 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + spring: config: import: "sm://" - security: - oauth2: - client: - registration: - aad: - client-id: ${sm://azure-app-client-id} - client-secret: ${sm://azure-app-client-secret} - scope: openid, ${sm://azure-app-client-id}/.default consumers: endringsmelding-service: diff --git a/apps/endringsmelding-frontend/src/main/resources/logback-spring.xml b/apps/endringsmelding-frontend/src/main/resources/logback-spring.xml index 567d9f139e0..05ead4bd0b2 100644 --- a/apps/endringsmelding-frontend/src/main/resources/logback-spring.xml +++ b/apps/endringsmelding-frontend/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/endringsmelding-service/src/main/resources/application-dev.yml b/apps/endringsmelding-service/src/main/resources/application-local.yml similarity index 70% rename from apps/endringsmelding-service/src/main/resources/application-dev.yml rename to apps/endringsmelding-service/src/main/resources/application-local.yml index ba56e2420c7..88fa3ad63ce 100644 --- a/apps/endringsmelding-service/src/main/resources/application-dev.yml +++ b/apps/endringsmelding-service/src/main/resources/application-local.yml @@ -1,11 +1,9 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + spring: config: import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} consumers: adresse-service: diff --git a/apps/endringsmelding-service/src/main/resources/logback-spring.xml b/apps/endringsmelding-service/src/main/resources/logback-spring.xml index 0b85920eee1..7e71f477274 100644 --- a/apps/endringsmelding-service/src/main/resources/logback-spring.xml +++ b/apps/endringsmelding-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/faste-data-frontend/src/main/resources/application-dev.yml b/apps/faste-data-frontend/src/main/resources/application-local.yml similarity index 72% rename from apps/faste-data-frontend/src/main/resources/application-dev.yml rename to apps/faste-data-frontend/src/main/resources/application-local.yml index a77714ef5d5..8a5ed30f192 100644 --- a/apps/faste-data-frontend/src/main/resources/application-dev.yml +++ b/apps/faste-data-frontend/src/main/resources/application-local.yml @@ -1,14 +1,9 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + spring: config: import: "sm://" - security: - oauth2: - client: - registration: - aad: - client-id: ${sm://azure-app-client-id} - client-secret: ${sm://azure-app-client-secret} - scope: openid, ${sm://azure-app-client-id}/.default consumers: testnorge-profil-api: diff --git a/apps/faste-data-frontend/src/main/resources/logback-spring.xml b/apps/faste-data-frontend/src/main/resources/logback-spring.xml index b2989b19b94..9aed9d5f0bc 100644 --- a/apps/faste-data-frontend/src/main/resources/logback-spring.xml +++ b/apps/faste-data-frontend/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/generer-arbeidsforhold-populasjon-service/src/main/resources/application-dev.yml b/apps/generer-arbeidsforhold-populasjon-service/src/main/resources/application-local.yml similarity index 71% rename from apps/generer-arbeidsforhold-populasjon-service/src/main/resources/application-dev.yml rename to apps/generer-arbeidsforhold-populasjon-service/src/main/resources/application-local.yml index 59f4904438e..195b7f9833e 100644 --- a/apps/generer-arbeidsforhold-populasjon-service/src/main/resources/application-dev.yml +++ b/apps/generer-arbeidsforhold-populasjon-service/src/main/resources/application-local.yml @@ -1,11 +1,9 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + spring: config: import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} consumers: oppsummeringsdokument-service: diff --git a/apps/generer-arbeidsforhold-populasjon-service/src/main/resources/logback-spring.xml b/apps/generer-arbeidsforhold-populasjon-service/src/main/resources/logback-spring.xml index 3d7fef3768d..2b8e3e07012 100644 --- a/apps/generer-arbeidsforhold-populasjon-service/src/main/resources/logback-spring.xml +++ b/apps/generer-arbeidsforhold-populasjon-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/generer-navn-service/src/main/resources/application-dev.yml b/apps/generer-navn-service/src/main/resources/application-dev.yml deleted file mode 100644 index bea43da510a..00000000000 --- a/apps/generer-navn-service/src/main/resources/application-dev.yml +++ /dev/null @@ -1,8 +0,0 @@ -spring: - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/apps/generer-navn-service/src/main/resources/application-local.yml b/apps/generer-navn-service/src/main/resources/application-local.yml new file mode 100644 index 00000000000..6997e9cd385 --- /dev/null +++ b/apps/generer-navn-service/src/main/resources/application-local.yml @@ -0,0 +1,6 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + +spring: + config: + import: "sm://" \ No newline at end of file diff --git a/apps/generer-navn-service/src/main/resources/logback-spring.xml b/apps/generer-navn-service/src/main/resources/logback-spring.xml index 7309420d4fd..7573f10edb7 100644 --- a/apps/generer-navn-service/src/main/resources/logback-spring.xml +++ b/apps/generer-navn-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/generer-organisasjon-populasjon-service/src/main/resources/application-dev.yml b/apps/generer-organisasjon-populasjon-service/src/main/resources/application-local.yml similarity index 78% rename from apps/generer-organisasjon-populasjon-service/src/main/resources/application-dev.yml rename to apps/generer-organisasjon-populasjon-service/src/main/resources/application-local.yml index c8f5ecd88f7..76d1abfaa71 100644 --- a/apps/generer-organisasjon-populasjon-service/src/main/resources/application-dev.yml +++ b/apps/generer-organisasjon-populasjon-service/src/main/resources/application-local.yml @@ -1,3 +1,6 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + spring: config: import: "sm://" @@ -16,11 +19,6 @@ spring: properties: hibernate: dialect: org.hibernate.dialect.H2Dialect - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} consumers: generer-navn-service: diff --git a/apps/generer-organisasjon-populasjon-service/src/main/resources/logback-spring.xml b/apps/generer-organisasjon-populasjon-service/src/main/resources/logback-spring.xml index 3d7fef3768d..2b8e3e07012 100644 --- a/apps/generer-organisasjon-populasjon-service/src/main/resources/logback-spring.xml +++ b/apps/generer-organisasjon-populasjon-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/generer-synt-amelding-service/src/main/resources/application-dev.yml b/apps/generer-synt-amelding-service/src/main/resources/application-dev.yml deleted file mode 100644 index bea43da510a..00000000000 --- a/apps/generer-synt-amelding-service/src/main/resources/application-dev.yml +++ /dev/null @@ -1,8 +0,0 @@ -spring: - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/apps/generer-synt-amelding-service/src/main/resources/application-local.yml b/apps/generer-synt-amelding-service/src/main/resources/application-local.yml new file mode 100644 index 00000000000..6997e9cd385 --- /dev/null +++ b/apps/generer-synt-amelding-service/src/main/resources/application-local.yml @@ -0,0 +1,6 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + +spring: + config: + import: "sm://" \ No newline at end of file diff --git a/apps/generer-synt-amelding-service/src/main/resources/logback-spring.xml b/apps/generer-synt-amelding-service/src/main/resources/logback-spring.xml index 7b0b3b1cca1..7185afb4ac0 100644 --- a/apps/generer-synt-amelding-service/src/main/resources/logback-spring.xml +++ b/apps/generer-synt-amelding-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/helsepersonell-service/src/main/resources/application-dev.yml b/apps/helsepersonell-service/src/main/resources/application-dev.yml deleted file mode 100644 index bea43da510a..00000000000 --- a/apps/helsepersonell-service/src/main/resources/application-dev.yml +++ /dev/null @@ -1,8 +0,0 @@ -spring: - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/apps/helsepersonell-service/src/main/resources/application-local.yml b/apps/helsepersonell-service/src/main/resources/application-local.yml new file mode 100644 index 00000000000..6997e9cd385 --- /dev/null +++ b/apps/helsepersonell-service/src/main/resources/application-local.yml @@ -0,0 +1,6 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + +spring: + config: + import: "sm://" \ No newline at end of file diff --git a/apps/helsepersonell-service/src/main/resources/logback-spring.xml b/apps/helsepersonell-service/src/main/resources/logback-spring.xml index c2304354f25..520565e1ba0 100644 --- a/apps/helsepersonell-service/src/main/resources/logback-spring.xml +++ b/apps/helsepersonell-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/inntektsmelding-generator-service/src/main/resources/application-dev.yml b/apps/inntektsmelding-generator-service/src/main/resources/application-dev.yml deleted file mode 100644 index bea43da510a..00000000000 --- a/apps/inntektsmelding-generator-service/src/main/resources/application-dev.yml +++ /dev/null @@ -1,8 +0,0 @@ -spring: - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/apps/inntektsmelding-generator-service/src/main/resources/application-local.yml b/apps/inntektsmelding-generator-service/src/main/resources/application-local.yml new file mode 100644 index 00000000000..6997e9cd385 --- /dev/null +++ b/apps/inntektsmelding-generator-service/src/main/resources/application-local.yml @@ -0,0 +1,6 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + +spring: + config: + import: "sm://" \ No newline at end of file diff --git a/apps/inntektsmelding-generator-service/src/main/resources/logback-spring.xml b/apps/inntektsmelding-generator-service/src/main/resources/logback-spring.xml index 3d7fef3768d..2b8e3e07012 100644 --- a/apps/inntektsmelding-generator-service/src/main/resources/logback-spring.xml +++ b/apps/inntektsmelding-generator-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/inntektsmelding-service/src/main/resources/application-dev.yml b/apps/inntektsmelding-service/src/main/resources/application-local.yml similarity index 74% rename from apps/inntektsmelding-service/src/main/resources/application-dev.yml rename to apps/inntektsmelding-service/src/main/resources/application-local.yml index 5d2fe16fb8b..f20e7c285ff 100644 --- a/apps/inntektsmelding-service/src/main/resources/application-dev.yml +++ b/apps/inntektsmelding-service/src/main/resources/application-local.yml @@ -1,6 +1,5 @@ -consumers: - inntektsmelding-generator-service: - url: https://testnav-inntektsmelding-generator-service.intern.dev.nav.no +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} spring: config: @@ -20,8 +19,7 @@ spring: properties: hibernate: dialect: org.hibernate.dialect.H2Dialect - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file + +consumers: + inntektsmelding-generator-service: + url: https://testnav-inntektsmelding-generator-service.intern.dev.nav.no \ No newline at end of file diff --git a/apps/inntektsmelding-service/src/main/resources/logback-spring.xml b/apps/inntektsmelding-service/src/main/resources/logback-spring.xml index 3d7fef3768d..2b8e3e07012 100644 --- a/apps/inntektsmelding-service/src/main/resources/logback-spring.xml +++ b/apps/inntektsmelding-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/jenkins-batch-status-service/src/main/resources/application-dev.yml b/apps/jenkins-batch-status-service/src/main/resources/application-local.yml similarity index 50% rename from apps/jenkins-batch-status-service/src/main/resources/application-dev.yml rename to apps/jenkins-batch-status-service/src/main/resources/application-local.yml index f1aa0058e84..a43ee99dd61 100644 --- a/apps/jenkins-batch-status-service/src/main/resources/application-dev.yml +++ b/apps/jenkins-batch-status-service/src/main/resources/application-local.yml @@ -1,15 +1,11 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + spring: config: import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} consumers: organisasjon-bestilling-service: url: https://organisasjon-bestilling-service.intern.dev.nav.no name: organisasjon-bestilling-service - cluster: dev-gcp - namespace: dolly diff --git a/apps/jenkins-batch-status-service/src/main/resources/logback-spring.xml b/apps/jenkins-batch-status-service/src/main/resources/logback-spring.xml index e7a32604657..19a53d24c89 100644 --- a/apps/jenkins-batch-status-service/src/main/resources/logback-spring.xml +++ b/apps/jenkins-batch-status-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/joark-dokument-service/src/main/resources/application-dev.yml b/apps/joark-dokument-service/src/main/resources/application-dev.yml deleted file mode 100644 index bea43da510a..00000000000 --- a/apps/joark-dokument-service/src/main/resources/application-dev.yml +++ /dev/null @@ -1,8 +0,0 @@ -spring: - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/apps/joark-dokument-service/src/main/resources/application-local.yml b/apps/joark-dokument-service/src/main/resources/application-local.yml new file mode 100644 index 00000000000..897ae1309cd --- /dev/null +++ b/apps/joark-dokument-service/src/main/resources/application-local.yml @@ -0,0 +1,6 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + +spring: + config: + import: "sm://" diff --git a/apps/joark-dokument-service/src/main/resources/logback-spring.xml b/apps/joark-dokument-service/src/main/resources/logback-spring.xml index 7309420d4fd..7573f10edb7 100644 --- a/apps/joark-dokument-service/src/main/resources/logback-spring.xml +++ b/apps/joark-dokument-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/kodeverk-service/src/main/resources/application-dev.yml b/apps/kodeverk-service/src/main/resources/application-dev.yml deleted file mode 100644 index bea43da510a..00000000000 --- a/apps/kodeverk-service/src/main/resources/application-dev.yml +++ /dev/null @@ -1,8 +0,0 @@ -spring: - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/apps/kodeverk-service/src/main/resources/application-local.yml b/apps/kodeverk-service/src/main/resources/application-local.yml new file mode 100644 index 00000000000..897ae1309cd --- /dev/null +++ b/apps/kodeverk-service/src/main/resources/application-local.yml @@ -0,0 +1,6 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + +spring: + config: + import: "sm://" diff --git a/apps/kodeverk-service/src/main/resources/logback-spring.xml b/apps/kodeverk-service/src/main/resources/logback-spring.xml index 7b0b3b1cca1..7185afb4ac0 100644 --- a/apps/kodeverk-service/src/main/resources/logback-spring.xml +++ b/apps/kodeverk-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/levende-arbeidsforhold-ansettelse/src/main/resources/application-dev.yml b/apps/levende-arbeidsforhold-ansettelse/src/main/resources/application-local.yml similarity index 79% rename from apps/levende-arbeidsforhold-ansettelse/src/main/resources/application-dev.yml rename to apps/levende-arbeidsforhold-ansettelse/src/main/resources/application-local.yml index 3fab1d15b70..f595e996a5c 100644 --- a/apps/levende-arbeidsforhold-ansettelse/src/main/resources/application-dev.yml +++ b/apps/levende-arbeidsforhold-ansettelse/src/main/resources/application-local.yml @@ -1,3 +1,5 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} spring: config: @@ -10,7 +12,6 @@ spring: url: jdbc:h2:mem:testdb username: sa password: - driverClassName: org.h2.Driver flyway: # InMemmory database url: jdbc:postgresql://localhost:5432/testnav-levende-arbeidsforhold @@ -20,11 +21,6 @@ spring: url: r2dbc:postgresql://localhost:5432/testnav-levende-arbeidsforhold username: ${NAV_USERNAME} password: - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} sql: init: mode: always diff --git a/apps/levende-arbeidsforhold-ansettelse/src/main/resources/logback-spring.xml b/apps/levende-arbeidsforhold-ansettelse/src/main/resources/logback-spring.xml index 7feaa817ab0..b8d3ffda284 100644 --- a/apps/levende-arbeidsforhold-ansettelse/src/main/resources/logback-spring.xml +++ b/apps/levende-arbeidsforhold-ansettelse/src/main/resources/logback-spring.xml @@ -13,7 +13,7 @@ - + diff --git a/apps/levende-arbeidsforhold-scheduler/src/main/resources/application-dev.yml b/apps/levende-arbeidsforhold-scheduler/src/main/resources/application-local.yml similarity index 52% rename from apps/levende-arbeidsforhold-scheduler/src/main/resources/application-dev.yml rename to apps/levende-arbeidsforhold-scheduler/src/main/resources/application-local.yml index 1aaf694b9f8..cd7fef63722 100644 --- a/apps/levende-arbeidsforhold-scheduler/src/main/resources/application-dev.yml +++ b/apps/levende-arbeidsforhold-scheduler/src/main/resources/application-local.yml @@ -1,11 +1,9 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + spring: config: import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} consumers: levende-arbeidsforhold-ansettelse: diff --git a/apps/levende-arbeidsforhold-scheduler/src/main/resources/logback-spring.xml b/apps/levende-arbeidsforhold-scheduler/src/main/resources/logback-spring.xml index 5f39b7c7b9b..cf6f9f54728 100644 --- a/apps/levende-arbeidsforhold-scheduler/src/main/resources/logback-spring.xml +++ b/apps/levende-arbeidsforhold-scheduler/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/levende-arbeidsforhold-service/src/main/resources/application-dev.yml b/apps/levende-arbeidsforhold-service/src/main/resources/application-dev.yml deleted file mode 100644 index b2f3d1346f0..00000000000 --- a/apps/levende-arbeidsforhold-service/src/main/resources/application-dev.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} - -kafka: - group-id: testnav-levende-arbeidsforhold-service diff --git a/apps/levende-arbeidsforhold-service/src/main/resources/application-local.yml b/apps/levende-arbeidsforhold-service/src/main/resources/application-local.yml new file mode 100644 index 00000000000..d33808ad24a --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/resources/application-local.yml @@ -0,0 +1,9 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + +spring: + config: + import: "sm://" + +kafka: + group-id: testnav-levende-arbeidsforhold-service diff --git a/apps/levende-arbeidsforhold-service/src/main/resources/logback-spring.xml b/apps/levende-arbeidsforhold-service/src/main/resources/logback-spring.xml index 5f39b7c7b9b..cf6f9f54728 100644 --- a/apps/levende-arbeidsforhold-service/src/main/resources/logback-spring.xml +++ b/apps/levende-arbeidsforhold-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/miljoer-service/src/main/resources/application-dev.yml b/apps/miljoer-service/src/main/resources/application-dev.yml deleted file mode 100644 index bea43da510a..00000000000 --- a/apps/miljoer-service/src/main/resources/application-dev.yml +++ /dev/null @@ -1,8 +0,0 @@ -spring: - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/apps/miljoer-service/src/main/resources/application-local.yml b/apps/miljoer-service/src/main/resources/application-local.yml new file mode 100644 index 00000000000..897ae1309cd --- /dev/null +++ b/apps/miljoer-service/src/main/resources/application-local.yml @@ -0,0 +1,6 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + +spring: + config: + import: "sm://" diff --git a/apps/miljoer-service/src/main/resources/logback-spring.xml b/apps/miljoer-service/src/main/resources/logback-spring.xml index 7309420d4fd..7573f10edb7 100644 --- a/apps/miljoer-service/src/main/resources/logback-spring.xml +++ b/apps/miljoer-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/oppsummeringsdokument-service/src/main/resources/application-dev.yml b/apps/oppsummeringsdokument-service/src/main/resources/application-local.yml similarity index 98% rename from apps/oppsummeringsdokument-service/src/main/resources/application-dev.yml rename to apps/oppsummeringsdokument-service/src/main/resources/application-local.yml index 63a8d41d38e..64119eb026f 100644 --- a/apps/oppsummeringsdokument-service/src/main/resources/application-dev.yml +++ b/apps/oppsummeringsdokument-service/src/main/resources/application-local.yml @@ -1,4 +1,3 @@ - open: search: index: local diff --git a/apps/oppsummeringsdokument-service/src/main/resources/logback-spring.xml b/apps/oppsummeringsdokument-service/src/main/resources/logback-spring.xml index 2b9ec4cb86b..2388e84a184 100644 --- a/apps/oppsummeringsdokument-service/src/main/resources/logback-spring.xml +++ b/apps/oppsummeringsdokument-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/organisasjon-bestilling-service/src/main/resources/application-dev.yml b/apps/organisasjon-bestilling-service/src/main/resources/application-dev.yml deleted file mode 100644 index c56790d0bd9..00000000000 --- a/apps/organisasjon-bestilling-service/src/main/resources/application-dev.yml +++ /dev/null @@ -1,28 +0,0 @@ - -spring: - config: - import: "sm://" - h2: - console: - enabled: true - path: /h2 - flyway: - enabled: true - datasource: - url: jdbc:h2:mem:testdb - username: sa - password: - driverClassName: org.h2.Driver - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} - sql: - init: - mode: always - data-locations: classpath:/db/dev/h2-init-db.sql - jpa: - properties: - hibernate: - dialect: org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/apps/organisasjon-bestilling-service/src/main/resources/application-local.yml b/apps/organisasjon-bestilling-service/src/main/resources/application-local.yml new file mode 100644 index 00000000000..e99f0053156 --- /dev/null +++ b/apps/organisasjon-bestilling-service/src/main/resources/application-local.yml @@ -0,0 +1,20 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + +spring: + config: + import: "sm://" + h2: + console: + enabled: true + path: /h2 + flyway: + enabled: true + datasource: + url: jdbc:h2:mem:testdb + username: sa + password: + sql: + init: + mode: always + data-locations: classpath:/db/dev/h2-init-db.sql \ No newline at end of file diff --git a/apps/organisasjon-bestilling-service/src/main/resources/logback-spring.xml b/apps/organisasjon-bestilling-service/src/main/resources/logback-spring.xml index e7a32604657..19a53d24c89 100644 --- a/apps/organisasjon-bestilling-service/src/main/resources/logback-spring.xml +++ b/apps/organisasjon-bestilling-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/organisasjon-faste-data-service/src/main/resources/application-dev.yml b/apps/organisasjon-faste-data-service/src/main/resources/application-dev.yml deleted file mode 100644 index f1f72efbd09..00000000000 --- a/apps/organisasjon-faste-data-service/src/main/resources/application-dev.yml +++ /dev/null @@ -1,24 +0,0 @@ - -spring: - config: - import: "sm://" - h2: - console: - enabled: true - path: /h2 - flyway: - enabled: true - datasource: - url: jdbc:h2:mem:testdb?useUnicode=yes&characterEncoding=UTF-8 - username: sa - password: - driverClassName: org.h2.Driver - jpa: - properties: - hibernate: - dialect: org.hibernate.dialect.H2Dialect - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/apps/organisasjon-faste-data-service/src/main/resources/application-local.yml b/apps/organisasjon-faste-data-service/src/main/resources/application-local.yml new file mode 100644 index 00000000000..fdba653f095 --- /dev/null +++ b/apps/organisasjon-faste-data-service/src/main/resources/application-local.yml @@ -0,0 +1,16 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + +spring: + config: + import: "sm://" + h2: + console: + enabled: true + path: /h2 + flyway: + enabled: true + datasource: + url: jdbc:h2:mem:testdb?useUnicode=yes&characterEncoding=UTF-8 + username: sa + password: \ No newline at end of file diff --git a/apps/organisasjon-faste-data-service/src/main/resources/logback-spring.xml b/apps/organisasjon-faste-data-service/src/main/resources/logback-spring.xml index e7a32604657..19a53d24c89 100644 --- a/apps/organisasjon-faste-data-service/src/main/resources/logback-spring.xml +++ b/apps/organisasjon-faste-data-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/organisasjon-forvalter/src/main/resources/application-local.yml b/apps/organisasjon-forvalter/src/main/resources/application-local.yml index 52c41656e48..4fbf4a1b9bf 100644 --- a/apps/organisasjon-forvalter/src/main/resources/application-local.yml +++ b/apps/organisasjon-forvalter/src/main/resources/application-local.yml @@ -1,3 +1,6 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + spring: config: import: "sm://" @@ -5,11 +8,6 @@ spring: url: jdbc:postgresql://localhost:5432/testnav-organisasjon-forvalter-local username: testnav-organisasjon-forvalter-local password: ${sm://testnav-organisasjon-forvalter-local} - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} consumers: generer-navn-service: @@ -23,4 +21,4 @@ consumers: testnav-organisasjon-service: url: https://testnav-organisasjon-service.intern.dev.nav.no testnav-miljoer-service: - url: https://testnav-miljoer-service.intern.dev.nav.no \ No newline at end of file + url: https://testnav-miljoer-service.intern.dev.nav.no diff --git a/apps/organisasjon-mottak-service/src/main/resources/application-dev.yml b/apps/organisasjon-mottak-service/src/main/resources/application-local.yml similarity index 61% rename from apps/organisasjon-mottak-service/src/main/resources/application-dev.yml rename to apps/organisasjon-mottak-service/src/main/resources/application-local.yml index ff1273cc8cc..143b32c27b6 100644 --- a/apps/organisasjon-mottak-service/src/main/resources/application-dev.yml +++ b/apps/organisasjon-mottak-service/src/main/resources/application-local.yml @@ -1,11 +1,9 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + spring: config: import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} consumers: jenkins-batch-status-service: diff --git a/apps/organisasjon-mottak-service/src/main/resources/logback-spring.xml b/apps/organisasjon-mottak-service/src/main/resources/logback-spring.xml index 6e928942d90..c6f5a93ab27 100644 --- a/apps/organisasjon-mottak-service/src/main/resources/logback-spring.xml +++ b/apps/organisasjon-mottak-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/organisasjon-service/src/main/resources/application-dev.yml b/apps/organisasjon-service/src/main/resources/application-dev.yml deleted file mode 100644 index bea43da510a..00000000000 --- a/apps/organisasjon-service/src/main/resources/application-dev.yml +++ /dev/null @@ -1,8 +0,0 @@ -spring: - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/apps/organisasjon-service/src/main/resources/application-local.yml b/apps/organisasjon-service/src/main/resources/application-local.yml new file mode 100644 index 00000000000..897ae1309cd --- /dev/null +++ b/apps/organisasjon-service/src/main/resources/application-local.yml @@ -0,0 +1,6 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + +spring: + config: + import: "sm://" diff --git a/apps/organisasjon-service/src/main/resources/logback-spring.xml b/apps/organisasjon-service/src/main/resources/logback-spring.xml index 3d7fef3768d..2b8e3e07012 100644 --- a/apps/organisasjon-service/src/main/resources/logback-spring.xml +++ b/apps/organisasjon-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/organisasjon-tilgang-service/src/main/resources/application-local.yml b/apps/organisasjon-tilgang-service/src/main/resources/application-local.yml index 3ab69be9150..e6debad7f2a 100644 --- a/apps/organisasjon-tilgang-service/src/main/resources/application-local.yml +++ b/apps/organisasjon-tilgang-service/src/main/resources/application-local.yml @@ -1,13 +1,12 @@ -TOKEN_X_ISSUER: dummy - +ALTINN_API_KEY: dummy ALTINN_URL: https://tt02.altinn.no - -altinn.api.key: dummy - +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} MASKINPORTEN_CLIENT_ID: dummy MASKINPORTEN_CLIENT_JWK: dummy MASKINPORTEN_SCOPES: dummy MASKINPORTEN_WELL_KNOWN_URL: dummy +TOKEN_X_ISSUER: dummy spring: config: @@ -16,8 +15,3 @@ spring: url: jdbc:h2:mem:testdb username: sa password: - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/apps/orgnummer-service/src/main/resources/application-dev.yml b/apps/orgnummer-service/src/main/resources/application-local.yml similarity index 72% rename from apps/orgnummer-service/src/main/resources/application-dev.yml rename to apps/orgnummer-service/src/main/resources/application-local.yml index 4e86cc4cf3c..db96ea8dea6 100644 --- a/apps/orgnummer-service/src/main/resources/application-dev.yml +++ b/apps/orgnummer-service/src/main/resources/application-local.yml @@ -1,3 +1,5 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} spring: config: @@ -10,16 +12,10 @@ spring: url: jdbc:h2:mem:testdb?useUnicode=yes&characterEncoding=UTF-8 username: sa password: - driverClassName: org.h2.Driver jpa: properties: hibernate: dialect: org.hibernate.dialect.H2Dialect - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} consumers: testnav-organisasjon-service: diff --git a/apps/orgnummer-service/src/main/resources/logback-spring.xml b/apps/orgnummer-service/src/main/resources/logback-spring.xml index 7b0b3b1cca1..7185afb4ac0 100644 --- a/apps/orgnummer-service/src/main/resources/logback-spring.xml +++ b/apps/orgnummer-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/oversikt-frontend/src/main/resources/application-dev.yml b/apps/oversikt-frontend/src/main/resources/application-local.yml similarity index 77% rename from apps/oversikt-frontend/src/main/resources/application-dev.yml rename to apps/oversikt-frontend/src/main/resources/application-local.yml index 86865e8d705..f186349ca25 100644 --- a/apps/oversikt-frontend/src/main/resources/application-dev.yml +++ b/apps/oversikt-frontend/src/main/resources/application-local.yml @@ -1,3 +1,5 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} TOKEN_X_ISSUER: dummy server: @@ -6,11 +8,6 @@ server: spring: config: import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} consumers: testnorge-profil-api: diff --git a/apps/oversikt-frontend/src/main/resources/logback-spring.xml b/apps/oversikt-frontend/src/main/resources/logback-spring.xml index f874dcc44c1..ae836bf1b11 100644 --- a/apps/oversikt-frontend/src/main/resources/logback-spring.xml +++ b/apps/oversikt-frontend/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/pdl-forvalter/src/main/resources/application-dev.yaml b/apps/pdl-forvalter/src/main/resources/application-dev.yml similarity index 100% rename from apps/pdl-forvalter/src/main/resources/application-dev.yaml rename to apps/pdl-forvalter/src/main/resources/application-dev.yml diff --git a/apps/pdl-forvalter/src/main/resources/application-local.yaml b/apps/pdl-forvalter/src/main/resources/application-local.yml similarity index 82% rename from apps/pdl-forvalter/src/main/resources/application-local.yaml rename to apps/pdl-forvalter/src/main/resources/application-local.yml index 4f89efa5869..8f283cdd847 100644 --- a/apps/pdl-forvalter/src/main/resources/application-local.yaml +++ b/apps/pdl-forvalter/src/main/resources/application-local.yml @@ -1,3 +1,6 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + spring: config: import: "sm://" @@ -5,11 +8,6 @@ spring: url: jdbc:postgresql://localhost:5432/testnav-pdl-forvalter-local username: testnav-pdl-forvalter-local password: ${sm://testnav-pdl-forvalter-local} - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} consumers: adresse-service: diff --git a/apps/pdl-forvalter/src/main/resources/application-prod.yaml b/apps/pdl-forvalter/src/main/resources/application-prod.yml similarity index 100% rename from apps/pdl-forvalter/src/main/resources/application-prod.yaml rename to apps/pdl-forvalter/src/main/resources/application-prod.yml diff --git a/apps/pdl-forvalter/src/main/resources/application.yaml b/apps/pdl-forvalter/src/main/resources/application.yml similarity index 100% rename from apps/pdl-forvalter/src/main/resources/application.yaml rename to apps/pdl-forvalter/src/main/resources/application.yml diff --git a/apps/person-faste-data-service/src/main/resources/application-dev.yml b/apps/person-faste-data-service/src/main/resources/application-local.yml similarity index 50% rename from apps/person-faste-data-service/src/main/resources/application-dev.yml rename to apps/person-faste-data-service/src/main/resources/application-local.yml index a4ca1d03845..d1b7052bba3 100644 --- a/apps/person-faste-data-service/src/main/resources/application-dev.yml +++ b/apps/person-faste-data-service/src/main/resources/application-local.yml @@ -1,3 +1,5 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} spring: config: @@ -12,16 +14,6 @@ spring: url: jdbc:h2:mem:testdb?useUnicode=yes&characterEncoding=UTF-8 username: sa password: - driverClassName: org.h2.Driver - jpa: - properties: - hibernate: - dialect: org.hibernate.dialect.H2Dialect - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} testnav: config: diff --git a/apps/person-faste-data-service/src/main/resources/logback-spring.xml b/apps/person-faste-data-service/src/main/resources/logback-spring.xml index b2989b19b94..9aed9d5f0bc 100644 --- a/apps/person-faste-data-service/src/main/resources/logback-spring.xml +++ b/apps/person-faste-data-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/person-organisasjon-tilgang-service/src/main/resources/application-local.yml b/apps/person-organisasjon-tilgang-service/src/main/resources/application-local.yml index 584cb8082a4..1d0b7c93e9d 100644 --- a/apps/person-organisasjon-tilgang-service/src/main/resources/application-local.yml +++ b/apps/person-organisasjon-tilgang-service/src/main/resources/application-local.yml @@ -1,20 +1,15 @@ -ALTINN_URL: https://tt02.altinn.no - -TOKEN_X_ISSUER: dummy -OKEN_X_JWKS_URI: dummy -TOKEN_X_CLIENT_ID: dummy ALTINN_API_KEY: dummy - +ALTINN_URL: https://tt02.altinn.no +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} MASKINPORTEN_CLIENT_ID: dummy MASKINPORTEN_CLIENT_JWK: dummy MASKINPORTEN_SCOPES: dummy MASKINPORTEN_WELL_KNOWN_URL: dummy +OKEN_X_JWKS_URI: dummy +TOKEN_X_CLIENT_ID: dummy +TOKEN_X_ISSUER: dummy spring: config: import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/apps/person-search-service/src/main/resources/application-dev.yml b/apps/person-search-service/src/main/resources/application-dev.yml deleted file mode 100644 index bea43da510a..00000000000 --- a/apps/person-search-service/src/main/resources/application-dev.yml +++ /dev/null @@ -1,8 +0,0 @@ -spring: - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/apps/person-search-service/src/main/resources/application-local.yml b/apps/person-search-service/src/main/resources/application-local.yml new file mode 100644 index 00000000000..897ae1309cd --- /dev/null +++ b/apps/person-search-service/src/main/resources/application-local.yml @@ -0,0 +1,6 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + +spring: + config: + import: "sm://" diff --git a/apps/person-search-service/src/main/resources/logback-spring.xml b/apps/person-search-service/src/main/resources/logback-spring.xml index bde1862f2bc..7f81f72aa83 100644 --- a/apps/person-search-service/src/main/resources/logback-spring.xml +++ b/apps/person-search-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/person-service/src/main/resources/application-dev.yml b/apps/person-service/src/main/resources/application-dev.yml deleted file mode 100644 index bea43da510a..00000000000 --- a/apps/person-service/src/main/resources/application-dev.yml +++ /dev/null @@ -1,8 +0,0 @@ -spring: - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/apps/person-service/src/main/resources/application-local.yml b/apps/person-service/src/main/resources/application-local.yml new file mode 100644 index 00000000000..6997e9cd385 --- /dev/null +++ b/apps/person-service/src/main/resources/application-local.yml @@ -0,0 +1,6 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + +spring: + config: + import: "sm://" \ No newline at end of file diff --git a/apps/person-service/src/main/resources/logback-spring.xml b/apps/person-service/src/main/resources/logback-spring.xml index 80126b63465..a4ec4bc85cf 100644 --- a/apps/person-service/src/main/resources/logback-spring.xml +++ b/apps/person-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/profil-api/src/main/resources/application-dev.yml b/apps/profil-api/src/main/resources/application-dev.yml deleted file mode 100644 index 712e852d148..00000000000 --- a/apps/profil-api/src/main/resources/application-dev.yml +++ /dev/null @@ -1,15 +0,0 @@ -spring: - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} - -consumers: - testnav-person-organisasjon-tilgang-service: - cluster: dev-gcp - namespace: dolly - name: testnav-person-organisasjon-tilgang-service-dev - url: https://testnav-person-organisasjon-tilgang-service-dev.dev.intern.nav.no diff --git a/apps/profil-api/src/main/resources/application-local.yml b/apps/profil-api/src/main/resources/application-local.yml new file mode 100644 index 00000000000..ab2961d30c7 --- /dev/null +++ b/apps/profil-api/src/main/resources/application-local.yml @@ -0,0 +1,10 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + +spring: + config: + import: "sm://" + +consumers: + testnav-person-organisasjon-tilgang-service: + url: https://testnav-person-organisasjon-tilgang-service-dev.dev.intern.nav.no diff --git a/apps/profil-api/src/main/resources/logback-spring.xml b/apps/profil-api/src/main/resources/logback-spring.xml index 7309420d4fd..7573f10edb7 100644 --- a/apps/profil-api/src/main/resources/logback-spring.xml +++ b/apps/profil-api/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/skattekort-service/src/main/resources/application-dev.yml b/apps/skattekort-service/src/main/resources/application-dev.yml deleted file mode 100644 index bea43da510a..00000000000 --- a/apps/skattekort-service/src/main/resources/application-dev.yml +++ /dev/null @@ -1,8 +0,0 @@ -spring: - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/apps/skattekort-service/src/main/resources/application-local.yml b/apps/skattekort-service/src/main/resources/application-local.yml new file mode 100644 index 00000000000..897ae1309cd --- /dev/null +++ b/apps/skattekort-service/src/main/resources/application-local.yml @@ -0,0 +1,6 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + +spring: + config: + import: "sm://" diff --git a/apps/skattekort-service/src/main/resources/application-prod.yaml b/apps/skattekort-service/src/main/resources/application-prod.yml similarity index 100% rename from apps/skattekort-service/src/main/resources/application-prod.yaml rename to apps/skattekort-service/src/main/resources/application-prod.yml diff --git a/apps/skattekort-service/src/main/resources/application.yaml b/apps/skattekort-service/src/main/resources/application.yml similarity index 100% rename from apps/skattekort-service/src/main/resources/application.yaml rename to apps/skattekort-service/src/main/resources/application.yml diff --git a/apps/skattekort-service/src/main/resources/logback-spring.xml b/apps/skattekort-service/src/main/resources/logback-spring.xml index 0fe593266ce..5b7cdad28de 100644 --- a/apps/skattekort-service/src/main/resources/logback-spring.xml +++ b/apps/skattekort-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/sykemelding-api/src/main/resources/application-local.yml b/apps/sykemelding-api/src/main/resources/application-local.yml index e67cb424320..23b6606964a 100644 --- a/apps/sykemelding-api/src/main/resources/application-local.yml +++ b/apps/sykemelding-api/src/main/resources/application-local.yml @@ -1,3 +1,6 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + ibm: mq: queueManager: dummy @@ -16,9 +19,4 @@ consumers: spring: config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file + import: "sm://" \ No newline at end of file diff --git a/apps/synt-sykemelding-api/src/main/resources/application-local.yml b/apps/synt-sykemelding-api/src/main/resources/application-local.yml index 974482f7e91..b3521f2f369 100644 --- a/apps/synt-sykemelding-api/src/main/resources/application-local.yml +++ b/apps/synt-sykemelding-api/src/main/resources/application-local.yml @@ -1,13 +1,10 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} TOKEN_X_ISSUER: https://tokenx.dev-gcp.nav.cloud.nais.io spring: config: import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} consumers: synt-sykemelding: @@ -20,4 +17,4 @@ consumers: url: https://testnav-helsepersonell-service.intern.dev.nav.no sykemelding-api: url: https://testnav-sykemelding-api-dev.intern.dev.nav.no - name: testnav-sykemelding-api-dev \ No newline at end of file + name: testnav-sykemelding-api-dev diff --git a/apps/synt-vedtakshistorikk-service/src/main/resources/application-dev.yml b/apps/synt-vedtakshistorikk-service/src/main/resources/application-local.yml similarity index 77% rename from apps/synt-vedtakshistorikk-service/src/main/resources/application-dev.yml rename to apps/synt-vedtakshistorikk-service/src/main/resources/application-local.yml index 428a4204f6f..27f16041946 100644 --- a/apps/synt-vedtakshistorikk-service/src/main/resources/application-dev.yml +++ b/apps/synt-vedtakshistorikk-service/src/main/resources/application-local.yml @@ -1,11 +1,9 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + spring: config: import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} batch: miljoe: q2 diff --git a/apps/synt-vedtakshistorikk-service/src/main/resources/logback-spring.xml b/apps/synt-vedtakshistorikk-service/src/main/resources/logback-spring.xml index cb801609c61..80fd9d94742 100644 --- a/apps/synt-vedtakshistorikk-service/src/main/resources/logback-spring.xml +++ b/apps/synt-vedtakshistorikk-service/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/tenor-search-service/src/main/resources/application-local.yml b/apps/tenor-search-service/src/main/resources/application-local.yml index 4b2ebb35015..d3d95ce153e 100644 --- a/apps/tenor-search-service/src/main/resources/application-local.yml +++ b/apps/tenor-search-service/src/main/resources/application-local.yml @@ -1,21 +1,17 @@ -TOKEN_X_ISSUER: dummy - +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} MASKINPORTEN_CLIENT_ID: dummy MASKINPORTEN_CLIENT_JWK: dummy MASKINPORTEN_SCOPES: dummy MASKINPORTEN_WELL_KNOWN_URL: dummy +TOKEN_X_ISSUER: dummy spring: config: import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} consumers: dolly-backend: url: https://dolly-backend.intern.dev.nav.no dolly-backend-dev: - url: https://dolly-backend-dev.intern.dev.nav.no \ No newline at end of file + url: https://dolly-backend-dev.intern.dev.nav.no diff --git a/apps/testnav-ident-pool/src/main/resources/application-local.yml b/apps/testnav-ident-pool/src/main/resources/application-local.yml index e548e6ffc9e..a62687fc5ca 100644 --- a/apps/testnav-ident-pool/src/main/resources/application-local.yml +++ b/apps/testnav-ident-pool/src/main/resources/application-local.yml @@ -1,3 +1,6 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + spring: config: import: "sm://" @@ -9,12 +12,6 @@ spring: url: jdbc:h2:mem:testdb username: sa password: - driverClassName: org.h2.Driver - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} sql: init: mode: always @@ -24,4 +21,4 @@ consumers: tps: messaging: service: - url: https://testnav-tps-messaging-service.intern.dev.nav.no \ No newline at end of file + url: https://testnav-tps-messaging-service.intern.dev.nav.no diff --git a/apps/testnav-ident-pool/src/main/resources/application-prod.yaml b/apps/testnav-ident-pool/src/main/resources/application-prod.yml similarity index 100% rename from apps/testnav-ident-pool/src/main/resources/application-prod.yaml rename to apps/testnav-ident-pool/src/main/resources/application-prod.yml diff --git a/apps/testnav-ident-pool/src/main/resources/application.yaml b/apps/testnav-ident-pool/src/main/resources/application.yml similarity index 100% rename from apps/testnav-ident-pool/src/main/resources/application.yaml rename to apps/testnav-ident-pool/src/main/resources/application.yml diff --git a/apps/testnorge-statisk-data-forvalter/src/main/resources/application-local.yml b/apps/testnorge-statisk-data-forvalter/src/main/resources/application-local.yml index 990670ce6dc..5ca60787a43 100644 --- a/apps/testnorge-statisk-data-forvalter/src/main/resources/application-local.yml +++ b/apps/testnorge-statisk-data-forvalter/src/main/resources/application-local.yml @@ -1,3 +1,6 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + spring: config: import: "sm://" @@ -13,23 +16,12 @@ spring: console: enabled: true path: /h2 - jpa: - properties: - hibernate: - dialect: org.hibernate.dialect.H2Dialect - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} ereg.api: dummy -#VAULT_URL: dummy - consumers: testnav-bruker-service: name: testnav-bruker-service-dev url: https://testnav-bruker-service-dev.intern.dev.nav.no synthdata-aareg: - url: https://nais-synthdata-aareg.dev.intern.nav.no \ No newline at end of file + url: https://nais-synthdata-aareg.dev.intern.nav.no diff --git a/apps/tilbakemelding-api/src/main/resources/application-dev.yml b/apps/tilbakemelding-api/src/main/resources/application-local.yml similarity index 66% rename from apps/tilbakemelding-api/src/main/resources/application-dev.yml rename to apps/tilbakemelding-api/src/main/resources/application-local.yml index 6d22c7f56a1..a85d4316259 100644 --- a/apps/tilbakemelding-api/src/main/resources/application-dev.yml +++ b/apps/tilbakemelding-api/src/main/resources/application-local.yml @@ -5,6 +5,3 @@ SLACK_TOKEN: dummy consumers: profil-api: url: https://testnorge-profil-api.intern.dev.nav.no - cluster: dev-gcp - namespace: dolly - name: testnorge-profil-api diff --git a/apps/tilbakemelding-api/src/main/resources/logback-spring.xml b/apps/tilbakemelding-api/src/main/resources/logback-spring.xml index 7309420d4fd..7573f10edb7 100644 --- a/apps/tilbakemelding-api/src/main/resources/logback-spring.xml +++ b/apps/tilbakemelding-api/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/apps/tps-messaging-service/src/main/resources/application-local.yml b/apps/tps-messaging-service/src/main/resources/application-local.yml index 449f2fdb185..fd4511ffe20 100644 --- a/apps/tps-messaging-service/src/main/resources/application-local.yml +++ b/apps/tps-messaging-service/src/main/resources/application-local.yml @@ -1,5 +1,11 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} TOKEN_X_ISSUER: dummy +spring: + config: + import: "sm://" + config: mq: test: @@ -19,4 +25,4 @@ config: consumers: testmiljoerService: - url: https://testnav-miljoer-service.intern.dev.nav.no \ No newline at end of file + url: https://testnav-miljoer-service.intern.dev.nav.no diff --git a/apps/udi-stub/src/main/resources/application-local.yml b/apps/udi-stub/src/main/resources/application-local.yml index 655f30ef7a8..6e2eefaa874 100644 --- a/apps/udi-stub/src/main/resources/application-local.yml +++ b/apps/udi-stub/src/main/resources/application-local.yml @@ -1,7 +1,12 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + spring: cloud: vault: enabled: false + config: + import: "sm://" datasource: hikari: maximum-pool-size: 3 diff --git a/apps/varslinger-service/src/main/resources/application-local.yml b/apps/varslinger-service/src/main/resources/application-local.yml index d3b9d76b55c..0e326499a15 100644 --- a/apps/varslinger-service/src/main/resources/application-local.yml +++ b/apps/varslinger-service/src/main/resources/application-local.yml @@ -1,3 +1,5 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} spring: config: @@ -12,15 +14,8 @@ spring: url: jdbc:h2:mem:testdb?useUnicode=yes&characterEncoding=UTF-8 username: sa password: - driverClassName: org.h2.Driver - jpa: - properties: - hibernate: - dialect: org.hibernate.dialect.H2Dialect security: oauth2: resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} tokenx: accepted-audience: dev-gcp:dolly:testnav-varslinger-service-dev diff --git a/docs/compose.yaml b/docs/compose.yml similarity index 100% rename from docs/compose.yaml rename to docs/compose.yml diff --git a/libs/security-core/src/main/java/no/nav/testnav/libs/securitycore/domain/azuread/AzureNavClientCredential.java b/libs/security-core/src/main/java/no/nav/testnav/libs/securitycore/domain/azuread/AzureNavClientCredential.java index f01de4e0e94..f7bbf72b012 100644 --- a/libs/security-core/src/main/java/no/nav/testnav/libs/securitycore/domain/azuread/AzureNavClientCredential.java +++ b/libs/security-core/src/main/java/no/nav/testnav/libs/securitycore/domain/azuread/AzureNavClientCredential.java @@ -7,9 +7,10 @@ public class AzureNavClientCredential extends ClientCredential { public AzureNavClientCredential( - @Value("${azure.app.client.id:#{null}}") String clientId, - @Value("${azure.app.client.secret:#{null}}") String clientSecret + @Value("${AZURE_APP_CLIENT_ID:#{null}}") String clientId, + @Value("${AZURE_APP_CLIENT_SECRET:#{null}}") String clientSecret ) { super(clientId, clientSecret); } + } diff --git a/proxies/aareg-proxy/src/main/resources/application-local.yaml b/proxies/aareg-proxy/src/main/resources/application-local.yml similarity index 54% rename from proxies/aareg-proxy/src/main/resources/application-local.yaml rename to proxies/aareg-proxy/src/main/resources/application-local.yml index 8cfb4ce9a21..e36c5e44fa2 100644 --- a/proxies/aareg-proxy/src/main/resources/application-local.yaml +++ b/proxies/aareg-proxy/src/main/resources/application-local.yml @@ -1,13 +1,10 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} TOKEN_X_ISSUER: dummy spring: config: import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} management: endpoint: diff --git a/proxies/aareg-proxy/src/main/resources/application.yaml b/proxies/aareg-proxy/src/main/resources/application.yml similarity index 100% rename from proxies/aareg-proxy/src/main/resources/application.yaml rename to proxies/aareg-proxy/src/main/resources/application.yml diff --git a/proxies/aareg-synt-services-proxy/src/main/resources/application-dev.yml b/proxies/aareg-synt-services-proxy/src/main/resources/application-dev.yml deleted file mode 100644 index 0f24d85a8e2..00000000000 --- a/proxies/aareg-synt-services-proxy/src/main/resources/application-dev.yml +++ /dev/null @@ -1,14 +0,0 @@ -TOKEN_X_ISSUER: dummy - -spring: - cloud: - gcp: - secretmanager: - enabled: true - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/proxies/aareg-synt-services-proxy/src/main/resources/application-local.yml b/proxies/aareg-synt-services-proxy/src/main/resources/application-local.yml new file mode 100644 index 00000000000..7c09739eb91 --- /dev/null +++ b/proxies/aareg-synt-services-proxy/src/main/resources/application-local.yml @@ -0,0 +1,11 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} +TOKEN_X_ISSUER: dummy + +spring: + cloud: + gcp: + secretmanager: + enabled: true + config: + import: "sm://" \ No newline at end of file diff --git a/proxies/aareg-synt-services-proxy/src/main/resources/logback-spring.xml b/proxies/aareg-synt-services-proxy/src/main/resources/logback-spring.xml index f874dcc44c1..ae836bf1b11 100644 --- a/proxies/aareg-synt-services-proxy/src/main/resources/logback-spring.xml +++ b/proxies/aareg-synt-services-proxy/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/proxies/arbeidsplassencv-proxy/src/main/resources/application-dev.yml b/proxies/arbeidsplassencv-proxy/src/main/resources/application-dev.yml deleted file mode 100644 index 0f24d85a8e2..00000000000 --- a/proxies/arbeidsplassencv-proxy/src/main/resources/application-dev.yml +++ /dev/null @@ -1,14 +0,0 @@ -TOKEN_X_ISSUER: dummy - -spring: - cloud: - gcp: - secretmanager: - enabled: true - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/proxies/arbeidsplassencv-proxy/src/main/resources/application-local.yml b/proxies/arbeidsplassencv-proxy/src/main/resources/application-local.yml new file mode 100644 index 00000000000..7c09739eb91 --- /dev/null +++ b/proxies/arbeidsplassencv-proxy/src/main/resources/application-local.yml @@ -0,0 +1,11 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} +TOKEN_X_ISSUER: dummy + +spring: + cloud: + gcp: + secretmanager: + enabled: true + config: + import: "sm://" \ No newline at end of file diff --git a/proxies/arbeidsplassencv-proxy/src/main/resources/logback-spring.xml b/proxies/arbeidsplassencv-proxy/src/main/resources/logback-spring.xml index 3196c68e393..2c8e6560458 100644 --- a/proxies/arbeidsplassencv-proxy/src/main/resources/logback-spring.xml +++ b/proxies/arbeidsplassencv-proxy/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/proxies/arena-forvalteren-proxy/src/main/resources/application-dev.yml b/proxies/arena-forvalteren-proxy/src/main/resources/application-dev.yml deleted file mode 100644 index 0f24d85a8e2..00000000000 --- a/proxies/arena-forvalteren-proxy/src/main/resources/application-dev.yml +++ /dev/null @@ -1,14 +0,0 @@ -TOKEN_X_ISSUER: dummy - -spring: - cloud: - gcp: - secretmanager: - enabled: true - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/proxies/arena-forvalteren-proxy/src/main/resources/application-local.yml b/proxies/arena-forvalteren-proxy/src/main/resources/application-local.yml new file mode 100644 index 00000000000..7c09739eb91 --- /dev/null +++ b/proxies/arena-forvalteren-proxy/src/main/resources/application-local.yml @@ -0,0 +1,11 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} +TOKEN_X_ISSUER: dummy + +spring: + cloud: + gcp: + secretmanager: + enabled: true + config: + import: "sm://" \ No newline at end of file diff --git a/proxies/arena-forvalteren-proxy/src/main/resources/logback-spring.xml b/proxies/arena-forvalteren-proxy/src/main/resources/logback-spring.xml index f874dcc44c1..ae836bf1b11 100644 --- a/proxies/arena-forvalteren-proxy/src/main/resources/logback-spring.xml +++ b/proxies/arena-forvalteren-proxy/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/proxies/batch-adeo-proxy/src/main/resources/application-dev.yml b/proxies/batch-adeo-proxy/src/main/resources/application-dev.yml deleted file mode 100644 index 0f24d85a8e2..00000000000 --- a/proxies/batch-adeo-proxy/src/main/resources/application-dev.yml +++ /dev/null @@ -1,14 +0,0 @@ -TOKEN_X_ISSUER: dummy - -spring: - cloud: - gcp: - secretmanager: - enabled: true - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/proxies/batch-adeo-proxy/src/main/resources/application-local.yml b/proxies/batch-adeo-proxy/src/main/resources/application-local.yml new file mode 100644 index 00000000000..7c09739eb91 --- /dev/null +++ b/proxies/batch-adeo-proxy/src/main/resources/application-local.yml @@ -0,0 +1,11 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} +TOKEN_X_ISSUER: dummy + +spring: + cloud: + gcp: + secretmanager: + enabled: true + config: + import: "sm://" \ No newline at end of file diff --git a/proxies/batch-adeo-proxy/src/main/resources/logback-spring.xml b/proxies/batch-adeo-proxy/src/main/resources/logback-spring.xml index f874dcc44c1..ae836bf1b11 100644 --- a/proxies/batch-adeo-proxy/src/main/resources/logback-spring.xml +++ b/proxies/batch-adeo-proxy/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/proxies/brregstub-proxy/src/main/resources/application-dev.yml b/proxies/brregstub-proxy/src/main/resources/application-dev.yml deleted file mode 100644 index 0f24d85a8e2..00000000000 --- a/proxies/brregstub-proxy/src/main/resources/application-dev.yml +++ /dev/null @@ -1,14 +0,0 @@ -TOKEN_X_ISSUER: dummy - -spring: - cloud: - gcp: - secretmanager: - enabled: true - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/proxies/brregstub-proxy/src/main/resources/application-local.yml b/proxies/brregstub-proxy/src/main/resources/application-local.yml new file mode 100644 index 00000000000..7c09739eb91 --- /dev/null +++ b/proxies/brregstub-proxy/src/main/resources/application-local.yml @@ -0,0 +1,11 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} +TOKEN_X_ISSUER: dummy + +spring: + cloud: + gcp: + secretmanager: + enabled: true + config: + import: "sm://" \ No newline at end of file diff --git a/proxies/brregstub-proxy/src/main/resources/logback-spring.xml b/proxies/brregstub-proxy/src/main/resources/logback-spring.xml index f874dcc44c1..ae836bf1b11 100644 --- a/proxies/brregstub-proxy/src/main/resources/logback-spring.xml +++ b/proxies/brregstub-proxy/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/proxies/dokarkiv-proxy/src/main/resources/application-dev.yml b/proxies/dokarkiv-proxy/src/main/resources/application-dev.yml deleted file mode 100644 index 19dd01a26ed..00000000000 --- a/proxies/dokarkiv-proxy/src/main/resources/application-dev.yml +++ /dev/null @@ -1,15 +0,0 @@ -TOKEN_X_CLIENT_ID: dev-gcp:dolly:testnav-dokarkiv-proxy -TOKEN_X_ISSUER: dummy - -spring: - cloud: - gcp: - secretmanager: - enabled: true - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/proxies/dokarkiv-proxy/src/main/resources/application-local.yml b/proxies/dokarkiv-proxy/src/main/resources/application-local.yml new file mode 100644 index 00000000000..3949ecdfc49 --- /dev/null +++ b/proxies/dokarkiv-proxy/src/main/resources/application-local.yml @@ -0,0 +1,12 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} +TOKEN_X_CLIENT_ID: dev-gcp:dolly:testnav-dokarkiv-proxy +TOKEN_X_ISSUER: dummy + +spring: + cloud: + gcp: + secretmanager: + enabled: true + config: + import: "sm://" \ No newline at end of file diff --git a/proxies/dokarkiv-proxy/src/main/resources/logback-spring.xml b/proxies/dokarkiv-proxy/src/main/resources/logback-spring.xml index f874dcc44c1..ae836bf1b11 100644 --- a/proxies/dokarkiv-proxy/src/main/resources/logback-spring.xml +++ b/proxies/dokarkiv-proxy/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/proxies/ereg-proxy/src/main/resources/application-dev.yml b/proxies/ereg-proxy/src/main/resources/application-dev.yml deleted file mode 100644 index 0f24d85a8e2..00000000000 --- a/proxies/ereg-proxy/src/main/resources/application-dev.yml +++ /dev/null @@ -1,14 +0,0 @@ -TOKEN_X_ISSUER: dummy - -spring: - cloud: - gcp: - secretmanager: - enabled: true - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/proxies/ereg-proxy/src/main/resources/application-local.yml b/proxies/ereg-proxy/src/main/resources/application-local.yml new file mode 100644 index 00000000000..7c09739eb91 --- /dev/null +++ b/proxies/ereg-proxy/src/main/resources/application-local.yml @@ -0,0 +1,11 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} +TOKEN_X_ISSUER: dummy + +spring: + cloud: + gcp: + secretmanager: + enabled: true + config: + import: "sm://" \ No newline at end of file diff --git a/proxies/ereg-proxy/src/main/resources/logback-spring.xml b/proxies/ereg-proxy/src/main/resources/logback-spring.xml index f874dcc44c1..ae836bf1b11 100644 --- a/proxies/ereg-proxy/src/main/resources/logback-spring.xml +++ b/proxies/ereg-proxy/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/proxies/fullmakt-proxy/src/main/resources/application-local.yml b/proxies/fullmakt-proxy/src/main/resources/application-local.yml index 0f24d85a8e2..7c09739eb91 100644 --- a/proxies/fullmakt-proxy/src/main/resources/application-local.yml +++ b/proxies/fullmakt-proxy/src/main/resources/application-local.yml @@ -1,3 +1,5 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} TOKEN_X_ISSUER: dummy spring: @@ -6,9 +8,4 @@ spring: secretmanager: enabled: true config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file + import: "sm://" \ No newline at end of file diff --git a/proxies/histark-proxy/src/main/resources/application-dev.yml b/proxies/histark-proxy/src/main/resources/application-dev.yml deleted file mode 100644 index 0f24d85a8e2..00000000000 --- a/proxies/histark-proxy/src/main/resources/application-dev.yml +++ /dev/null @@ -1,14 +0,0 @@ -TOKEN_X_ISSUER: dummy - -spring: - cloud: - gcp: - secretmanager: - enabled: true - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/proxies/histark-proxy/src/main/resources/application-local.yml b/proxies/histark-proxy/src/main/resources/application-local.yml new file mode 100644 index 00000000000..7c09739eb91 --- /dev/null +++ b/proxies/histark-proxy/src/main/resources/application-local.yml @@ -0,0 +1,11 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} +TOKEN_X_ISSUER: dummy + +spring: + cloud: + gcp: + secretmanager: + enabled: true + config: + import: "sm://" \ No newline at end of file diff --git a/proxies/histark-proxy/src/main/resources/logback-spring.xml b/proxies/histark-proxy/src/main/resources/logback-spring.xml index f874dcc44c1..ae836bf1b11 100644 --- a/proxies/histark-proxy/src/main/resources/logback-spring.xml +++ b/proxies/histark-proxy/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/proxies/inntektstub-proxy/src/main/resources/application-dev.yml b/proxies/inntektstub-proxy/src/main/resources/application-dev.yml deleted file mode 100644 index 0f24d85a8e2..00000000000 --- a/proxies/inntektstub-proxy/src/main/resources/application-dev.yml +++ /dev/null @@ -1,14 +0,0 @@ -TOKEN_X_ISSUER: dummy - -spring: - cloud: - gcp: - secretmanager: - enabled: true - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/proxies/inntektstub-proxy/src/main/resources/application-local.yml b/proxies/inntektstub-proxy/src/main/resources/application-local.yml new file mode 100644 index 00000000000..7c09739eb91 --- /dev/null +++ b/proxies/inntektstub-proxy/src/main/resources/application-local.yml @@ -0,0 +1,11 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} +TOKEN_X_ISSUER: dummy + +spring: + cloud: + gcp: + secretmanager: + enabled: true + config: + import: "sm://" \ No newline at end of file diff --git a/proxies/inntektstub-proxy/src/main/resources/logback-spring.xml b/proxies/inntektstub-proxy/src/main/resources/logback-spring.xml index b2989b19b94..9aed9d5f0bc 100644 --- a/proxies/inntektstub-proxy/src/main/resources/logback-spring.xml +++ b/proxies/inntektstub-proxy/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/proxies/inst-proxy/src/main/resources/application-dev.yml b/proxies/inst-proxy/src/main/resources/application-dev.yml deleted file mode 100644 index 0f24d85a8e2..00000000000 --- a/proxies/inst-proxy/src/main/resources/application-dev.yml +++ /dev/null @@ -1,14 +0,0 @@ -TOKEN_X_ISSUER: dummy - -spring: - cloud: - gcp: - secretmanager: - enabled: true - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/proxies/inst-proxy/src/main/resources/application-local.yml b/proxies/inst-proxy/src/main/resources/application-local.yml new file mode 100644 index 00000000000..7c09739eb91 --- /dev/null +++ b/proxies/inst-proxy/src/main/resources/application-local.yml @@ -0,0 +1,11 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} +TOKEN_X_ISSUER: dummy + +spring: + cloud: + gcp: + secretmanager: + enabled: true + config: + import: "sm://" \ No newline at end of file diff --git a/proxies/inst-proxy/src/main/resources/logback-spring.xml b/proxies/inst-proxy/src/main/resources/logback-spring.xml index f874dcc44c1..ae836bf1b11 100644 --- a/proxies/inst-proxy/src/main/resources/logback-spring.xml +++ b/proxies/inst-proxy/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/proxies/kontoregister-person-proxy/src/main/resources/application-dev.yml b/proxies/kontoregister-person-proxy/src/main/resources/application-dev.yml deleted file mode 100644 index 0f24d85a8e2..00000000000 --- a/proxies/kontoregister-person-proxy/src/main/resources/application-dev.yml +++ /dev/null @@ -1,14 +0,0 @@ -TOKEN_X_ISSUER: dummy - -spring: - cloud: - gcp: - secretmanager: - enabled: true - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/proxies/kontoregister-person-proxy/src/main/resources/application-local.yml b/proxies/kontoregister-person-proxy/src/main/resources/application-local.yml new file mode 100644 index 00000000000..7c09739eb91 --- /dev/null +++ b/proxies/kontoregister-person-proxy/src/main/resources/application-local.yml @@ -0,0 +1,11 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} +TOKEN_X_ISSUER: dummy + +spring: + cloud: + gcp: + secretmanager: + enabled: true + config: + import: "sm://" \ No newline at end of file diff --git a/proxies/kontoregister-person-proxy/src/main/resources/logback-spring.xml b/proxies/kontoregister-person-proxy/src/main/resources/logback-spring.xml index ecf519e83b1..d2c0307816e 100644 --- a/proxies/kontoregister-person-proxy/src/main/resources/logback-spring.xml +++ b/proxies/kontoregister-person-proxy/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/proxies/krrstub-proxy/src/main/resources/application-dev.yml b/proxies/krrstub-proxy/src/main/resources/application-dev.yml deleted file mode 100644 index 0f24d85a8e2..00000000000 --- a/proxies/krrstub-proxy/src/main/resources/application-dev.yml +++ /dev/null @@ -1,14 +0,0 @@ -TOKEN_X_ISSUER: dummy - -spring: - cloud: - gcp: - secretmanager: - enabled: true - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/proxies/krrstub-proxy/src/main/resources/application-local.yml b/proxies/krrstub-proxy/src/main/resources/application-local.yml new file mode 100644 index 00000000000..7c09739eb91 --- /dev/null +++ b/proxies/krrstub-proxy/src/main/resources/application-local.yml @@ -0,0 +1,11 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} +TOKEN_X_ISSUER: dummy + +spring: + cloud: + gcp: + secretmanager: + enabled: true + config: + import: "sm://" \ No newline at end of file diff --git a/proxies/krrstub-proxy/src/main/resources/logback-spring.xml b/proxies/krrstub-proxy/src/main/resources/logback-spring.xml index f874dcc44c1..ae836bf1b11 100644 --- a/proxies/krrstub-proxy/src/main/resources/logback-spring.xml +++ b/proxies/krrstub-proxy/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/proxies/medl-proxy/src/main/resources/application-dev.yml b/proxies/medl-proxy/src/main/resources/application-dev.yml deleted file mode 100644 index 0f24d85a8e2..00000000000 --- a/proxies/medl-proxy/src/main/resources/application-dev.yml +++ /dev/null @@ -1,14 +0,0 @@ -TOKEN_X_ISSUER: dummy - -spring: - cloud: - gcp: - secretmanager: - enabled: true - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/proxies/medl-proxy/src/main/resources/application-local.yml b/proxies/medl-proxy/src/main/resources/application-local.yml new file mode 100644 index 00000000000..7c09739eb91 --- /dev/null +++ b/proxies/medl-proxy/src/main/resources/application-local.yml @@ -0,0 +1,11 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} +TOKEN_X_ISSUER: dummy + +spring: + cloud: + gcp: + secretmanager: + enabled: true + config: + import: "sm://" \ No newline at end of file diff --git a/proxies/medl-proxy/src/main/resources/logback-spring.xml b/proxies/medl-proxy/src/main/resources/logback-spring.xml index f874dcc44c1..ae836bf1b11 100644 --- a/proxies/medl-proxy/src/main/resources/logback-spring.xml +++ b/proxies/medl-proxy/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/proxies/norg2-proxy/src/main/resources/application-dev.yml b/proxies/norg2-proxy/src/main/resources/application-dev.yml deleted file mode 100644 index 0f24d85a8e2..00000000000 --- a/proxies/norg2-proxy/src/main/resources/application-dev.yml +++ /dev/null @@ -1,14 +0,0 @@ -TOKEN_X_ISSUER: dummy - -spring: - cloud: - gcp: - secretmanager: - enabled: true - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/proxies/norg2-proxy/src/main/resources/application-local.yml b/proxies/norg2-proxy/src/main/resources/application-local.yml new file mode 100644 index 00000000000..7c09739eb91 --- /dev/null +++ b/proxies/norg2-proxy/src/main/resources/application-local.yml @@ -0,0 +1,11 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} +TOKEN_X_ISSUER: dummy + +spring: + cloud: + gcp: + secretmanager: + enabled: true + config: + import: "sm://" \ No newline at end of file diff --git a/proxies/norg2-proxy/src/main/resources/logback-spring.xml b/proxies/norg2-proxy/src/main/resources/logback-spring.xml index f874dcc44c1..ae836bf1b11 100644 --- a/proxies/norg2-proxy/src/main/resources/logback-spring.xml +++ b/proxies/norg2-proxy/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/proxies/pdl-proxy/src/main/resources/application-dev.yml b/proxies/pdl-proxy/src/main/resources/application-local.yml similarity index 75% rename from proxies/pdl-proxy/src/main/resources/application-dev.yml rename to proxies/pdl-proxy/src/main/resources/application-local.yml index 946f65f4c53..ddc652232c4 100644 --- a/proxies/pdl-proxy/src/main/resources/application-dev.yml +++ b/proxies/pdl-proxy/src/main/resources/application-local.yml @@ -1,3 +1,5 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} TOKEN_X_ISSUER: dummy spring: diff --git a/proxies/pdl-proxy/src/main/resources/logback-spring.xml b/proxies/pdl-proxy/src/main/resources/logback-spring.xml index fa34559da64..f4aa8827aa1 100644 --- a/proxies/pdl-proxy/src/main/resources/logback-spring.xml +++ b/proxies/pdl-proxy/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/proxies/pensjon-testdata-facade-proxy/src/main/resources/application-dev.yml b/proxies/pensjon-testdata-facade-proxy/src/main/resources/application-local.yml similarity index 56% rename from proxies/pensjon-testdata-facade-proxy/src/main/resources/application-dev.yml rename to proxies/pensjon-testdata-facade-proxy/src/main/resources/application-local.yml index 50f5dcfd4c1..cf297c5e4ad 100644 --- a/proxies/pensjon-testdata-facade-proxy/src/main/resources/application-dev.yml +++ b/proxies/pensjon-testdata-facade-proxy/src/main/resources/application-local.yml @@ -1,3 +1,6 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + spring: cloud: gcp: @@ -5,11 +8,6 @@ spring: enabled: true config: import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} consumers: pensjon-testdata-facade: diff --git a/proxies/pensjon-testdata-facade-proxy/src/main/resources/logback-spring.xml b/proxies/pensjon-testdata-facade-proxy/src/main/resources/logback-spring.xml index 67da608456f..c00168b2e23 100644 --- a/proxies/pensjon-testdata-facade-proxy/src/main/resources/logback-spring.xml +++ b/proxies/pensjon-testdata-facade-proxy/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/proxies/saf-proxy/src/main/resources/application-dev.yml b/proxies/saf-proxy/src/main/resources/application-dev.yml deleted file mode 100644 index 0f24d85a8e2..00000000000 --- a/proxies/saf-proxy/src/main/resources/application-dev.yml +++ /dev/null @@ -1,14 +0,0 @@ -TOKEN_X_ISSUER: dummy - -spring: - cloud: - gcp: - secretmanager: - enabled: true - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/proxies/saf-proxy/src/main/resources/application-local.yml b/proxies/saf-proxy/src/main/resources/application-local.yml new file mode 100644 index 00000000000..7c09739eb91 --- /dev/null +++ b/proxies/saf-proxy/src/main/resources/application-local.yml @@ -0,0 +1,11 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} +TOKEN_X_ISSUER: dummy + +spring: + cloud: + gcp: + secretmanager: + enabled: true + config: + import: "sm://" \ No newline at end of file diff --git a/proxies/saf-proxy/src/main/resources/logback-spring.xml b/proxies/saf-proxy/src/main/resources/logback-spring.xml index f874dcc44c1..ae836bf1b11 100644 --- a/proxies/saf-proxy/src/main/resources/logback-spring.xml +++ b/proxies/saf-proxy/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/proxies/sigrunstub-proxy/src/main/resources/application-dev.yml b/proxies/sigrunstub-proxy/src/main/resources/application-dev.yml deleted file mode 100644 index 0f24d85a8e2..00000000000 --- a/proxies/sigrunstub-proxy/src/main/resources/application-dev.yml +++ /dev/null @@ -1,14 +0,0 @@ -TOKEN_X_ISSUER: dummy - -spring: - cloud: - gcp: - secretmanager: - enabled: true - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/proxies/sigrunstub-proxy/src/main/resources/application-local.yml b/proxies/sigrunstub-proxy/src/main/resources/application-local.yml new file mode 100644 index 00000000000..7c09739eb91 --- /dev/null +++ b/proxies/sigrunstub-proxy/src/main/resources/application-local.yml @@ -0,0 +1,11 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} +TOKEN_X_ISSUER: dummy + +spring: + cloud: + gcp: + secretmanager: + enabled: true + config: + import: "sm://" \ No newline at end of file diff --git a/proxies/sigrunstub-proxy/src/main/resources/logback-spring.xml b/proxies/sigrunstub-proxy/src/main/resources/logback-spring.xml index f874dcc44c1..ae836bf1b11 100644 --- a/proxies/sigrunstub-proxy/src/main/resources/logback-spring.xml +++ b/proxies/sigrunstub-proxy/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/proxies/skjermingsregister-proxy/src/main/resources/application-local.yml b/proxies/skjermingsregister-proxy/src/main/resources/application-local.yml index 0f24d85a8e2..72a6b5d092b 100644 --- a/proxies/skjermingsregister-proxy/src/main/resources/application-local.yml +++ b/proxies/skjermingsregister-proxy/src/main/resources/application-local.yml @@ -1,3 +1,5 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} TOKEN_X_ISSUER: dummy spring: @@ -7,8 +9,3 @@ spring: enabled: true config: import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/proxies/synthdata-meldekort-proxy/src/main/resources/application-dev.yml b/proxies/synthdata-meldekort-proxy/src/main/resources/application-local.yml similarity index 72% rename from proxies/synthdata-meldekort-proxy/src/main/resources/application-dev.yml rename to proxies/synthdata-meldekort-proxy/src/main/resources/application-local.yml index 0931b73834a..b7a307293a4 100644 --- a/proxies/synthdata-meldekort-proxy/src/main/resources/application-dev.yml +++ b/proxies/synthdata-meldekort-proxy/src/main/resources/application-local.yml @@ -1,3 +1,6 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + spring: cloud: gcp: @@ -7,11 +10,6 @@ spring: import: "sm://" azure: - nav: - app: - client: - id: ${sm://azure-app-client-id} - secret: ${sm://azure-app-client-secret} openid: config: issuer: https://login.microsoftonline.com/62366534-1ec3-4962-8869-9b5535279d0b diff --git a/proxies/synthdata-meldekort-proxy/src/main/resources/logback-spring.xml b/proxies/synthdata-meldekort-proxy/src/main/resources/logback-spring.xml index 0b85920eee1..7e71f477274 100644 --- a/proxies/synthdata-meldekort-proxy/src/main/resources/logback-spring.xml +++ b/proxies/synthdata-meldekort-proxy/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/proxies/udistub-proxy/src/main/resources/application-dev.yml b/proxies/udistub-proxy/src/main/resources/application-dev.yml deleted file mode 100644 index 0f24d85a8e2..00000000000 --- a/proxies/udistub-proxy/src/main/resources/application-dev.yml +++ /dev/null @@ -1,14 +0,0 @@ -TOKEN_X_ISSUER: dummy - -spring: - cloud: - gcp: - secretmanager: - enabled: true - config: - import: "sm://" - security: - oauth2: - resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} \ No newline at end of file diff --git a/proxies/udistub-proxy/src/main/resources/application-local.yml b/proxies/udistub-proxy/src/main/resources/application-local.yml new file mode 100644 index 00000000000..7c09739eb91 --- /dev/null +++ b/proxies/udistub-proxy/src/main/resources/application-local.yml @@ -0,0 +1,11 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} +TOKEN_X_ISSUER: dummy + +spring: + cloud: + gcp: + secretmanager: + enabled: true + config: + import: "sm://" \ No newline at end of file diff --git a/proxies/udistub-proxy/src/main/resources/logback-spring.xml b/proxies/udistub-proxy/src/main/resources/logback-spring.xml index b2989b19b94..9aed9d5f0bc 100644 --- a/proxies/udistub-proxy/src/main/resources/logback-spring.xml +++ b/proxies/udistub-proxy/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + diff --git a/proxies/yrkesskade-proxy/src/main/resources/application-dev.yaml b/proxies/yrkesskade-proxy/src/main/resources/application-local.yml similarity index 72% rename from proxies/yrkesskade-proxy/src/main/resources/application-dev.yaml rename to proxies/yrkesskade-proxy/src/main/resources/application-local.yml index 4fcf0345fde..f319813176d 100644 --- a/proxies/yrkesskade-proxy/src/main/resources/application-dev.yaml +++ b/proxies/yrkesskade-proxy/src/main/resources/application-local.yml @@ -1,3 +1,6 @@ +AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} +AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} + spring: cloud: gcp: @@ -8,8 +11,6 @@ spring: security: oauth2: resourceserver: - aad: - accepted-audience: ${sm://azure-app-client-id}, api://${sm://azure-app-client-id} tokenx: issuer-uri: dummy diff --git a/proxies/yrkesskade-proxy/src/main/resources/logback-spring.xml b/proxies/yrkesskade-proxy/src/main/resources/logback-spring.xml index fa34559da64..f4aa8827aa1 100644 --- a/proxies/yrkesskade-proxy/src/main/resources/logback-spring.xml +++ b/proxies/yrkesskade-proxy/src/main/resources/logback-spring.xml @@ -22,7 +22,7 @@ - + From 14ed0bd0a6dfd612b6d8ce298a10386e715941b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristen=20H=C3=A6rum?= Date: Thu, 12 Dec 2024 09:00:58 +0100 Subject: [PATCH 31/59] Feature/altinn 3 tilgang (#3667) Add Altinn3 Tilgang Service --- .../app.altinn3-tilgang-service-prod.yml | 24 ++ .../workflows/app.altinn3-tilgang-service.yml | 23 ++ .../99-dolly-convert-to-pk8.sh | 6 + apps/altinn3-tilgang-service/Dockerfile | 9 + apps/altinn3-tilgang-service/README.md | 17 ++ apps/altinn3-tilgang-service/build.gradle | 38 +++ apps/altinn3-tilgang-service/config.dev.yml | 80 ++++++ apps/altinn3-tilgang-service/config.prod.yml | 86 +++++++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59536 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + apps/altinn3-tilgang-service/gradlew | 234 ++++++++++++++++++ apps/altinn3-tilgang-service/gradlew.bat | 89 +++++++ apps/altinn3-tilgang-service/gradlewUpdate.sh | 3 + apps/altinn3-tilgang-service/settings.gradle | 18 ++ ...tinn3TilgangServiceApplicationStarter.java | 25 ++ .../config/AltinnConfig.java | 21 ++ .../config/JacksonConfig.java | 27 ++ .../config/JsonMapperConfig.java | 110 ++++++++ .../config/LocalVaultConfig.java | 10 + .../config/MaskinportenConfig.java | 25 ++ .../config/OpenApiConfig.java | 66 +++++ .../config/SecurityConfig.java | 40 +++ .../consumer/altinn/AltinnConsumer.java | 164 ++++++++++++ .../CreateAccessListeMemberCommand.java | 52 ++++ .../DeleteAccessListMemberCommand.java | 53 ++++ .../command/GetAccessListMembersCommand.java | 39 +++ .../command/GetExchangeTokenCommand.java | 37 +++ .../consumer/altinn/dto/AccessToken.java | 0 .../altinn/dto/AltinnResponseDTO.java | 44 ++++ .../consumer/altinn/dto/BrregResponseDTO.java | 65 +++++ .../altinn/dto/OrganisasjonCreateDTO.java | 18 ++ .../altinn/dto/OrganisasjonDeleteDTO.java | 32 +++ .../consumer/brreg/BrregConsumer.java | 26 ++ .../brreg/command/GetBrregEnheterCommand.java | 37 +++ .../maskinporten/MaskinportenConsumer.java | 74 ++++++ .../command/GetAccessTokenCommand.java | 37 +++ .../command/GetWellKnownCommand.java | 32 +++ .../maskinporten/dto/AccessToken.java | 16 ++ .../consumer/maskinporten/dto/WellKnown.java | 18 ++ .../database/entity/OrganisasjonTilgang.java | 31 +++ .../OrganisasjonTilgangRepository.java | 16 ++ .../domain/Organisasjon.java | 22 ++ .../domain/OrganisasjonResponse.java | 21 ++ .../mapper/BrrregResponseMappingStrategy.java | 49 ++++ .../mapper/MapperFacadeConfig.java | 35 +++ .../mapper/MappingStrategy.java | 19 ++ .../OrganisajonTilgangMappingStrategy.java | 33 +++ .../provider/AltinnTilgangController.java | 50 ++++ .../OrganisasjonMiljoeController.java | 38 +++ .../service/AltinnTilgangService.java | 91 +++++++ .../service/MiljoerOversiktService.java | 63 +++++ .../src/main/resources/application-dev.yml | 17 ++ .../src/main/resources/application-local.yml | 29 +++ .../src/main/resources/application-prod.yml | 17 ++ .../src/main/resources/application.yml | 58 +++++ .../db/migration/V1.0.0__CreateTables.sql | 10 + .../src/main/resources/logback-spring.xml | 32 +++ .../ApplicationContextTest.java | 24 ++ .../src/test/resources/application-test.yml | 7 + apps/dolly-frontend/config.idporten.yml | 3 + apps/dolly-frontend/config.test.yml | 1 + apps/dolly-frontend/config.unstable.yml | 1 + apps/dolly-frontend/config.yml | 4 +- .../web/DollyFrontendApplicationStarter.java | 2 +- .../no/nav/dolly/web/config/Consumers.java | 2 +- apps/dolly-frontend/src/main/js/package.json | 3 +- .../src/main/js/proxy-routes.json | 2 +- .../adminPages/Orgtilgang/OrgOversikt.tsx | 3 - .../adminPages/Orgtilgang/OrgtilgangForm.tsx | 1 - .../Orgtilgang/RedigerOrganisasjon.tsx | 7 +- .../OrganisasjonTilgangService.tsx | 15 +- .../utils/hooks/useOrganisasjonTilgang.tsx | 4 +- .../src/main/resources/application-dev.yml | 7 +- .../src/main/resources/application-local.yml | 8 +- .../src/main/resources/application.yml | 10 +- ...asjonTilgangServiceApplicationStarter.java | 2 +- 76 files changed, 2400 insertions(+), 37 deletions(-) create mode 100644 .github/workflows/app.altinn3-tilgang-service-prod.yml create mode 100644 .github/workflows/app.altinn3-tilgang-service.yml create mode 100644 apps/altinn3-tilgang-service/99-dolly-convert-to-pk8.sh create mode 100644 apps/altinn3-tilgang-service/Dockerfile create mode 100644 apps/altinn3-tilgang-service/README.md create mode 100644 apps/altinn3-tilgang-service/build.gradle create mode 100644 apps/altinn3-tilgang-service/config.dev.yml create mode 100644 apps/altinn3-tilgang-service/config.prod.yml create mode 100644 apps/altinn3-tilgang-service/gradle/wrapper/gradle-wrapper.jar create mode 100644 apps/altinn3-tilgang-service/gradle/wrapper/gradle-wrapper.properties create mode 100755 apps/altinn3-tilgang-service/gradlew create mode 100644 apps/altinn3-tilgang-service/gradlew.bat create mode 100755 apps/altinn3-tilgang-service/gradlewUpdate.sh create mode 100644 apps/altinn3-tilgang-service/settings.gradle create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/Altinn3TilgangServiceApplicationStarter.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/AltinnConfig.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/JacksonConfig.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/JsonMapperConfig.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/LocalVaultConfig.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/MaskinportenConfig.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/OpenApiConfig.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/SecurityConfig.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/AltinnConsumer.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/CreateAccessListeMemberCommand.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/DeleteAccessListMemberCommand.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAccessListMembersCommand.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetExchangeTokenCommand.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AccessToken.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnResponseDTO.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/BrregResponseDTO.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/OrganisasjonCreateDTO.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/OrganisasjonDeleteDTO.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/brreg/BrregConsumer.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/brreg/command/GetBrregEnheterCommand.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/maskinporten/MaskinportenConsumer.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/maskinporten/command/GetAccessTokenCommand.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/maskinporten/command/GetWellKnownCommand.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/maskinporten/dto/AccessToken.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/maskinporten/dto/WellKnown.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/database/entity/OrganisasjonTilgang.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/database/repository/OrganisasjonTilgangRepository.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/domain/Organisasjon.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/domain/OrganisasjonResponse.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/mapper/BrrregResponseMappingStrategy.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/mapper/MapperFacadeConfig.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/mapper/MappingStrategy.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/mapper/OrganisajonTilgangMappingStrategy.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnTilgangController.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/OrganisasjonMiljoeController.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnTilgangService.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/MiljoerOversiktService.java create mode 100644 apps/altinn3-tilgang-service/src/main/resources/application-dev.yml create mode 100644 apps/altinn3-tilgang-service/src/main/resources/application-local.yml create mode 100644 apps/altinn3-tilgang-service/src/main/resources/application-prod.yml create mode 100644 apps/altinn3-tilgang-service/src/main/resources/application.yml create mode 100644 apps/altinn3-tilgang-service/src/main/resources/db/migration/V1.0.0__CreateTables.sql create mode 100644 apps/altinn3-tilgang-service/src/main/resources/logback-spring.xml create mode 100644 apps/altinn3-tilgang-service/src/test/java/no/nav/testnav/altinn3tilgangservice/ApplicationContextTest.java create mode 100644 apps/altinn3-tilgang-service/src/test/resources/application-test.yml diff --git a/.github/workflows/app.altinn3-tilgang-service-prod.yml b/.github/workflows/app.altinn3-tilgang-service-prod.yml new file mode 100644 index 00000000000..6751193d9f0 --- /dev/null +++ b/.github/workflows/app.altinn3-tilgang-service-prod.yml @@ -0,0 +1,24 @@ +name: altinn3-tilgang-service-prod + +on: + push: + paths: + - "plugins/**" + - "libs/reactive-core/**" + - "libs/reactive-security/**" + - "apps/altinn3-tilgang-service/**" + - ".github/workflows/app.altinn3-tilgang-service.yml" + +jobs: + workflow: + uses: ./.github/workflows/common.workflow.backend.yml + with: + working-directory: "apps/altinn3-tilgang-service" + deploy-tag: "#deploy-altinn3-tilgang-service-prod" + nais-manifest: "config.prod.yml" + cluster: "prod-gcp" + permissions: + contents: read + id-token: write + secrets: inherit + diff --git a/.github/workflows/app.altinn3-tilgang-service.yml b/.github/workflows/app.altinn3-tilgang-service.yml new file mode 100644 index 00000000000..33ed8e0eaaa --- /dev/null +++ b/.github/workflows/app.altinn3-tilgang-service.yml @@ -0,0 +1,23 @@ +name: altinn3-tilgang-service + +on: + push: + paths: + - "plugins/**" + - "libs/reactive-core/**" + - "libs/reactive-security/**" + - "apps/altinn3-tilgang-service/**" + - ".github/workflows/app.altinn3-tilgang-service.yml" + +jobs: + workflow: + uses: ./.github/workflows/common.workflow.backend.yml + with: + working-directory: "apps/altinn3-tilgang-service" + deploy-tag: "#deploy-altinn3-tilgang-service" + nais-manifest: "config.dev.yml" + permissions: + contents: read + id-token: write + secrets: inherit + diff --git a/apps/altinn3-tilgang-service/99-dolly-convert-to-pk8.sh b/apps/altinn3-tilgang-service/99-dolly-convert-to-pk8.sh new file mode 100644 index 00000000000..49cfce0b64e --- /dev/null +++ b/apps/altinn3-tilgang-service/99-dolly-convert-to-pk8.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env sh + +# +# Converts NAIS provided key.pem to PKCS#8 PEM format, which can be used by R2dbc. +# +openssl pkey -in /var/run/secrets/nais.io/sqlcertificate/key.pem -out /tmp/pk8.pem \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/Dockerfile b/apps/altinn3-tilgang-service/Dockerfile new file mode 100644 index 00000000000..6114d5f0438 --- /dev/null +++ b/apps/altinn3-tilgang-service/Dockerfile @@ -0,0 +1,9 @@ +FROM ghcr.io/navikt/baseimages/temurin:21 +LABEL maintainer="Team Dolly" + +ENV JAVA_OPTS="--add-opens java.base/java.lang=ALL-UNNAMED" + +COPY 99-dolly-convert-to-pk8.sh /init-scripts/ +COPY /build/libs/app.jar /app/ + +EXPOSE 8080 \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/README.md b/apps/altinn3-tilgang-service/README.md new file mode 100644 index 00000000000..c73ee0493b7 --- /dev/null +++ b/apps/altinn3-tilgang-service/README.md @@ -0,0 +1,17 @@ +## altinn3-tilgang-service + +Service som godkjenner tilganger for en spesifisert organisasjoner mot Dolly ved bruk av bankid. + +## Swagger + +Swagger finnes under [/swagger-ui.html](https://testnav-altinn3-tilgang-service.intern.dev.nav.no/swagger-ui.html) +-endepunktet til applikasjonen. + +## Lokal kjøring + +Ha naisdevice kjørende og kjør Altinn3TilgangServiceApplicationStarter med følgende argumenter: + +``` +-Dspring.profiles.active=local +-Dspring.cloud.vault.token=[vault-token] +``` diff --git a/apps/altinn3-tilgang-service/build.gradle b/apps/altinn3-tilgang-service/build.gradle new file mode 100644 index 00000000000..0967f46878e --- /dev/null +++ b/apps/altinn3-tilgang-service/build.gradle @@ -0,0 +1,38 @@ +plugins { + id "dolly-apps" +} + +sonarqube { + properties { + property "sonar.projectKey", "testnav-altinn3-tilgang-service" + property "sonar.projectName", "testnav-altinn3-tilgang-service" + } +} + +dependencies { + implementation "com.google.cloud:spring-cloud-gcp-starter-secretmanager:$versions.gcpSecretManager" + + implementation "no.nav.testnav.libs:reactive-core" + implementation "no.nav.testnav.libs:reactive-security" + implementation "no.nav.testnav.libs:vault" + + implementation "org.springframework.boot:spring-boot-starter-data-r2dbc" + implementation "org.springframework.boot:spring-boot-starter-oauth2-resource-server" + implementation "org.springframework.boot:spring-boot-starter-security" + + implementation "org.flywaydb:flyway-core" + implementation "org.flywaydb:flyway-database-postgresql" + + runtimeOnly "org.postgresql:postgresql" + runtimeOnly "org.postgresql:r2dbc-postgresql" + + implementation "ma.glasnost.orika:orika-core:$versions.orika" + + implementation "io.micrometer:micrometer-registry-prometheus" + implementation "org.springdoc:springdoc-openapi-starter-webflux-ui:$versions.springdoc" + implementation "io.swagger.core.v3:swagger-annotations-jakarta:$versions.swagger" + + implementation "io.r2dbc:r2dbc-h2" + testRuntimeOnly "com.h2database:h2" +} + diff --git a/apps/altinn3-tilgang-service/config.dev.yml b/apps/altinn3-tilgang-service/config.dev.yml new file mode 100644 index 00000000000..b9d45fba561 --- /dev/null +++ b/apps/altinn3-tilgang-service/config.dev.yml @@ -0,0 +1,80 @@ +apiVersion: "nais.io/v1alpha1" +kind: "Application" +metadata: + name: testnav-altinn3-tilgang-service + namespace: dolly + labels: + team: dolly +spec: + tokenx: + enabled: true + image: "{{image}}" + port: 8080 + azure: + application: + enabled: true + tenant: nav.no + claims: + groups: + - id: 9c7efec1-1599-4216-a67e-6fd53a6a951c + maskinporten: + enabled: true + scopes: + consumes: + - name: altinn:resourceregistry/accesslist.read + - name: altinn:resourceregistry/accesslist.write + accessPolicy: + inbound: + rules: + - application: dolly-frontend + - application: dolly-frontend-dev + - application: dolly-frontend-dev-unstable + - application: dolly-idporten + - application: team-dolly-lokal-app + - application: testnav-oversikt-frontend + outbound: + external: + - host: platform.tt02.altinn.no + - host: data.brreg.no + liveness: + path: /internal/isAlive + initialDelay: 10 + periodSeconds: 5 + failureThreshold: 500 + observability: + logging: + destinations: + - id: elastic + autoInstrumentation: + enabled: true + runtime: java + readiness: + path: /internal/isReady + initialDelay: 10 + periodSeconds: 5 + failureThreshold: 500 + prometheus: + enabled: true + path: /internal/metrics + replicas: + min: 1 + max: 1 + resources: + requests: + cpu: 200m + memory: 1024Mi + limits: + memory: 2048Mi + env: + - name: SPRING_PROFILES_ACTIVE + value: dev + ingresses: + - "https://testnav-altinn3-tilgang-service.intern.dev.nav.no" + gcp: + sqlInstances: + - type: POSTGRES_16 + tier: db-custom-1-3840 + name: testnav-altinn3-tilgang + databases: + - name: testnav-altinn3-tilgang + autoBackupHour: 2 \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/config.prod.yml b/apps/altinn3-tilgang-service/config.prod.yml new file mode 100644 index 00000000000..e57c9109b5c --- /dev/null +++ b/apps/altinn3-tilgang-service/config.prod.yml @@ -0,0 +1,86 @@ +apiVersion: "nais.io/v1alpha1" +kind: "Application" +metadata: + name: testnav-altinn3-tilgang-service-prod + namespace: dolly + labels: + team: dolly +spec: + tokenx: + enabled: true + image: "{{image}}" + port: 8080 + azure: + application: + enabled: true + tenant: nav.no + claims: + groups: + - id: 9c7efec1-1599-4216-a67e-6fd53a6a951c + maskinporten: + enabled: true + scopes: + consumes: + - name: altinn:resourceregistry/accesslist.read + - name: altinn:resourceregistry/accesslist.write + accessPolicy: + inbound: + rules: + - application: dolly-frontend + cluster: dev-gcp + - application: dolly-frontend-dev + cluster: dev-gcp + - application: dolly-frontend-dev-unstable + cluster: dev-gcp + - application: dolly-idporten + cluster: dev-gcp + - application: team-dolly-lokal-app + cluster: dev-gcp + - application: testnav-oversikt-frontend + cluster: dev-gcp + outbound: + external: + - host: platform.altinn.no + - host: data.brreg.no + liveness: + path: /internal/isAlive + initialDelay: 10 + periodSeconds: 5 + failureThreshold: 500 + observability: + logging: + destinations: + - id: elastic + autoInstrumentation: + enabled: true + runtime: java + readiness: + path: /internal/isReady + initialDelay: 10 + periodSeconds: 5 + failureThreshold: 500 + prometheus: + enabled: true + path: /internal/metrics + replicas: + min: 1 + max: 1 + resources: + requests: + cpu: 200m + memory: 1024Mi + limits: + memory: 2048Mi + env: + - name: SPRING_PROFILES_ACTIVE + value: prod + ingresses: + - "https://testnav-altinn3-tilgang-service.nav.no" + gcp: + sqlInstances: + - type: POSTGRES_16 + tier: db-custom-1-3840 + name: testnav-altinn3-tilgang + databases: + - name: testnav-altinn3-tilgang + autoBackupHour: 2 \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/gradle/wrapper/gradle-wrapper.jar b/apps/altinn3-tilgang-service/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7454180f2ae8848c63b8b4dea2cb829da983f2fa GIT binary patch literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL literal 0 HcmV?d00001 diff --git a/apps/altinn3-tilgang-service/gradle/wrapper/gradle-wrapper.properties b/apps/altinn3-tilgang-service/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..48c0a02ca41 --- /dev/null +++ b/apps/altinn3-tilgang-service/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/apps/altinn3-tilgang-service/gradlew b/apps/altinn3-tilgang-service/gradlew new file mode 100755 index 00000000000..3da45c161b0 --- /dev/null +++ b/apps/altinn3-tilgang-service/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright ? 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions ?$var?, ?${var}?, ?${var:-default}?, ?${var+SET}?, +# ?${var#prefix}?, ?${var%suffix}?, and ?$( cmd )?; +# * compound commands having a testable exit status, especially ?case?; +# * various built-in commands including ?command?, ?set?, and ?ulimit?. +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/apps/altinn3-tilgang-service/gradlew.bat b/apps/altinn3-tilgang-service/gradlew.bat new file mode 100644 index 00000000000..ac1b06f9382 --- /dev/null +++ b/apps/altinn3-tilgang-service/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/apps/altinn3-tilgang-service/gradlewUpdate.sh b/apps/altinn3-tilgang-service/gradlewUpdate.sh new file mode 100755 index 00000000000..e5ee6361152 --- /dev/null +++ b/apps/altinn3-tilgang-service/gradlewUpdate.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +gradle wrapper \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/settings.gradle b/apps/altinn3-tilgang-service/settings.gradle new file mode 100644 index 00000000000..e7a413ca6d0 --- /dev/null +++ b/apps/altinn3-tilgang-service/settings.gradle @@ -0,0 +1,18 @@ +plugins { + id "com.gradle.develocity" version "3.17.4" +} + +rootProject.name = 'altinn3-tilgang-service' + +includeBuild "../../plugins/java" + +includeBuild '../../libs/reactive-core' +includeBuild '../../libs/reactive-security' +includeBuild '../../libs/vault' + +develocity { + buildScan { + termsOfUseUrl = "https://gradle.com/terms-of-service" + termsOfUseAgree = "yes" + } +} \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/Altinn3TilgangServiceApplicationStarter.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/Altinn3TilgangServiceApplicationStarter.java new file mode 100644 index 00000000000..15e9ab89905 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/Altinn3TilgangServiceApplicationStarter.java @@ -0,0 +1,25 @@ +package no.nav.testnav.altinn3tilgangservice; + +import no.nav.testnav.libs.reactivecore.config.CoreConfig; +import no.nav.testnav.libs.reactivesecurity.config.SecureOAuth2ServerToServerConfiguration; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Import; +import org.springframework.data.r2dbc.config.EnableR2dbcAuditing; +import org.springframework.data.r2dbc.repository.config.EnableR2dbcRepositories; +import org.springframework.web.reactive.config.EnableWebFlux; + +@Import({ + CoreConfig.class, + SecureOAuth2ServerToServerConfiguration.class +}) +@EnableWebFlux +@EnableR2dbcAuditing +@EnableR2dbcRepositories +@SpringBootApplication +public class Altinn3TilgangServiceApplicationStarter { + + public static void main(String[] args) { + SpringApplication.run(Altinn3TilgangServiceApplicationStarter.class, args); + } +} \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/AltinnConfig.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/AltinnConfig.java new file mode 100644 index 00000000000..bcc747c7eba --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/AltinnConfig.java @@ -0,0 +1,21 @@ +package no.nav.testnav.altinn3tilgangservice.config; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +@Getter +@Configuration +@NoArgsConstructor +public class AltinnConfig { + + @Value("${altinn.api.url}") + private String url; + + @Value("${altinn.resource.owner}") + private String owner; + + @Value("${altinn.resource.identifier}") + private String identifier; +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/JacksonConfig.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/JacksonConfig.java new file mode 100644 index 00000000000..fd684bcddc7 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/JacksonConfig.java @@ -0,0 +1,27 @@ +package no.nav.testnav.altinn3tilgangservice.config; + +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.codec.ServerCodecConfigurer; +import org.springframework.http.codec.json.Jackson2JsonDecoder; +import org.springframework.http.codec.json.Jackson2JsonEncoder; +import org.springframework.web.reactive.config.WebFluxConfigurer; + +@Configuration +@RequiredArgsConstructor +public class JacksonConfig implements WebFluxConfigurer { + + private final ObjectMapper objectMapper; + + @Override + public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) { + configurer.defaultCodecs().jackson2JsonEncoder( + new Jackson2JsonEncoder(objectMapper) + ); + + configurer.defaultCodecs().jackson2JsonDecoder( + new Jackson2JsonDecoder(objectMapper) + ); + } +} \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/JsonMapperConfig.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/JsonMapperConfig.java new file mode 100644 index 00000000000..890a543f0c6 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/JsonMapperConfig.java @@ -0,0 +1,110 @@ +package no.nav.testnav.altinn3tilgangservice.config; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.json.JsonMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.fasterxml.jackson.datatype.jsr310.ser.YearMonthSerializer; +import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.io.IOException; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.YearMonth; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; + +import static org.apache.commons.lang3.StringUtils.isBlank; + +@Configuration +public class JsonMapperConfig { + + private static final String YEAR_MONTH = "yyyy-MM"; + + @Bean + public ObjectMapper objectMapper() { + + var simpleModule = new SimpleModule() + .addDeserializer(LocalDateTime.class, new DollyLocalDateTimeDeserializer()) + .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ISO_DATE_TIME)) + .addDeserializer(LocalDate.class, new DollyLocalDateDeserializer()) + .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ISO_DATE)) + .addDeserializer(YearMonth.class, new DollyYearMonthDeserializer()) + .addSerializer(YearMonth.class, new YearMonthSerializer(DateTimeFormatter.ofPattern(YEAR_MONTH))) + .addDeserializer(ZonedDateTime.class, new DollyZonedDateTimeDeserializer()) + .addSerializer(ZonedDateTime.class, new ZonedDateTimeSerializer(DateTimeFormatter.ISO_DATE_TIME)); + return JsonMapper + .builder() + .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false) + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + .configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true) + .configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true) + .enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS) + .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS) + .build() + .registerModule(new JavaTimeModule()) + .registerModule(simpleModule); + + } + + private static class DollyYearMonthDeserializer extends JsonDeserializer { + + @Override + public YearMonth deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { + JsonNode node = jsonParser.getCodec().readTree(jsonParser); + if (isBlank(node.asText())) { + return null; + } + return YearMonth.parse(node.asText(), DateTimeFormatter.ofPattern(YEAR_MONTH)); + } + } + + private static class DollyZonedDateTimeDeserializer extends JsonDeserializer { + + @Override + public ZonedDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { + JsonNode node = jsonParser.getCodec().readTree(jsonParser); + if (isBlank(node.asText())) { + return null; + } + return ZonedDateTime.parse(node.asText(), DateTimeFormatter.ISO_DATE_TIME); + } + } + + private static class DollyLocalDateDeserializer extends JsonDeserializer { + + @Override + public LocalDate deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { + JsonNode node = jsonParser.getCodec().readTree(jsonParser); + if (isBlank(node.asText())) { + return null; + } + var dateTime = node.asText().length() > 10 ? node.asText().substring(0, 10) : node.asText(); + return LocalDate.parse(dateTime); + } + } + + private static class DollyLocalDateTimeDeserializer extends JsonDeserializer { + + @Override + public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { + JsonNode node = jsonParser.getCodec().readTree(jsonParser); + if (isBlank(node.asText())) { + return null; + } + var dateTime = node.asText().length() > 19 ? node.asText().substring(0, 19) : node.asText(); + return dateTime.length() > 10 ? LocalDateTime.parse(dateTime) : LocalDate.parse(dateTime).atStartOfDay(); + } + } +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/LocalVaultConfig.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/LocalVaultConfig.java new file mode 100644 index 00000000000..11600e1a6bf --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/LocalVaultConfig.java @@ -0,0 +1,10 @@ +package no.nav.testnav.altinn3tilgangservice.config; + +import no.nav.testnav.libs.vault.AbstractLocalVaultConfiguration; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +@Configuration +@Profile("local") +public class LocalVaultConfig extends AbstractLocalVaultConfiguration { +} \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/MaskinportenConfig.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/MaskinportenConfig.java new file mode 100644 index 00000000000..119cc389e30 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/MaskinportenConfig.java @@ -0,0 +1,25 @@ +package no.nav.testnav.altinn3tilgangservice.config; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + + +@Getter +@Configuration +@NoArgsConstructor +public class MaskinportenConfig { + + @Value("${MASKINPORTEN_CLIENT_ID}") + private String maskinportenClientId; + + @Value("${MASKINPORTEN_CLIENT_JWK}") + private String maskinportenClientJwk; + + @Value("${MASKINPORTEN_SCOPES}") + private String maskinportenScopes; + + @Value("${MASKINPORTEN_WELL_KNOWN_URL}") + private String maskinportenWellKnownUrl; +} \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/OpenApiConfig.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/OpenApiConfig.java new file mode 100644 index 00000000000..5cd5983a7f9 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/OpenApiConfig.java @@ -0,0 +1,66 @@ +package no.nav.testnav.altinn3tilgangservice.config; + +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Contact; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.info.License; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.Arrays; + +import no.nav.testnav.libs.reactivecore.config.ApplicationProperties; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.WebFilter; +import org.springframework.web.server.WebFilterChain; +import reactor.core.publisher.Mono; + + +@Configuration +public class OpenApiConfig implements WebFilter { + + @Bean + public OpenAPI openApi(ApplicationProperties applicationProperties) { + return new OpenAPI() + .components(new Components().addSecuritySchemes("bearer-jwt", new SecurityScheme() + .type(SecurityScheme.Type.HTTP) + .scheme("bearer") + .bearerFormat("JWT") + .in(SecurityScheme.In.HEADER) + .name("Authorization") + )) + .addSecurityItem( + new SecurityRequirement().addList("bearer-jwt", Arrays.asList("read", "write"))) + .info(new Info() + .title(applicationProperties.getName()) + .version(applicationProperties.getVersion()) + .description(applicationProperties.getDescription()) + .termsOfService("https://nav.no") + .contact(new Contact() + .url("https://nav-it.slack.com/archives/CA3P9NGA2") + .email("dolly@nav.no") + .name("Team Dolly") + ) + .license(new License() + .name("MIT License") + .url("https://opensource.org/licenses/MIT") + ) + ); + } + + @Override + public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { + if (exchange.getRequest().getURI().getPath().equals("/swagger")) { + return chain + .filter(exchange.mutate() + .request(exchange.getRequest() + .mutate().path("/swagger-ui.html").build()) + .build()); + } + + return chain.filter(exchange); + } +} \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/SecurityConfig.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/SecurityConfig.java new file mode 100644 index 00000000000..1472adbd5c6 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/config/SecurityConfig.java @@ -0,0 +1,40 @@ +package no.nav.testnav.altinn3tilgangservice.config; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.testnav.libs.reactivesecurity.manager.JwtReactiveAuthenticationManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.method.configuration.EnableReactiveMethodSecurity; +import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; +import org.springframework.security.config.web.server.ServerHttpSecurity; +import org.springframework.security.web.server.SecurityWebFilterChain; + + +@Slf4j +@Configuration +@EnableWebFluxSecurity +@EnableReactiveMethodSecurity +@RequiredArgsConstructor +public class SecurityConfig { + + private final JwtReactiveAuthenticationManager jwtReactiveAuthenticationManager; + + @Bean + public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity httpSecurity) { + return httpSecurity + .csrf(ServerHttpSecurity.CsrfSpec::disable) + .authorizeExchange(authorizeConfig -> authorizeConfig.pathMatchers( + "/internal/**", + "/webjars/**", + "/swagger-resources/**", + "/v3/api-docs/**", + "/swagger-ui/**", + "/swagger", + "/error", + "/swagger-ui.html" + ).permitAll().anyExchange().authenticated()) + .oauth2ResourceServer(oauth2RSConfig -> oauth2RSConfig.jwt(jwtSpec -> jwtSpec.authenticationManager(jwtReactiveAuthenticationManager))).build(); + } + +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/AltinnConsumer.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/AltinnConsumer.java new file mode 100644 index 00000000000..ae8f52b3b39 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/AltinnConsumer.java @@ -0,0 +1,164 @@ +package no.nav.testnav.altinn3tilgangservice.consumer.altinn; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import ma.glasnost.orika.MapperFacade; +import no.nav.testnav.altinn3tilgangservice.config.AltinnConfig; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.command.CreateAccessListeMemberCommand; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.command.DeleteAccessListMemberCommand; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.command.GetAccessListMembersCommand; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.command.GetExchangeTokenCommand; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnResponseDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.BrregResponseDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.OrganisasjonCreateDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.OrganisasjonDeleteDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.brreg.BrregConsumer; +import no.nav.testnav.altinn3tilgangservice.consumer.maskinporten.MaskinportenConsumer; +import no.nav.testnav.altinn3tilgangservice.domain.Organisasjon; +import org.springframework.http.codec.json.Jackson2JsonDecoder; +import org.springframework.http.codec.json.Jackson2JsonEncoder; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.List; +import java.util.Map; + +import static no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.OrganisasjonCreateDTO.ORGANISASJON_ID; +import static org.apache.commons.lang3.StringUtils.isBlank; + +@Slf4j +@Component +public class AltinnConsumer { + + private final WebClient webClient; + private final AltinnConfig altinnConfig; + private final MapperFacade mapperFacade; + private final ObjectMapper objectMapper; + private final MaskinportenConsumer maskinportenConsumer; + private final BrregConsumer brregConsumer; + + public AltinnConsumer( + AltinnConfig altinnConfig, + MaskinportenConsumer maskinportenConsumer, + ObjectMapper objectMapper, + MapperFacade mapperFacade, + WebClient.Builder webClientBuilder, BrregConsumer brregConsumer) { + + this.altinnConfig = altinnConfig; + this.maskinportenConsumer = maskinportenConsumer; + this.webClient = webClientBuilder + .baseUrl(altinnConfig.getUrl()) + .codecs(clientDefaultCodecsConfigurer -> { + clientDefaultCodecsConfigurer + .defaultCodecs() + .jackson2JsonEncoder(new Jackson2JsonEncoder(objectMapper)); + clientDefaultCodecsConfigurer + .defaultCodecs() + .jackson2JsonDecoder(new Jackson2JsonDecoder(objectMapper)); + }) + .build(); + this.brregConsumer = brregConsumer; + this.mapperFacade = mapperFacade; + this.objectMapper = objectMapper; + } + + public Mono exchangeToken(String token) { + + return new GetExchangeTokenCommand(webClient, token).call(); + } + + public Flux delete(String organisasjonsnummer) { + + return Flux.from(getAccessListMembers() + .flatMapMany(value -> Flux.fromIterable(value.getData())) + .map(AltinnResponseDTO.AccessListMembershipDTO::getIdentifiers) + .collectList() + .map(data -> getIdentifier(data, organisasjonsnummer)) + .map(identifier -> + !identifier.getData().isEmpty() ? + maskinportenConsumer.getAccessToken() + .flatMap(this::exchangeToken) + .flatMap(exchangeToken -> new DeleteAccessListMemberCommand( + webClient, + exchangeToken, + identifier, + altinnConfig).call()) + .flatMapMany(this::convertToOrganisasjon) : + Flux.just(Organisasjon.builder() + .organisasjonsnummer(organisasjonsnummer) + .feilmelding("404 Not found: Organisasjon %s ble ikke funnet".formatted(organisasjonsnummer)) + .build()))) + .flatMap(Flux::from); + } + + public Flux create(String organisasjonsnummer) { + + return maskinportenConsumer.getAccessToken() + .flatMap(this::exchangeToken) + .flatMap(exchangeToken -> new CreateAccessListeMemberCommand( + webClient, + exchangeToken, + new OrganisasjonCreateDTO(organisasjonsnummer), + altinnConfig).call()) + .flatMapMany(response -> + isBlank(response.getFeilmelding()) ? + Flux.fromIterable(response.getData()) + .map(this::getOrgnummer) + .filter(organisasjonsnummer::equals) + .flatMap(brregConsumer::getEnheter) : + Mono.just(BrregResponseDTO.builder() + .organisasjonsnummer(organisasjonsnummer) + .feilmelding(response.getFeilmelding()) + .status(response.getStatus()) + .build())) + .map(response -> mapperFacade.map(response, Organisasjon.class)); + } + + public Flux getOrganisasjoner() { + + return getAccessListMembers() + .flatMapMany(this::convertToOrganisasjon); + } + + private Mono getAccessListMembers() { + + return maskinportenConsumer.getAccessToken() + .flatMap(this::exchangeToken) + .flatMap(exchangeToken -> new GetAccessListMembersCommand( + webClient, + exchangeToken, + altinnConfig).call()); + } + + private Flux convertToOrganisasjon(AltinnResponseDTO altInnResponse) { + + return Flux.fromIterable(altInnResponse.getData()) + .map(this::getOrgnummer) + .flatMap(brregConsumer::getEnheter) + .map(response -> mapperFacade.map(response, Organisasjon.class)); + } + + private OrganisasjonDeleteDTO getIdentifier(List data, String organisasjonsnummer) { + + return data.stream() + .filter(identifier -> organisasjonsnummer.equals(identifier.get(ORGANISASJON_ID).asText())) + .map(identifier -> objectMapper.convertValue(identifier, + new TypeReference>() { + })) + .map(OrganisasjonDeleteDTO::new) + .findFirst().orElse(new OrganisasjonDeleteDTO()); + } + + @SneakyThrows + private String getOrgnummer(AltinnResponseDTO.AccessListMembershipDTO data) { + + return data.getIdentifiers() + .get(ORGANISASJON_ID) + .asText(); + } +} \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/CreateAccessListeMemberCommand.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/CreateAccessListeMemberCommand.java new file mode 100644 index 00000000000..997a7b65a70 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/CreateAccessListeMemberCommand.java @@ -0,0 +1,52 @@ +package no.nav.testnav.altinn3tilgangservice.consumer.altinn.command; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.testnav.altinn3tilgangservice.config.AltinnConfig; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnResponseDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.OrganisasjonCreateDTO; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.util.concurrent.Callable; +import java.util.stream.Collectors; + +@Slf4j +@RequiredArgsConstructor +public class CreateAccessListeMemberCommand implements Callable> { + + private static final String ALTINN_URL = "/resourceregistry/api/v1/access-lists/{owner}/{identifier}/members"; + + private final WebClient webClient; + private final String token; + private final OrganisasjonCreateDTO organisasjon; + private final AltinnConfig altinnConfig; + + + @Override + public Mono call() { + + return webClient + .post() + .uri(builder -> builder.path(ALTINN_URL) + .build(altinnConfig.getOwner(), altinnConfig.getIdentifier())) + .bodyValue(organisasjon) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .retrieve() + .bodyToMono(AltinnResponseDTO.class) + .doOnError(WebClientFilter::logErrorMessage) + .doOnSuccess(value -> log.info("Altinn organisasjontilgang opprettet for {}", + organisasjon.getData().stream() + .map(data -> data.split(":")) + .map(data -> data[data.length-1]) + .collect(Collectors.joining()))) + .onErrorResume(throwable -> Mono.just(AltinnResponseDTO.builder() + .status(WebClientFilter.getStatus(throwable)) + .feilmelding(WebClientFilter.getMessage(throwable)) + .build())); + } +} \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/DeleteAccessListMemberCommand.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/DeleteAccessListMemberCommand.java new file mode 100644 index 00000000000..ddaac4a82da --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/DeleteAccessListMemberCommand.java @@ -0,0 +1,53 @@ +package no.nav.testnav.altinn3tilgangservice.consumer.altinn.command; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.testnav.altinn3tilgangservice.config.AltinnConfig; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnResponseDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.OrganisasjonDeleteDTO; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.util.concurrent.Callable; +import java.util.stream.Collectors; + +import static no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.OrganisasjonCreateDTO.ORGANISASJON_ID; + +@Slf4j +@RequiredArgsConstructor +public class DeleteAccessListMemberCommand implements Callable> { + + private static final String ALTINN_URL = "/resourceregistry/api/v1/access-lists/{owner}/{identifier}/members"; + + private final WebClient webClient; + private final String token; + private final OrganisasjonDeleteDTO identifiers; + private final AltinnConfig altinnConfig; + + + @Override + public Mono call() { + + return webClient + .method(HttpMethod.DELETE) + .uri(builder -> builder.path(ALTINN_URL) + .build(altinnConfig.getOwner(), altinnConfig.getIdentifier()) + ) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .bodyValue(identifiers) + .retrieve() + .bodyToMono(AltinnResponseDTO.class) + .doOnSuccess(value -> log.info("Altinn organisasjontilgang slettet for {}", + identifiers.getData().stream() + .filter(data -> data.contains(ORGANISASJON_ID)) + .map(data -> data.split(":")) + .map(data -> data[data.length - 1]) + .collect(Collectors.joining()))) + .doOnError(WebClientFilter::logErrorMessage); + } +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAccessListMembersCommand.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAccessListMembersCommand.java new file mode 100644 index 00000000000..1c615118bf7 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAccessListMembersCommand.java @@ -0,0 +1,39 @@ +package no.nav.testnav.altinn3tilgangservice.consumer.altinn.command; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.testnav.altinn3tilgangservice.config.AltinnConfig; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnResponseDTO; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.util.concurrent.Callable; + +@Slf4j +@RequiredArgsConstructor +public class GetAccessListMembersCommand implements Callable> { + + private static final String ALTINN_URL = "/resourceregistry/api/v1/access-lists/{owner}/{identifier}/members"; + + private final WebClient webClient; + private final String token; + private final AltinnConfig altinnConfig; + + @Override + public Mono call() { + + return webClient + .get() + .uri(builder -> builder.path(ALTINN_URL) + .build(altinnConfig.getOwner(), altinnConfig.getIdentifier())) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .retrieve() + .bodyToMono(AltinnResponseDTO.class) + .doOnError(WebClientFilter::logErrorMessage) + .doOnSuccess(value -> log.info("Altinn-tilgang hentet")); + } +} \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetExchangeTokenCommand.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetExchangeTokenCommand.java new file mode 100644 index 00000000000..b6037f76e01 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetExchangeTokenCommand.java @@ -0,0 +1,37 @@ +package no.nav.testnav.altinn3tilgangservice.consumer.altinn.command; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.util.concurrent.Callable; + +@Slf4j +@RequiredArgsConstructor +public class GetExchangeTokenCommand implements Callable> { + + private static final String ALTINN_URL = "/authentication/api/v1/exchange/maskinporten"; + + private final WebClient webClient; + private final String token; + + @Override + public Mono call() { + + return webClient + .get() + .uri(builder -> builder.path(ALTINN_URL) + .build() + ) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .retrieve() + .bodyToMono(String.class) + .doOnError(WebClientFilter::logErrorMessage) + .doOnSuccess(response -> log.info("Exchange token hentet fra Altinn")); + } +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AccessToken.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AccessToken.java new file mode 100644 index 00000000000..e69de29bb2d diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnResponseDTO.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnResponseDTO.java new file mode 100644 index 00000000000..720fec9136f --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnResponseDTO.java @@ -0,0 +1,44 @@ +package no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto; + +import com.fasterxml.jackson.databind.JsonNode; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.http.HttpStatus; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +import static java.util.Objects.isNull; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AltinnResponseDTO { + + private List data; + private String feilmelding; + private HttpStatus status; + + public List getData() { + + if (isNull(data)) { + data = new ArrayList<>(); + } + return data; + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class AccessListMembershipDTO { + + private String id; + private LocalDateTime since; + private JsonNode identifiers; + } +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/BrregResponseDTO.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/BrregResponseDTO.java new file mode 100644 index 00000000000..fd94b4134a2 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/BrregResponseDTO.java @@ -0,0 +1,65 @@ +package no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.http.HttpStatus; + +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BrregResponseDTO { + + private Embedded _embedded; + private Link _links; + + private String organisasjonsnummer; + private String feilmelding; + private HttpStatus status; + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class Embedded { + + private List enheter; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class Enhet { + + private String organisasjonsnummer; + private String navn; + private Organisasjonsform organisasjonsform; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class Organisasjonsform { + + private String kode; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class Link { + + private Self self; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class Self { + + private String href; + } +} \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/OrganisasjonCreateDTO.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/OrganisasjonCreateDTO.java new file mode 100644 index 00000000000..af1d881e965 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/OrganisasjonCreateDTO.java @@ -0,0 +1,18 @@ +package no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class OrganisasjonCreateDTO { + + public static final String ORGANISASJON_ID = "urn:altinn:organization:identifier-no"; + + private List data; + + public OrganisasjonCreateDTO(String orgnummer) { + + this.data = List.of("%s:%s".formatted(ORGANISASJON_ID, orgnummer)); + } +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/OrganisasjonDeleteDTO.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/OrganisasjonDeleteDTO.java new file mode 100644 index 00000000000..16d570268f2 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/OrganisasjonDeleteDTO.java @@ -0,0 +1,32 @@ +package no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static java.util.Objects.isNull; + +@Data +@NoArgsConstructor +public class OrganisasjonDeleteDTO { + + private List data; + + public List getData() { + + if (isNull(data)) { + data = new ArrayList<>(); + } + return data; + } + + public OrganisasjonDeleteDTO(Map organisasjon) { + + data = organisasjon.entrySet().stream() + .map(entry -> "%s:%s".formatted(entry.getKey(), entry.getValue())) + .toList(); + } +} \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/brreg/BrregConsumer.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/brreg/BrregConsumer.java new file mode 100644 index 00000000000..65c7c90466c --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/brreg/BrregConsumer.java @@ -0,0 +1,26 @@ +package no.nav.testnav.altinn3tilgangservice.consumer.brreg; + +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.BrregResponseDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.brreg.command.GetBrregEnheterCommand; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +@Service +public class BrregConsumer { + + private static final String BRREG_URL = "https://data.brreg.no"; + + private final WebClient webClient; + + public BrregConsumer(WebClient.Builder webClientBuilder) { + this.webClient = webClientBuilder + .baseUrl(BRREG_URL) + .build(); + } + + public Mono getEnheter(String orgnummer) { + + return new GetBrregEnheterCommand(webClient, orgnummer).call(); + } +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/brreg/command/GetBrregEnheterCommand.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/brreg/command/GetBrregEnheterCommand.java new file mode 100644 index 00000000000..7fca24c0dc0 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/brreg/command/GetBrregEnheterCommand.java @@ -0,0 +1,37 @@ +package no.nav.testnav.altinn3tilgangservice.consumer.brreg.command; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.BrregResponseDTO; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.util.concurrent.Callable; + +@Slf4j +@RequiredArgsConstructor +public class GetBrregEnheterCommand implements Callable> { + + private static final String BRREG_ENHETER_URL = "/enhetsregisteret/api/enheter"; + + private final WebClient webClient; + private final String organisasjonsnummer; + + @Override + public Mono call() { + + return webClient + .get() + .uri(builder -> builder.path(BRREG_ENHETER_URL) + .queryParam("organisasjonsnummer", organisasjonsnummer) + .build() + ) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .retrieve() + .bodyToMono(BrregResponseDTO.class) + .doOnError(WebClientFilter::logErrorMessage); + } +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/maskinporten/MaskinportenConsumer.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/maskinporten/MaskinportenConsumer.java new file mode 100644 index 00000000000..4ee44a8b126 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/maskinporten/MaskinportenConsumer.java @@ -0,0 +1,74 @@ +package no.nav.testnav.altinn3tilgangservice.consumer.maskinporten; + +import com.nimbusds.jose.JOSEObjectType; +import com.nimbusds.jose.JWSAlgorithm; +import com.nimbusds.jose.JWSHeader; +import com.nimbusds.jose.crypto.RSASSASigner; +import com.nimbusds.jose.jwk.RSAKey; +import com.nimbusds.jwt.JWTClaimsSet; +import com.nimbusds.jwt.SignedJWT; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import no.nav.testnav.altinn3tilgangservice.config.MaskinportenConfig; +import no.nav.testnav.altinn3tilgangservice.consumer.maskinporten.command.GetAccessTokenCommand; +import no.nav.testnav.altinn3tilgangservice.consumer.maskinporten.command.GetWellKnownCommand; +import no.nav.testnav.altinn3tilgangservice.consumer.maskinporten.dto.AccessToken; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.time.Instant; +import java.util.Date; +import java.util.UUID; + +@Slf4j +@Component +public class MaskinportenConsumer { + + private final WebClient webClient; + private final MaskinportenConfig maskinportenConfig; + + public MaskinportenConsumer(MaskinportenConfig maskinportenConfig, WebClient.Builder webClientBuilder) { + + this.webClient = webClientBuilder.build(); + this.maskinportenConfig = maskinportenConfig; + } + + public Mono getAccessToken() { + + return new GetWellKnownCommand(webClient, maskinportenConfig).call() + .flatMap(wellKnown -> new GetAccessTokenCommand(webClient, wellKnown, + createJwtClaims(wellKnown.issuer())).call()) + .map(AccessToken::accessToken); + } + + @SneakyThrows + private String createJwtClaims(String audience) { + + var now = Instant.now(); + var rsaKey = RSAKey.parse(maskinportenConfig.getMaskinportenClientJwk()); + return createSignedJWT(rsaKey, + new JWTClaimsSet.Builder() + .audience(audience) + .claim("scope", maskinportenConfig.getMaskinportenScopes()) + .issuer(maskinportenConfig.getMaskinportenClientId()) + .issueTime(Date.from(now)) + .expirationTime(Date.from(now.plusSeconds(120))) + .jwtID(UUID.randomUUID().toString()) + .build()) + .serialize(); + } + + @SneakyThrows + private SignedJWT createSignedJWT(RSAKey rsaJwk, JWTClaimsSet claimsSet) { + + var header = new JWSHeader.Builder(JWSAlgorithm.RS256) + .keyID(rsaJwk.getKeyID()) + .type(JOSEObjectType.JWT); + var signedJWT = new SignedJWT(header.build(), claimsSet); + var signer = new RSASSASigner(rsaJwk.toPrivateKey()); + signedJWT.sign(signer); + + return signedJWT; + } +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/maskinporten/command/GetAccessTokenCommand.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/maskinporten/command/GetAccessTokenCommand.java new file mode 100644 index 00000000000..ea87d47f598 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/maskinporten/command/GetAccessTokenCommand.java @@ -0,0 +1,37 @@ +package no.nav.testnav.altinn3tilgangservice.consumer.maskinporten.command; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.testnav.altinn3tilgangservice.consumer.maskinporten.dto.AccessToken; +import no.nav.testnav.altinn3tilgangservice.consumer.maskinporten.dto.WellKnown; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.time.Duration; +import java.util.concurrent.Callable; + +@Slf4j +@RequiredArgsConstructor +public class GetAccessTokenCommand implements Callable> { + private final WebClient webClient; + private final WellKnown wellKnown; + private final String assertion; + + @Override + public Mono call() { + + return webClient.post() + .uri(wellKnown.tokenEndpoint()) + .body(BodyInserters + .fromFormData("grant_type", wellKnown.grantTypesSupported().getFirst()) + .with("assertion", assertion) + ) + .retrieve() + .bodyToMono(AccessToken.class) + .doOnSuccess(value -> log.info("AccessToken hentet fra maskinporten.")) + .doOnError(WebClientFilter::logErrorMessage) + .cache(Duration.ofSeconds(10L)); + } +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/maskinporten/command/GetWellKnownCommand.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/maskinporten/command/GetWellKnownCommand.java new file mode 100644 index 00000000000..610d47944ad --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/maskinporten/command/GetWellKnownCommand.java @@ -0,0 +1,32 @@ +package no.nav.testnav.altinn3tilgangservice.consumer.maskinporten.command; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.testnav.altinn3tilgangservice.config.MaskinportenConfig; +import no.nav.testnav.altinn3tilgangservice.consumer.maskinporten.dto.WellKnown; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.time.Duration; +import java.util.concurrent.Callable; + +@Slf4j +@RequiredArgsConstructor +public class GetWellKnownCommand implements Callable> { + + private final WebClient webClient; + private final MaskinportenConfig maskinportenConfig; + + @Override + public Mono call() { + + return webClient.get() + .uri(maskinportenConfig.getMaskinportenWellKnownUrl()) + .retrieve() + .bodyToMono(WellKnown.class) + .doOnSuccess(value -> log.info("WellKnown hentet for maskinporten.")) + .doOnError(WebClientFilter::logErrorMessage) + .cache(Duration.ofDays(1L)); + } +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/maskinporten/dto/AccessToken.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/maskinporten/dto/AccessToken.java new file mode 100644 index 00000000000..c6e5df1c632 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/maskinporten/dto/AccessToken.java @@ -0,0 +1,16 @@ +package no.nav.testnav.altinn3tilgangservice.consumer.maskinporten.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public record AccessToken( + @JsonProperty("access_token") + String accessToken, + @JsonProperty("token_type") + String tokenType, + @JsonProperty("expires_in") + Integer expiresIn, + @JsonProperty("scope") + String scope +) { + +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/maskinporten/dto/WellKnown.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/maskinporten/dto/WellKnown.java new file mode 100644 index 00000000000..da3eb6903ce --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/maskinporten/dto/WellKnown.java @@ -0,0 +1,18 @@ +package no.nav.testnav.altinn3tilgangservice.consumer.maskinporten.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +public record WellKnown( + String issuer, + @JsonProperty("token_endpoint") + String tokenEndpoint, + @JsonProperty("jwks_uri") + String jwksUri, + @JsonProperty("token_endpoint_auth_methods_supported") + List tokenEndpointAuthMethodsSupported, + @JsonProperty("grant_types_supported") + List grantTypesSupported +) { +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/database/entity/OrganisasjonTilgang.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/database/entity/OrganisasjonTilgang.java new file mode 100644 index 00000000000..0fe0b183a2a --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/database/entity/OrganisasjonTilgang.java @@ -0,0 +1,31 @@ +package no.nav.testnav.altinn3tilgangservice.database.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.Id; +import org.springframework.data.annotation.Transient; +import org.springframework.data.relational.core.mapping.Column; +import org.springframework.data.relational.core.mapping.Table; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "ORGANISASJON_TILGANG") +public class OrganisasjonTilgang { + + @Id + @Column("ID") + private Long id; + + @Column("ORGANISAJON_NUMMER") + private String organisasjonNummer; + + @Column("miljoe") + private String miljoe; + + @Transient + private String feilmelding; +} \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/database/repository/OrganisasjonTilgangRepository.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/database/repository/OrganisasjonTilgangRepository.java new file mode 100644 index 00000000000..8b7b3096e23 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/database/repository/OrganisasjonTilgangRepository.java @@ -0,0 +1,16 @@ +package no.nav.testnav.altinn3tilgangservice.database.repository; + +import no.nav.testnav.altinn3tilgangservice.database.entity.OrganisasjonTilgang; +import org.springframework.data.repository.reactive.ReactiveCrudRepository; +import reactor.core.publisher.Mono; + +public interface OrganisasjonTilgangRepository extends ReactiveCrudRepository { + + Mono existsByOrganisasjonNummer(String orgnummer); + + Mono findByOrganisasjonNummer(String orgnummer); + + Mono save(OrganisasjonTilgang organisasjonTilgang); + + Mono deleteByOrganisasjonNummer(String orgnummer); +} \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/domain/Organisasjon.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/domain/Organisasjon.java new file mode 100644 index 00000000000..69eab5dff90 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/domain/Organisasjon.java @@ -0,0 +1,22 @@ +package no.nav.testnav.altinn3tilgangservice.domain; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.http.HttpStatus; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Organisasjon { + + private String navn; + private String organisasjonsnummer; + private String organisasjonsform; + private String url; + + private String feilmelding; + private HttpStatus status; +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/domain/OrganisasjonResponse.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/domain/OrganisasjonResponse.java new file mode 100644 index 00000000000..20f3b590a87 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/domain/OrganisasjonResponse.java @@ -0,0 +1,21 @@ +package no.nav.testnav.altinn3tilgangservice.domain; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OrganisasjonResponse { + + private String navn; + private String organisasjonsnummer; + private String organisasjonsform; + private String miljoe; + private String url; + + private String feilmelding; +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/mapper/BrrregResponseMappingStrategy.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/mapper/BrrregResponseMappingStrategy.java new file mode 100644 index 00000000000..bbbc3432445 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/mapper/BrrregResponseMappingStrategy.java @@ -0,0 +1,49 @@ +package no.nav.testnav.altinn3tilgangservice.mapper; + +import ma.glasnost.orika.CustomMapper; +import ma.glasnost.orika.MapperFactory; +import ma.glasnost.orika.MappingContext; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.BrregResponseDTO; +import no.nav.testnav.altinn3tilgangservice.domain.Organisasjon; +import org.springframework.stereotype.Component; + +import static java.util.Objects.nonNull; +import static org.apache.commons.lang3.StringUtils.isBlank; + +@Component +public class BrrregResponseMappingStrategy implements MappingStrategy { + + @Override + public void register(MapperFactory factory) { + factory.classMap(BrregResponseDTO.class, Organisasjon.class) + .customize(new CustomMapper<>() { + @Override + public void mapAtoB(BrregResponseDTO kilde, Organisasjon destinasjon, MappingContext context) { + + if (isBlank(kilde.getFeilmelding())) { + var link = kilde.get_links().getSelf().getHref(); + if (nonNull(kilde.get_embedded())) { + mapperFacade.map(kilde.get_embedded().getEnheter().getFirst(), destinasjon, context); + } else { + destinasjon.setNavn("Ukjent organisasjon hos BRREG"); + destinasjon.setOrganisasjonsform("???"); + destinasjon.setOrganisasjonsnummer(link.substring(link.indexOf('=') + 1)); + } + destinasjon.setUrl(link); + } + } + }) + .byDefault() + .register(); + + factory.classMap(BrregResponseDTO.Enhet.class, Organisasjon.class) + .customize(new CustomMapper<>() { + @Override + public void mapAtoB(BrregResponseDTO.Enhet kilde, Organisasjon destianasjon, MappingContext context) { + + destianasjon.setOrganisasjonsform(kilde.getOrganisasjonsform().getKode()); + } + }).byDefault() + .register(); + } +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/mapper/MapperFacadeConfig.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/mapper/MapperFacadeConfig.java new file mode 100644 index 00000000000..c0fe7cf844b --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/mapper/MapperFacadeConfig.java @@ -0,0 +1,35 @@ +package no.nav.testnav.altinn3tilgangservice.mapper; + +import ma.glasnost.orika.CustomConverter; +import ma.glasnost.orika.MapperFacade; +import ma.glasnost.orika.impl.DefaultMapperFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +import static java.util.Objects.nonNull; + +@Configuration +public class MapperFacadeConfig { + + @Bean + @SuppressWarnings("java:S3740") + MapperFacade mapperFacade(List mappingStrategies, List customConverters) { + DefaultMapperFactory mapperFactory = new DefaultMapperFactory.Builder().build(); + + if (nonNull(mappingStrategies)) { + for (MappingStrategy mapper : mappingStrategies) { + mapper.register(mapperFactory); + } + } + + if (nonNull(customConverters)) { + for (CustomConverter converter : customConverters) { + mapperFactory.getConverterFactory().registerConverter(converter); + } + } + + return mapperFactory.getMapperFacade(); + } +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/mapper/MappingStrategy.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/mapper/MappingStrategy.java new file mode 100644 index 00000000000..a8e49e743d4 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/mapper/MappingStrategy.java @@ -0,0 +1,19 @@ +package no.nav.testnav.altinn3tilgangservice.mapper; + +import ma.glasnost.orika.MapperFactory; + +@FunctionalInterface +public interface MappingStrategy { + + /** + * A callback for registering criteria on the provided {@link MapperFactory}. + *

+ *

{@code
+     *
+     * @Override public void register(MapperFactory factory) {
+     * factory.registerMapper(arbeidsfordelingToRestArbeidsfordeling());
+     * }
+     * }
+ */ + void register(MapperFactory factory); +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/mapper/OrganisajonTilgangMappingStrategy.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/mapper/OrganisajonTilgangMappingStrategy.java new file mode 100644 index 00000000000..da0153af926 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/mapper/OrganisajonTilgangMappingStrategy.java @@ -0,0 +1,33 @@ +package no.nav.testnav.altinn3tilgangservice.mapper; + +import ma.glasnost.orika.CustomMapper; +import ma.glasnost.orika.MapperFactory; +import ma.glasnost.orika.MappingContext; +import no.nav.testnav.altinn3tilgangservice.database.entity.OrganisasjonTilgang; +import no.nav.testnav.altinn3tilgangservice.domain.Organisasjon; +import no.nav.testnav.altinn3tilgangservice.domain.OrganisasjonResponse; +import org.springframework.stereotype.Component; + +import static java.util.Objects.nonNull; +import static org.apache.commons.lang3.StringUtils.isNotBlank; + +@Component +public class OrganisajonTilgangMappingStrategy implements MappingStrategy { + @Override + public void register(MapperFactory factory) { + + factory.classMap(Organisasjon.class, OrganisasjonResponse.class) + .customize(new CustomMapper<>() { + + @Override + public void mapAtoB(Organisasjon organisasjon, OrganisasjonResponse response, MappingContext context) { + + var organisasjonTilgang = (OrganisasjonTilgang) context.getProperty("tilgang"); + response.setMiljoe(nonNull(organisasjonTilgang) && isNotBlank(organisasjonTilgang.getMiljoe()) ? + organisasjonTilgang.getMiljoe() : "q1"); + } + }) + .byDefault() + .register(); + } +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnTilgangController.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnTilgangController.java new file mode 100644 index 00000000000..140f414c701 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnTilgangController.java @@ -0,0 +1,50 @@ +package no.nav.testnav.altinn3tilgangservice.provider; + +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.testnav.altinn3tilgangservice.domain.OrganisasjonResponse; +import no.nav.testnav.altinn3tilgangservice.service.AltinnTilgangService; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Flux; + +import java.util.Comparator; + +@Slf4j +@RestController +@RequestMapping("/api/v1/organisasjoner") +@RequiredArgsConstructor +public class AltinnTilgangController { + + private final AltinnTilgangService altinnTilgangService; + + @GetMapping + @Operation(description = "Henter alle organisasjoner med Altinn-tilgang") + public Flux getAll() { + + return altinnTilgangService.getAll() + .sort(Comparator.comparing(OrganisasjonResponse::getNavn)); + } + + @PostMapping("/{organisasjonsnummer}") + @Operation(description = "Oppretter Altinn-tilgang for organisasjon") + public Flux create(@PathVariable String organisasjonsnummer, + @RequestParam String miljoe) { + + return altinnTilgangService + .create(organisasjonsnummer, miljoe); + } + + @DeleteMapping("/{organisasjonsnummer}") + @Operation(description = "Sletter Altinn-tilgang for organisasjon") + public Flux delete(@PathVariable String organisasjonsnummer) { + + return altinnTilgangService.delete(organisasjonsnummer); + } +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/OrganisasjonMiljoeController.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/OrganisasjonMiljoeController.java new file mode 100644 index 00000000000..cc91176d3b5 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/OrganisasjonMiljoeController.java @@ -0,0 +1,38 @@ +package no.nav.testnav.altinn3tilgangservice.provider; + +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.testnav.altinn3tilgangservice.database.entity.OrganisasjonTilgang; +import no.nav.testnav.altinn3tilgangservice.service.MiljoerOversiktService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Mono; + +@Slf4j +@RestController +@RequestMapping("/api/v1/miljoer") +@RequiredArgsConstructor +public class OrganisasjonMiljoeController { + + private final MiljoerOversiktService miljoerOversiktService; + + @GetMapping("/organisasjon/{organisasjonsnummer}") + @Operation(description = "Henter miljøer for organisasjon") + public Mono getOrganisasjon(@PathVariable("organisasjonsnummer") String orgnummer) { + + return miljoerOversiktService.getMiljoe(orgnummer); + } + + @PutMapping("/organisasjon/{organisasjonsnummer}") + @Operation(description = "Endrer miljøer for organisasjon") + public Mono updateOrganisasjon(@PathVariable("organisasjonsnummer") String orgnummer, + @RequestParam String miljoe) { + + return miljoerOversiktService.updateMiljoe(orgnummer, miljoe); + } +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnTilgangService.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnTilgangService.java new file mode 100644 index 00000000000..d4151a28ecf --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnTilgangService.java @@ -0,0 +1,91 @@ +package no.nav.testnav.altinn3tilgangservice.service; + +import lombok.RequiredArgsConstructor; +import ma.glasnost.orika.MapperFacade; +import ma.glasnost.orika.MappingContext; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.AltinnConsumer; +import no.nav.testnav.altinn3tilgangservice.database.entity.OrganisasjonTilgang; +import no.nav.testnav.altinn3tilgangservice.database.repository.OrganisasjonTilgangRepository; +import no.nav.testnav.altinn3tilgangservice.domain.Organisasjon; +import no.nav.testnav.altinn3tilgangservice.domain.OrganisasjonResponse; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import static org.apache.commons.lang3.BooleanUtils.isTrue; +import static org.apache.commons.lang3.StringUtils.isBlank; + +@Service +@RequiredArgsConstructor +public class AltinnTilgangService { + + private static final String ORGANISASJON_TILGANG = "tilgang"; + private final AltinnConsumer altinnConsumer; + private final OrganisasjonTilgangRepository organisasjonTilgangRepository; + private final MapperFacade mapperFacade; + + public Flux getAll() { + + return altinnConsumer.getOrganisasjoner() + .flatMap(this::convertResponse); + } + + public Flux create(String orgnummer, String miljoe) { + + return altinnConsumer.create(orgnummer) + .flatMap(altinnOrg -> { + if (isBlank(altinnOrg.getFeilmelding())) { + return saveOrganisasjon(orgnummer, miljoe) + .map(tilgang -> { + var context = new MappingContext.Factory().getContext(); + context.setProperty(ORGANISASJON_TILGANG, tilgang); + return mapperFacade.map(altinnOrg, OrganisasjonResponse.class, context); + }); + } else { + var context = new MappingContext.Factory().getContext(); + context.setProperty(ORGANISASJON_TILGANG, OrganisasjonTilgang.builder() + .organisasjonNummer(orgnummer) + .miljoe(miljoe) + .build()); + return Mono.just(mapperFacade.map(altinnOrg, OrganisasjonResponse.class, context)); + } + }); + } + + public Flux delete(String organisasjonsnummer) { + + return organisasjonTilgangRepository.deleteByOrganisasjonNummer(organisasjonsnummer) + .flatMapMany(result -> altinnConsumer.delete(organisasjonsnummer)) + .flatMap(this::convertResponse); + } + + private Mono convertResponse(Organisasjon organisasjon) { + + return organisasjonTilgangRepository + .existsByOrganisasjonNummer(organisasjon.getOrganisasjonsnummer()) + .flatMap(exists -> isTrue(exists) ? + organisasjonTilgangRepository + .findByOrganisasjonNummer(organisasjon.getOrganisasjonsnummer()) : + Mono.just(new OrganisasjonTilgang())) + .map(organisasjonTilgang -> { + var context = new MappingContext.Factory().getContext(); + context.setProperty(ORGANISASJON_TILGANG, organisasjonTilgang); + return mapperFacade.map(organisasjon, OrganisasjonResponse.class, context); + }); + } + + private Mono saveOrganisasjon(String orgnummer, String miljoe) { + + return organisasjonTilgangRepository.existsByOrganisasjonNummer(orgnummer) + .flatMap(exists -> isTrue(exists) ? + organisasjonTilgangRepository.findByOrganisasjonNummer(orgnummer) + .flatMap(organisasjon -> { + organisasjon.setMiljoe(miljoe); + return organisasjonTilgangRepository.save(organisasjon); + }) : + organisasjonTilgangRepository.save(OrganisasjonTilgang.builder() + .organisasjonNummer(orgnummer) + .miljoe(miljoe) + .build())); + } +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/MiljoerOversiktService.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/MiljoerOversiktService.java new file mode 100644 index 00000000000..81202173881 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/MiljoerOversiktService.java @@ -0,0 +1,63 @@ +package no.nav.testnav.altinn3tilgangservice.service; + +import lombok.RequiredArgsConstructor; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.AltinnConsumer; +import no.nav.testnav.altinn3tilgangservice.database.entity.OrganisasjonTilgang; +import no.nav.testnav.altinn3tilgangservice.database.repository.OrganisasjonTilgangRepository; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Mono; + +import static org.apache.commons.lang3.BooleanUtils.isTrue; + +@Service +@RequiredArgsConstructor +public class MiljoerOversiktService { + + private final AltinnConsumer altinnConsumer; + private final OrganisasjonTilgangRepository organisasjonTilgangRepository; + + public Mono getMiljoe(String orgnummer) { + + return altinnConsumer.getOrganisasjoner() + .collectList() + .flatMap(bedrifter -> { + + if (bedrifter.stream().anyMatch(bedrift -> + orgnummer.equals(bedrift.getOrganisasjonsnummer()))) { + + return organisasjonTilgangRepository.existsByOrganisasjonNummer(orgnummer) + .flatMap(exists -> isTrue(exists) ? + organisasjonTilgangRepository.findByOrganisasjonNummer(orgnummer) : + Mono.just(OrganisasjonTilgang.builder() + .organisasjonNummer(orgnummer) + .miljoe("q1") + .build())); + } else { + return throwError(orgnummer); + } + }); + } + + public Mono updateMiljoe(String orgnummer, String miljoe) { + + return organisasjonTilgangRepository.existsByOrganisasjonNummer(orgnummer) + .flatMap(exists -> isTrue(exists) ? + organisasjonTilgangRepository.findByOrganisasjonNummer(orgnummer) + .flatMap(organisasjon -> { + organisasjon.setMiljoe(miljoe); + return organisasjonTilgangRepository.save(organisasjon); + }) : + organisasjonTilgangRepository.save(OrganisasjonTilgang.builder() + .organisasjonNummer(orgnummer) + .miljoe(miljoe) + .build())); + } + + private static Mono throwError(String orgnummer) { + + return Mono.just(OrganisasjonTilgang.builder() + .organisasjonNummer(orgnummer) + .feilmelding("404 Not found: Organisasjonsnummer %s ble ikke funnet".formatted(orgnummer)) + .build()); + } +} diff --git a/apps/altinn3-tilgang-service/src/main/resources/application-dev.yml b/apps/altinn3-tilgang-service/src/main/resources/application-dev.yml new file mode 100644 index 00000000000..0335878de67 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/resources/application-dev.yml @@ -0,0 +1,17 @@ +ALTINN_URL: https://platform.tt02.altinn.no + +spring: + flyway: + locations: classpath:db/migration + url: ${NAIS_DATABASE_TESTNAV_ALTINN3_TILGANG_TESTNAV_ALTINN3_TILGANG_JDBC_URL} + user: ${NAIS_DATABASE_TESTNAV_ALTINN3_TILGANG_TESTNAV_ALTINN3_TILGANG_USERNAME} + password: ${NAIS_DATABASE_TESTNAV_ALTINN3_TILGANG_TESTNAV_ALTINN3_TILGANG_PASSWORD} + r2dbc: + url: r2dbc:postgresql://${NAIS_DATABASE_TESTNAV_ALTINN3_TILGANG_TESTNAV_ALTINN3_TILGANG_HOST}:${NAIS_DATABASE_TESTNAV_ALTINN3_TILGANG_TESTNAV_ALTINN3_TILGANG_PORT}/${NAIS_DATABASE_TESTNAV_ALTINN3_TILGANG_TESTNAV_ALTINN3_TILGANG_DATABASE} + username: ${NAIS_DATABASE_TESTNAV_ALTINN3_TILGANG_TESTNAV_ALTINN3_TILGANG_USERNAME} + password: ${NAIS_DATABASE_TESTNAV_ALTINN3_TILGANG_TESTNAV_ALTINN3_TILGANG_PASSWORD} + properties: + sslCert: ${NAIS_DATABASE_TESTNAV_ALTINN3_TILGANG_TESTNAV_ALTINN3_TILGANG_SSLCERT} + sslKey: /tmp/pk8.pem # See Dockerfile and 99-dolly-convert-to-pk8.sh. + sslMode: ${NAIS_DATABASE_TESTNAV_ALTINN3_TILGANG_TESTNAV_ALTINN3_TILGANG_SSLMODE} + sslRootCert: ${NAIS_DATABASE_TESTNAV_ALTINN3_TILGANG_TESTNAV_ALTINN3_TILGANG_SSLROOTCERT} \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/src/main/resources/application-local.yml b/apps/altinn3-tilgang-service/src/main/resources/application-local.yml new file mode 100644 index 00000000000..7e9211a71ae --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/resources/application-local.yml @@ -0,0 +1,29 @@ +TOKEN_X_ISSUER: dummy + +ALTINN_URL: https://tt02.altinn.no + +MASKINPORTEN_CLIENT_ID: dummy +MASKINPORTEN_CLIENT_JWK: dummy +MASKINPORTEN_SCOPES: dummy +MASKINPORTEN_WELL_KNOWN_URL: https://test.maskinporten.no/.well-known/oauth-authorization-server + +spring: + cache: + type: none + cloud: + gcp: + secretmanager: + project-id: dolly-dev-ff83 + config: + import: "sm://" + flyway: + enabled: true + locations: classpath:db/migration + baseline-on-migrate: true + url: jdbc:postgresql://localhost:5432/testnav-altinn3-tilgang-local + user: testnav-altinn3-tilgang-local + password: ${sm://testnav-altinn3-tilgang-local} + r2dbc: + url: r2dbc:postgresql://localhost:5432/testnav-altinn3-tilgang-local + username: testnav-altinn3-tilgang-local + password: ${sm://testnav-altinn3-tilgang-local} \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/src/main/resources/application-prod.yml b/apps/altinn3-tilgang-service/src/main/resources/application-prod.yml new file mode 100644 index 00000000000..00fc0d3389d --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/resources/application-prod.yml @@ -0,0 +1,17 @@ +ALTINN_URL: https://platform.altinn.no + +spring: + flyway: + locations: classpath:db/migration + url: ${NAIS_DATABASE_TESTNAV_ALTINN3_TILGANG_TESTNAV_ALTINN3_TILGANG_JDBC_URL} + user: ${NAIS_DATABASE_TESTNAV_ALTINN3_TILGANG_TESTNAV_ALTINN3_TILGANG_USERNAME} + password: ${NAIS_DATABASE_TESTNAV_ALTINN3_TILGANG_TESTNAV_ALTINN3_TILGANG_PASSWORD} + r2dbc: + url: r2dbc:postgresql://${NAIS_DATABASE_TESTNAV_ALTINN3_TILGANG_TESTNAV_ALTINN3_TILGANG_HOST}:${NAIS_DATABASE_TESTNAV_ALTINN3_TILGANG_TESTNAV_ALTINN3_TILGANG_PORT}/${NAIS_DATABASE_TESTNAV_ALTINN3_TILGANG_TESTNAV_ALTINN3_TILGANG_DATABASE} + username: ${NAIS_DATABASE_TESTNAV_ALTINN3_TILGANG_TESTNAV_ALTINN3_TILGANG_USERNAME} + password: ${NAIS_DATABASE_TESTNAV_ALTINN3_TILGANG_TESTNAV_ALTINN3_TILGANG_PASSWORD} + properties: + sslCert: ${NAIS_DATABASE_TESTNAV_ALTINN3_TILGANG_TESTNAV_ALTINN3_TILGANG_SSLCERT} + sslKey: /tmp/pk8.pem # See Dockerfile and 99-dolly-convert-to-pk8.sh. + sslMode: ${NAIS_DATABASE_TESTNAV_ALTINN3_TILGANG_TESTNAV_ALTINN3_TILGANG_SSLMODE} + sslRootCert: ${NAIS_DATABASE_TESTNAV_ALTINN3_TILGANG_TESTNAV_ALTINN3_TILGANG_SSLROOTCERT} \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/src/main/resources/application.yml b/apps/altinn3-tilgang-service/src/main/resources/application.yml new file mode 100644 index 00000000000..ef6e80ec702 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/resources/application.yml @@ -0,0 +1,58 @@ +AAD_ISSUER_URI: https://login.microsoftonline.com/62366534-1ec3-4962-8869-9b5535279d0b + +spring: + application: + version: application.version.todo + name: testnav-altinn3-tilgang-service + desciption: Tjeneste for å hente og sette tilganger for orgnisasjoner + security: + oauth2: + resourceserver: + aad: + 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} + jackson: + serialization: + write_dates_as_timestamps: false + cloud: + vault: + enabled: false + +springdoc: + swagger-ui: + disable-swagger-default-url: true + url: /v3/api-docs + +altinn: + api: + url: ${ALTINN_URL} + resource: + owner: nav + identifier: godkjente-dolly-tilganger + +management: + endpoints: + enabled-by-default: true + web: + base-path: /internal + exposure.include: prometheus,heapdump,health + path-mapping: + prometheus: metrics + endpoint: + prometheus.enabled: true + heapdump.enabled: true + prometheus: + metrics: + export: + enabled: true +server: + servlet: + encoding: + charset: UTF-8 + error: + include-message: always \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/src/main/resources/db/migration/V1.0.0__CreateTables.sql b/apps/altinn3-tilgang-service/src/main/resources/db/migration/V1.0.0__CreateTables.sql new file mode 100644 index 00000000000..074fa6a3eb9 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/resources/db/migration/V1.0.0__CreateTables.sql @@ -0,0 +1,10 @@ +------------------------------- +-- C R E A T E T A B L E S -- +------------------------------- + +create table organisasjon_tilgang +( + id serial primary key, + organisajon_nummer varchar(50) unique, + miljoe varchar(100) +); \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/src/main/resources/logback-spring.xml b/apps/altinn3-tilgang-service/src/main/resources/logback-spring.xml new file mode 100644 index 00000000000..43e833f00b6 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/resources/logback-spring.xml @@ -0,0 +1,32 @@ + + + + + + -1 + true + - + + + + + + + + + + + + %d{HH:mm:ss.SSS} | %5p | %logger{25} | %m%n + + utf8 + + + + + + + + + + \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/src/test/java/no/nav/testnav/altinn3tilgangservice/ApplicationContextTest.java b/apps/altinn3-tilgang-service/src/test/java/no/nav/testnav/altinn3tilgangservice/ApplicationContextTest.java new file mode 100644 index 00000000000..3fed84b2557 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/test/java/no/nav/testnav/altinn3tilgangservice/ApplicationContextTest.java @@ -0,0 +1,24 @@ +package no.nav.testnav.altinn3tilgangservice; + +import com.google.cloud.secretmanager.v1.SecretManagerServiceClient; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.security.oauth2.jwt.ReactiveJwtDecoder; +import org.springframework.test.context.ActiveProfiles; + +@SpringBootTest +@ActiveProfiles("test") +class ApplicationContextTest { + + @MockBean + public ReactiveJwtDecoder jwtDecoder; + + @MockBean + public SecretManagerServiceClient secretManagerClient; + + @Test + @SuppressWarnings("java:S2699") + void load_app_context() { + } +} diff --git a/apps/altinn3-tilgang-service/src/test/resources/application-test.yml b/apps/altinn3-tilgang-service/src/test/resources/application-test.yml new file mode 100644 index 00000000000..dfbee67495e --- /dev/null +++ b/apps/altinn3-tilgang-service/src/test/resources/application-test.yml @@ -0,0 +1,7 @@ +ALTINN_URL: http://localhost:8080 +ALTINN_API_KEY: dummy +MASKINPORTEN_CLIENT_ID: dummy +MASKINPORTEN_CLIENT_JWK: dummy +MASKINPORTEN_SCOPES: dummy +MASKINPORTEN_WELL_KNOWN_URL: http://localhost:8080 +TOKEN_X_ISSUER: dummy \ No newline at end of file diff --git a/apps/dolly-frontend/config.idporten.yml b/apps/dolly-frontend/config.idporten.yml index 4d9bce7df8e..2e7cee39d37 100644 --- a/apps/dolly-frontend/config.idporten.yml +++ b/apps/dolly-frontend/config.idporten.yml @@ -57,6 +57,8 @@ spec: - application: testnorge-profil-api - application: testnorge-tilbakemelding-api - application: testnav-yrkesskade-proxy + - application: testnav-altinn3-tilgang-service-prod + cluster: prod-gcp external: - host: testnav-pensjon-testdata-facade-proxy.dev-fss-pub.nais.io - host: testnav-sigrunstub-proxy.dev-fss-pub.nais.io @@ -73,6 +75,7 @@ spec: - host: testnav-brregstub-proxy.dev-fss-pub.nais.io - host: testnav-dokarkiv-proxy.dev-fss-pub.nais.io - host: idporten.no + - host: testnav-altinn3-tilgang-service.nav.no liveness: path: /internal/isAlive diff --git a/apps/dolly-frontend/config.test.yml b/apps/dolly-frontend/config.test.yml index 45bf1b3dbd2..82ee8248030 100644 --- a/apps/dolly-frontend/config.test.yml +++ b/apps/dolly-frontend/config.test.yml @@ -63,6 +63,7 @@ spec: - application: testnav-levende-arbeidsforhold-scheduler - application: testnav-skattekort-service - application: testnav-yrkesskade-proxy + - application: testnav-altinn3-tilgang-service external: - host: testnav-pensjon-testdata-facade-proxy.dev-fss-pub.nais.io - host: testnav-sigrunstub-proxy.dev-fss-pub.nais.io diff --git a/apps/dolly-frontend/config.unstable.yml b/apps/dolly-frontend/config.unstable.yml index 62416c37c82..7a6b3df1dba 100644 --- a/apps/dolly-frontend/config.unstable.yml +++ b/apps/dolly-frontend/config.unstable.yml @@ -56,6 +56,7 @@ spec: - application: testnorge-tilbakemelding-api - application: testnav-skattekort-service - application: testnav-yrkesskade-proxy + - application: testnav-altinn3-tilgang-service external: - host: testnav-pensjon-testdata-facade-proxy.dev-fss-pub.nais.io - host: testnav-sigrunstub-proxy.dev-fss-pub.nais.io diff --git a/apps/dolly-frontend/config.yml b/apps/dolly-frontend/config.yml index 851b7e85ed9..f8681ddb000 100644 --- a/apps/dolly-frontend/config.yml +++ b/apps/dolly-frontend/config.yml @@ -67,7 +67,8 @@ spec: - application: testnav-levende-arbeidsforhold-ansettelse - application: testnav-levende-arbeidsforhold-scheduler - application: testnav-yrkesskade-proxy - + - application: testnav-altinn3-tilgang-service-prod + cluster: prod-gcp external: - host: testnav-pensjon-testdata-facade-proxy.dev-fss-pub.nais.io - host: testnav-sigrunstub-proxy.dev-fss-pub.nais.io @@ -83,6 +84,7 @@ spec: - host: testnav-norg2-proxy.dev-fss-pub.nais.io - host: testnav-brregstub-proxy.dev-fss-pub.nais.io - host: testnav-dokarkiv-proxy.dev-fss-pub.nais.io + - host: testnav-altinn3-tilgang-service.nav.no liveness: path: /internal/isAlive initialDelay: 20 diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java index 265f37443c5..81f13833178 100644 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java @@ -62,7 +62,6 @@ public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { .route(createRoute(consumers.getOppsummeringsdokumentService(), "oppsummeringsdokument-service")) .route(createRoute(consumers.getTestnavOrganisasjonForvalter())) .route(createRoute(consumers.getTestnavVarslingerService(), "testnav-varslinger-service")) - .route(createRoute(consumers.getTestnavOrganisasjonTilgangService(), "testnav-organisasjon-tilgang-service")) .route(createRoute(consumers.getTestnavTpsMessagingService(), "testnav-tps-messaging-service")) .route(createRoute(consumers.getTestnorgeProfilApi(), "testnorge-profil-api")) .route(createRoute(consumers.getTestnavBrukerService(), "testnav-bruker-service")) @@ -98,6 +97,7 @@ public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { .route(createRoute(consumers.getTestnavLevendeArbeidsforholdAnsettelse(), "testnav-levende-arbeidsforhold-ansettelse")) .route(createRoute(consumers.getTestnavLevendeArbeidsforholdScheduler(), "testnav-levende-arbeidsforhold-scheduler")) .route(createRoute(consumers.getTestnavYrkesskadeProxy())) + .route(createRoute(consumers.getTestnavAltinn3TilgangService(), "testnav-altinn3-tilgang-service")) .build(); } diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java index 0217856ea1d..cb6139fe641 100644 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java @@ -49,7 +49,6 @@ public class Consumers { private ServerProperties testnavOrganisasjonFasteDataService; private ServerProperties testnavOrganisasjonForvalter; private ServerProperties testnavOrganisasjonService; - private ServerProperties testnavOrganisasjonTilgangService; private ServerProperties testnavPdlForvalter; private ServerProperties testnavPensjonTestdataFacadeProxy; private ServerProperties testnavPersonOrganisasjonTilgangService; @@ -67,5 +66,6 @@ public class Consumers { private ServerProperties testnavLevendeArbeidsforholdAnsettelse; private ServerProperties testnavLevendeArbeidsforholdScheduler; private ServerProperties testnavYrkesskadeProxy; + private ServerProperties testnavAltinn3TilgangService; } diff --git a/apps/dolly-frontend/src/main/js/package.json b/apps/dolly-frontend/src/main/js/package.json index 846ac1e1cc0..46691e3ea7b 100644 --- a/apps/dolly-frontend/src/main/js/package.json +++ b/apps/dolly-frontend/src/main/js/package.json @@ -114,5 +114,6 @@ "semi": false, "useTabs": true, "printWidth": 100 - } + }, + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/apps/dolly-frontend/src/main/js/proxy-routes.json b/apps/dolly-frontend/src/main/js/proxy-routes.json index 843d1003414..f521c3b14b7 100644 --- a/apps/dolly-frontend/src/main/js/proxy-routes.json +++ b/apps/dolly-frontend/src/main/js/proxy-routes.json @@ -144,7 +144,7 @@ "changeOrigin": true, "secure": false }, - "/testnav-organisasjon-tilgang-service/api": { + "/testnav-altinn3-tilgang-service/api": { "target": "http://localhost:8020", "changeOrigin": true, "secure": false diff --git a/apps/dolly-frontend/src/main/js/src/pages/adminPages/Orgtilgang/OrgOversikt.tsx b/apps/dolly-frontend/src/main/js/src/pages/adminPages/Orgtilgang/OrgOversikt.tsx index acbb57d55f5..09586b69d52 100644 --- a/apps/dolly-frontend/src/main/js/src/pages/adminPages/Orgtilgang/OrgOversikt.tsx +++ b/apps/dolly-frontend/src/main/js/src/pages/adminPages/Orgtilgang/OrgOversikt.tsx @@ -34,7 +34,6 @@ export const OrgOversikt = ({ organisasjonTilgang, loading, error, mutate }: Ove Navn Form Miljø - Gyldig til Endre org. @@ -46,7 +45,6 @@ export const OrgOversikt = ({ organisasjonTilgang, loading, error, mutate }: Ove {navn} {organisasjonsform} {miljoe} - {formatDate(gyldigTil)} diff --git a/apps/dolly-frontend/src/main/js/src/pages/adminPages/Orgtilgang/OrgtilgangForm.tsx b/apps/dolly-frontend/src/main/js/src/pages/adminPages/Orgtilgang/OrgtilgangForm.tsx index bb56706201b..85d2358504b 100644 --- a/apps/dolly-frontend/src/main/js/src/pages/adminPages/Orgtilgang/OrgtilgangForm.tsx +++ b/apps/dolly-frontend/src/main/js/src/pages/adminPages/Orgtilgang/OrgtilgangForm.tsx @@ -86,7 +86,6 @@ export const OrgtilgangForm = ({ mutate }: any) => { isMulti={true} size="medium" /> -
diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/arena/form/Form.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/arena/form/Form.tsx index 99ce1f66e91..047c883f662 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/arena/form/Form.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/arena/form/Form.tsx @@ -1,5 +1,5 @@ import React, { useContext } from 'react' -import _ from 'lodash' +import * as _ from 'lodash-es' import { ifPresent } from '@/utils/YupValidations' import { Vis } from '@/components/bestillingsveileder/VisAttributt' import Panel from '@/components/ui/panel/Panel' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/arena/form/partials/MedServicebehov.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/arena/form/partials/MedServicebehov.tsx index 9b8c8f2ab6a..5d793a7fc00 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/arena/form/partials/MedServicebehov.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/arena/form/partials/MedServicebehov.tsx @@ -3,7 +3,7 @@ import { Kategori } from '@/components/ui/form/kategori/Kategori' import { SelectOptionsManager as Options } from '@/service/SelectOptions' import { FormSelect } from '@/components/ui/form/inputs/select/Select' import { FormDatepicker } from '@/components/ui/form/inputs/datepicker/Datepicker' -import _ from 'lodash' +import * as _ from 'lodash-es' import { Alert } from '@navikt/ds-react' import { BestillingsveilederContext } from '@/components/bestillingsveileder/BestillingsveilederContext' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/arena/form/validation.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/arena/form/validation.tsx index 4167111820d..ccac6140484 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/arena/form/validation.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/arena/form/validation.tsx @@ -1,7 +1,7 @@ import * as Yup from 'yup' import { messages, requiredString } from '@/utils/YupValidations' import { isAfter, isBefore, isEqual } from 'date-fns' -import _ from 'lodash' +import * as _ from 'lodash-es' const ikkeOverlappendeVedtak = ['aap', 'dagpenger'] diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/bankkonto/form/UtenlandskBankkonto.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/bankkonto/form/UtenlandskBankkonto.tsx index d4b7c9fd2f3..391d7772725 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/bankkonto/form/UtenlandskBankkonto.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/bankkonto/form/UtenlandskBankkonto.tsx @@ -4,7 +4,7 @@ import { FormTextInput } from '@/components/ui/form/inputs/textInput/TextInput' import { ArbeidKodeverk, GtKodeverk } from '@/config/kodeverk' import { Vis } from '@/components/bestillingsveileder/VisAttributt' import { FormCheckbox } from '@/components/ui/form/inputs/checbox/Checkbox' -import _ from 'lodash' +import * as _ from 'lodash-es' import { landkodeIsoMapping } from '@/service/services/kontoregister/landkoder' const path = 'bankkonto.utenlandskBankkonto' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/bankkonto/form/validation.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/bankkonto/form/validation.tsx index d90e71ef488..8751a1f7ee1 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/bankkonto/form/validation.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/bankkonto/form/validation.tsx @@ -1,6 +1,6 @@ import * as Yup from 'yup' import { ifPresent, messages, requiredString } from '@/utils/YupValidations' -import _ from 'lodash' +import * as _ from 'lodash-es' import { landkodeIsoMapping, landkoder } from '@/service/services/kontoregister/landkoder' const validInputOrCheckboxTest = (val, checkboxPath, feilmelding, inputValidation) => { diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/brregstub/form/partials/organisasjonTextSelect.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/brregstub/form/partials/organisasjonTextSelect.tsx index 042e4421650..a4e0c29b981 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/brregstub/form/partials/organisasjonTextSelect.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/brregstub/form/partials/organisasjonTextSelect.tsx @@ -3,7 +3,7 @@ import { OrganisasjonMedMiljoeSelect } from '@/components/organisasjonSelect/Org import { useBoolean } from 'react-use' import { OrgserviceApi } from '@/service/Api' import { OrgInfoAdresse } from '@/service/services/organisasjonservice/types' -import _ from 'lodash' +import * as _ from 'lodash-es' import { useFormContext } from 'react-hook-form' interface OrgnanisasjonTextSelectProps { diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/dokarkiv/form/DokarkivForm.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/dokarkiv/form/DokarkivForm.tsx index b67cfa5c37c..4a8bedfdff5 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/dokarkiv/form/DokarkivForm.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/dokarkiv/form/DokarkivForm.tsx @@ -1,33 +1,19 @@ import React, { BaseSyntheticEvent, useEffect, useState } from 'react' -import * as Yup from 'yup' -import { ifPresent, requiredString } from '@/utils/YupValidations' import { Vis } from '@/components/bestillingsveileder/VisAttributt' import { Kategori } from '@/components/ui/form/kategori/Kategori' import { FormSelect } from '@/components/ui/form/inputs/select/Select' import { DollyTextInput, FormTextInput } from '@/components/ui/form/inputs/textInput/TextInput' import Panel from '@/components/ui/panel/Panel' import { erForsteEllerTest, panelError } from '@/components/ui/form/formUtils' -import _ from 'lodash' +import * as _ from 'lodash-es' import { FormCheckbox } from '@/components/ui/form/inputs/checbox/Checkbox' import { SelectOptionsManager as Options } from '@/service/SelectOptions' -import { UseFormReturn } from 'react-hook-form/dist/types' import { useFormContext } from 'react-hook-form' import { Option } from '@/service/SelectOptionsOppslag' import { useKodeverk } from '@/utils/hooks/useKodeverk' - -const Digitalinnsending = React.lazy( - () => import('@/components/fagsystem/dokarkiv/form/partials/Digitalinnsending'), -) - -const FileUploader = React.lazy(() => import('@/utils/FileUploader/FileUploader')) - -const DokumentInfoListe = React.lazy( - () => import('@/components/fagsystem/dokarkiv/modal/DokumentInfoListe'), -) - -interface DokarkivFormProps { - formMethods: UseFormReturn -} +import Digitalinnsending from './partials/Digitalinnsending' +import FileUploader from '@/utils/FileUploader/FileUploader' +import DokumentInfoListe from '@/components/fagsystem/dokarkiv/modal/DokumentInfoListe' type Skjema = { data: string @@ -53,9 +39,9 @@ enum Kodeverk { BEHANDLINGSTEMA = 'Behandlingstema', } -export const dokarkivAttributt = 'dokarkiv' +const dokarkivAttributt = 'dokarkiv' -export const DokarkivForm = () => { +const DokarkivForm = () => { const formMethods = useFormContext() if (!formMethods.watch(dokarkivAttributt)) { return null @@ -208,76 +194,4 @@ export const DokarkivForm = () => { ) } -DokarkivForm.validation = { - dokarkiv: ifPresent( - '$dokarkiv', - Yup.object({ - tittel: requiredString, - tema: requiredString, - journalfoerendeEnhet: Yup.string() - .optional() - .nullable() - .matches(/^\d*$/, 'Journalfoerende enhet må enten være blank eller et tall med 4 sifre') - .test( - 'len', - 'Journalfoerende enhet må enten være blank eller et tall med 4 sifre', - (val) => !val || (val && val.length === 4), - ), - sak: Yup.object({ - sakstype: requiredString, - fagsaksystem: Yup.string().when('sakstype', { - is: 'FAGSAK', - then: () => requiredString, - otherwise: () => Yup.mixed().notRequired(), - }), - fagsakId: Yup.string().when('sakstype', { - is: 'FAGSAK', - then: () => requiredString, - otherwise: () => Yup.mixed().notRequired(), - }), - }), - avsenderMottaker: Yup.object({ - idType: Yup.string().optional().nullable(), - id: Yup.string() - .when('idType', { - is: 'ORGNR', - then: () => - Yup.string() - .matches(/^\d*$/, 'Orgnummer må være et tall med 9 sifre') - .test( - 'len', - 'Orgnummer må være et tall med 9 sifre', - (val) => val && val.length === 9, - ), - }) - .when('idType', { - is: 'FNR', - then: () => - Yup.string() - .matches(/^\d*$/, 'Ident må være et tall med 11 sifre') - .test( - 'len', - 'Ident må være et tall med 11 sifre', - (val) => val && val.length === 11, - ), - }), - navn: Yup.string().optional(), - }), - dokumenter: Yup.array().of( - Yup.object({ - tittel: requiredString, - brevkode: Yup.string().test( - 'is-valid-brevkode', - 'Feltet er påkrevd', - (_val, testContext) => { - const fullForm = - testContext.from && testContext.from[testContext.from.length - 1]?.value - const brevkode = _.get(fullForm, 'dokarkiv.dokumenter[0].brevkode') - return brevkode !== '' - }, - ), - }), - ), - }), - ), -} +export default DokarkivForm diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/dokarkiv/form/DokarkivValidation.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/dokarkiv/form/DokarkivValidation.tsx new file mode 100644 index 00000000000..cdebc38e629 --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/dokarkiv/form/DokarkivValidation.tsx @@ -0,0 +1,77 @@ +import * as Yup from 'yup' +import { ifPresent, requiredString } from '@/utils/YupValidations' +import * as _ from 'lodash-es' + +export const dokarkivValidation = { + dokarkiv: ifPresent( + '$dokarkiv', + Yup.object({ + tittel: requiredString, + tema: requiredString, + journalfoerendeEnhet: Yup.string() + .optional() + .nullable() + .matches(/^\d*$/, 'Journalfoerende enhet må enten være blank eller et tall med 4 sifre') + .test( + 'len', + 'Journalfoerende enhet må enten være blank eller et tall med 4 sifre', + (val) => !val || (val && val.length === 4), + ), + sak: Yup.object({ + sakstype: requiredString, + fagsaksystem: Yup.string().when('sakstype', { + is: 'FAGSAK', + then: () => requiredString, + otherwise: () => Yup.mixed().notRequired(), + }), + fagsakId: Yup.string().when('sakstype', { + is: 'FAGSAK', + then: () => requiredString, + otherwise: () => Yup.mixed().notRequired(), + }), + }), + avsenderMottaker: Yup.object({ + idType: Yup.string().optional().nullable(), + id: Yup.string() + .when('idType', { + is: 'ORGNR', + then: () => + Yup.string() + .matches(/^\d*$/, 'Orgnummer må være et tall med 9 sifre') + .test( + 'len', + 'Orgnummer må være et tall med 9 sifre', + (val) => val && val.length === 9, + ), + }) + .when('idType', { + is: 'FNR', + then: () => + Yup.string() + .matches(/^\d*$/, 'Ident må være et tall med 11 sifre') + .test( + 'len', + 'Ident må være et tall med 11 sifre', + (val) => val && val.length === 11, + ), + }), + navn: Yup.string().optional(), + }), + dokumenter: Yup.array().of( + Yup.object({ + tittel: requiredString, + brevkode: Yup.string().test( + 'is-valid-brevkode', + 'Feltet er påkrevd', + (_val, testContext) => { + const fullForm = + testContext.from && testContext.from[testContext.from.length - 1]?.value + const brevkode = _.get(fullForm, 'dokarkiv.dokumenter[0].brevkode') + return brevkode !== '' + }, + ), + }), + ), + }), + ), +} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/dokarkiv/visning/DokarkivVisning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/dokarkiv/visning/DokarkivVisning.tsx index abc681ce6b2..41d63a28216 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/dokarkiv/visning/DokarkivVisning.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/dokarkiv/visning/DokarkivVisning.tsx @@ -17,55 +17,60 @@ const H4 = styled.h4` width: 100%; ` -export default ({ journalpost, miljoe }: Props) => ( -
- - - - - - - - - +export default ({ journalpost, miljoe }: Props) => { + if (!journalpost) { + return null + } + return ( +
+ + + + + + + + + - {journalpost.avsenderMottaker ? ( - <> -

Avsender

- - - - - ) : null} + {journalpost.avsenderMottaker ? ( + <> +

Avsender

+ + + + + ) : null} - - {(dokument: Dokument, idx: number) => { - return ( -
- - - -
- ) - }} -
-
-) + + {(dokument: Dokument, idx: number) => { + return ( +
+ + + +
+ ) + }} +
+
+ ) +} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/form/validation.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/form/validation.tsx index 89e12a22faa..cc988c29e45 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/form/validation.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/form/validation.tsx @@ -1,7 +1,7 @@ import * as Yup from 'yup' import { ifPresent, requiredDate, requiredString } from '@/utils/YupValidations' import { testDatoTom } from '@/components/fagsystem/utils' -import _ from 'lodash' +import * as _ from 'lodash-es' import { isBefore, subDays } from 'date-fns' export const validation = { diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/visning/FullmaktVisning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/visning/FullmaktVisning.tsx index 176369c4c03..3ffdb339a92 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/visning/FullmaktVisning.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/fullmakt/visning/FullmaktVisning.tsx @@ -42,3 +42,5 @@ export const FullmaktVisning = ({ ident }: FullmaktProps) => { ) } + +export default FullmaktVisning diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/histark/form/HistarkForm.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/histark/form/HistarkForm.tsx index 8665a55cb41..663b85fe4e6 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/histark/form/HistarkForm.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/histark/form/HistarkForm.tsx @@ -1,6 +1,4 @@ import React, { useEffect, useState } from 'react' -import * as Yup from 'yup' -import { ifPresent, messages, requiredDate, requiredString } from '@/utils/YupValidations' import { Vis } from '@/components/bestillingsveileder/VisAttributt' import { Kategori } from '@/components/ui/form/kategori/Kategori' import { FormSelect } from '@/components/ui/form/inputs/select/Select' @@ -9,7 +7,7 @@ import { erForsteEllerTest, panelError } from '@/components/ui/form/formUtils' import { Vedlegg } from '@/components/fagsystem/dokarkiv/form/DokarkivForm' import { FormDollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' import { useNavEnheter } from '@/utils/hooks/useNorg2' -import _ from 'lodash' +import * as _ from 'lodash-es' import { Option } from '@/service/SelectOptionsOppslag' import { FormTextInput } from '@/components/ui/form/inputs/textInput/TextInput' import { useFormContext } from 'react-hook-form' @@ -17,19 +15,16 @@ import { FormDatepicker } from '@/components/ui/form/inputs/datepicker/Datepicke import { getYearRangeOptions } from '@/utils/DataFormatter' import { initialHistark } from '@/components/fagsystem/histark/form/initialValues' import { DisplayFormError } from '@/components/ui/toast/DisplayFormError' - -const DokumentInfoListe = React.lazy( - () => import('@/components/fagsystem/dokarkiv/modal/DokumentInfoListe'), -) -const FileUploader = React.lazy(() => import('@/utils/FileUploader/FileUploader')) +import FileUploader from '@/utils/FileUploader/FileUploader' +import DokumentInfoListe from '@/components/fagsystem/dokarkiv/modal/DokumentInfoListe' enum Kodeverk { TEMA = 'Tema', } -export const histarkAttributt = 'histark' +const histarkAttributt = 'histark' -export const HistarkForm = () => { +const HistarkForm = () => { const formMethods = useFormContext() if (!formMethods.getValues(histarkAttributt)) { return null @@ -160,33 +155,4 @@ export const HistarkForm = () => { ) } -HistarkForm.validation = { - histark: ifPresent( - '$histark', - Yup.object({ - dokumenter: Yup.array().of( - Yup.object({ - tittel: requiredString, - temakoder: Yup.array().required().min(1, 'Velg minst en temakode'), - enhetsnavn: Yup.string().required('Velg en NAV-enhet'), - enhetsnummer: requiredString, - skanner: requiredString, - skannested: requiredString, - skanningsTidspunkt: requiredDate.nullable(), - startYear: Yup.number() - .required(messages.required) - .test('start-before-slutt', 'Startår må være før sluttår', (value, context) => { - const sluttAar = context.parent.endYear - return value && sluttAar && value < sluttAar - }), - endYear: Yup.number() - .required(messages.required) - .test('slutt-after-start', 'Sluttår må være etter startår', (value, context) => { - const startAar = context.parent.startYear - return value && startAar && value > startAar - }), - }), - ), - }), - ), -} +export default HistarkForm diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/histark/form/HistarkValidation.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/histark/form/HistarkValidation.tsx new file mode 100644 index 00000000000..eec85885c01 --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/histark/form/HistarkValidation.tsx @@ -0,0 +1,33 @@ +import * as Yup from 'yup' +import { ifPresent, messages, requiredDate, requiredString } from '@/utils/YupValidations' + +export const histarkValidation = { + histark: ifPresent( + '$histark', + Yup.object({ + dokumenter: Yup.array().of( + Yup.object({ + tittel: requiredString, + temakoder: Yup.array().required().min(1, 'Velg minst en temakode'), + enhetsnavn: Yup.string().required('Velg en NAV-enhet'), + enhetsnummer: requiredString, + skanner: requiredString, + skannested: requiredString, + skanningsTidspunkt: requiredDate.nullable(), + startYear: Yup.number() + .required(messages.required) + .test('start-before-slutt', 'Startår må være før sluttår', (value, context) => { + const sluttAar = context.parent.endYear + return value && sluttAar && value < sluttAar + }), + endYear: Yup.number() + .required(messages.required) + .test('slutt-after-start', 'Sluttår må være etter startår', (value, context) => { + const startAar = context.parent.startYear + return value && startAar && value > startAar + }), + }), + ), + }), + ), +} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/histark/visning/HistarkVisning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/histark/visning/HistarkVisning.tsx index afb87bb71d8..aee2496ca3f 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/histark/visning/HistarkVisning.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/histark/visning/HistarkVisning.tsx @@ -19,22 +19,27 @@ type HistarkDokument = { } } -export default ({ dokument }: HistarkDokument) => ( -
- - - - - - - - - -
-) +export default ({ dokument }: HistarkDokument) => { + if (!dokument) { + return null + } + return ( +
+ + + + + + + + + +
+ ) +} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/histark/visning/index.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/histark/visning/index.tsx deleted file mode 100644 index 015480e3e6a..00000000000 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/histark/visning/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { default as HistarkVisning } from './Visning' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/index.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/index.tsx deleted file mode 100644 index 6d88115b7bb..00000000000 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/index.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { KrrVisning } from '@/components/fagsystem/krrstub/visning/KrrVisning' -import { PdlfVisning } from '@/components/fagsystem/pdlf/visning/PdlfVisning' -import { ArenaVisning } from '@/components/fagsystem/arena/visning/ArenaVisning' -import { AaregVisning } from '@/components/fagsystem/aareg/visning/Visning' -import { UdiVisning } from '@/components/fagsystem/udistub/visning/UdiVisning' -import { SigrunstubVisning } from '@/components/fagsystem/sigrunstub/visning/Visning' -import { InntektstubVisning } from '@/components/fagsystem/inntektstub/visning/Visning' -import { InntektsmeldingVisning } from '@/components/fagsystem/inntektsmelding/visning/Visning' -import { InstVisning } from '@/components/fagsystem/inst/visning/InstVisning' -import { PensjonVisning } from '@/components/fagsystem/pensjon/visning/PensjonVisning' -import { TpVisning } from '@/components/fagsystem/tjenestepensjon/visning/TpVisning' -import { BrregVisning } from '@/components/fagsystem/brregstub/visning/BrregVisning' -import { TpsfVisning } from '@/components/fagsystem/tpsf/visning/Visning' -import { DokarkivVisning } from '@/components/fagsystem/dokarkiv/visning' -import { HistarkVisning } from '@/components/fagsystem/histark/visning' -import { SykemeldingVisning } from '@/components/fagsystem/sykdom/visning/Visning' -import { FullmaktVisning } from './fullmakt/visning/FullmaktVisning' - -export { - TpsfVisning, - KrrVisning, - PdlfVisning, - FullmaktVisning, - ArenaVisning, - AaregVisning, - UdiVisning, - SigrunstubVisning, - InntektsmeldingVisning, - InntektstubVisning, - InstVisning, - BrregVisning, - PensjonVisning, - TpVisning, - DokarkivVisning, - HistarkVisning, - SykemeldingVisning, -} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektsmelding/form/Form.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektsmelding/form/Form.tsx index 06730fdfd6c..327e4f17936 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektsmelding/form/Form.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektsmelding/form/Form.tsx @@ -1,6 +1,6 @@ import React, { useContext, useState } from 'react' import * as Yup from 'yup' -import _ from 'lodash' +import * as _ from 'lodash-es' import Panel from '@/components/ui/panel/Panel' import { Vis } from '@/components/bestillingsveileder/VisAttributt' import { erForsteEllerTest, panelError } from '@/components/ui/form/formUtils' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektsmelding/visning/Visning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektsmelding/visning/Visning.tsx index 48a48a48889..4f09ea68bcf 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektsmelding/visning/Visning.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektsmelding/visning/Visning.tsx @@ -1,4 +1,4 @@ -import _ from 'lodash' +import * as _ from 'lodash-es' import SubOverskrift from '@/components/ui/subOverskrift/SubOverskrift' import { Bestilling, diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektsmelding/visning/partials/personVisningContent.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektsmelding/visning/partials/personVisningContent.tsx index 51e8551eef4..07ad6bc83d1 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektsmelding/visning/partials/personVisningContent.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektsmelding/visning/partials/personVisningContent.tsx @@ -1,11 +1,12 @@ import { TitleValue } from '@/components/ui/titleValue/TitleValue' import Button from '@/components/ui/button/Button' -import { CodeView } from '@/components/codeView' import useBoolean from '@/utils/hooks/useBoolean' import { Journalpost } from '@/components/fagsystem/inntektsmelding/InntektsmeldingTypes' import styled from 'styled-components' import { useDokument } from '@/utils/hooks/useJoarkDokument' import { Alert } from '@navikt/ds-react' +import { lazy, Suspense } from 'react' +import Loading from '@/components/ui/loading/Loading' interface PersonVisningContentProps { id: Journalpost @@ -33,6 +34,7 @@ const StyledJournalpost = styled.div` } } ` +const PrettyCode = lazy(() => import('@/components/codeView/PrettyCode')) export const PersonVisningContent = ({ miljoe, dokumentInfo }: PersonVisningContentProps) => { const [viserSkjemainnhold, vis, skjul] = useBoolean(false) @@ -59,7 +61,9 @@ export const PersonVisningContent = ({ miljoe, dokumentInfo }: PersonVisningCont {viserSkjemainnhold && (dokument ? ( - + }> + + ) : ( Kunne ikke hente skjemainnhold diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektsmelding/visning/partials/refusjonVisning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektsmelding/visning/partials/refusjonVisning.tsx index 18f104b6f9d..694d54e6375 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektsmelding/visning/partials/refusjonVisning.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektsmelding/visning/partials/refusjonVisning.tsx @@ -1,4 +1,4 @@ -import _ from 'lodash' +import * as _ from 'lodash-es' import { DollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' import { TitleValue } from '@/components/ui/titleValue/TitleValue' import { formatDate } from '@/utils/DataFormatter' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektsmelding/visning/partials/sykepengerVisning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektsmelding/visning/partials/sykepengerVisning.tsx index 0c8cf4c49ef..593c8cc0cb3 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektsmelding/visning/partials/sykepengerVisning.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektsmelding/visning/partials/sykepengerVisning.tsx @@ -1,4 +1,4 @@ -import _ from 'lodash' +import * as _ from 'lodash-es' import { DollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' import { TitleValue } from '@/components/ui/titleValue/TitleValue' import { codeToNorskLabel, formatDate } from '@/utils/DataFormatter' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektstub/form/partials/versjon.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektstub/form/partials/versjon.tsx index ca11ee6eee9..53259914d5e 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektstub/form/partials/versjon.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/inntektstub/form/partials/versjon.tsx @@ -1,4 +1,4 @@ -import _ from 'lodash' +import * as _ from 'lodash-es' // @ts-ignore import { Inntektsinformasjon } from './inntektinformasjonTypes' import { UseFormReturn } from 'react-hook-form/dist/types' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/inst/form/utils.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/inst/form/utils.tsx index 8b5de769da8..6e848bad70d 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/inst/form/utils.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/inst/form/utils.tsx @@ -1,4 +1,4 @@ -import _ from 'lodash' +import * as _ from 'lodash-es' const getAllDatesBetween = (startdato, sluttdato) => { const startDate = new Date(startdato) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/krrstub/form/KrrValidation.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/krrstub/form/KrrValidation.tsx index 914f00229da..f9aa3b0fab5 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/krrstub/form/KrrValidation.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/krrstub/form/KrrValidation.tsx @@ -1,6 +1,6 @@ import * as Yup from 'yup' import { ifPresent, requiredBoolean, requiredString } from '@/utils/YupValidations' -import _ from 'lodash' +import * as _ from 'lodash-es' const testMobil = (val) => { return val.test('gyldig-mobil', 'Ugyldig telefonnummer', (mobil, testContext) => { diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/medl/visning/Visning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/medl/visning/Visning.tsx index 69fff695f7b..0861fb76e64 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/medl/visning/Visning.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/medl/visning/Visning.tsx @@ -1,7 +1,7 @@ import SubOverskrift from '@/components/ui/subOverskrift/SubOverskrift' import MedlVisning from './MedlVisning' import { DollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' -import _ from 'lodash' +import * as _ from 'lodash-es' import { Medlemskapsperiode } from '@/components/fagsystem/medl/MedlTypes' import styled from 'styled-components' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/organisasjoner/form/partials/Detaljer.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/organisasjoner/form/partials/Detaljer.tsx index 0a33077a88c..1ce4f853b34 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/organisasjoner/form/partials/Detaljer.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/organisasjoner/form/partials/Detaljer.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useState } from 'react' -import _ from 'lodash' +import * as _ from 'lodash-es' import { organisasjonPaths } from '../paths' import { Kategori } from '@/components/ui/form/kategori/Kategori' import { FormSelect } from '@/components/ui/form/inputs/select/Select' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdl/visning/PdlVisning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdl/visning/PdlVisning.tsx index 57e446e4ade..7948cbdc1fb 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdl/visning/PdlVisning.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdl/visning/PdlVisning.tsx @@ -23,8 +23,8 @@ import { PdlDeltBosted } from '@/components/fagsystem/pdl/visning/partials/adres import { Doedsfall } from '@/components/fagsystem/pdlf/visning/partials/Doedsfall' import { PdlVergemaal } from '@/components/fagsystem/pdl/visning/partials/vergemaal/PdlVergemaal' import { getBankkontoData } from '@/components/fagsystem/pdlf/visning/PdlfVisning' -import { FullmaktVisning } from '@/components/fagsystem' import React from 'react' +import FullmaktVisning from '@/components/fagsystem/fullmakt/visning/FullmaktVisning' type PdlVisningProps = { pdlData: PdlData diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdl/visning/partials/adresser/PdlKontaktadresse.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdl/visning/partials/adresser/PdlKontaktadresse.tsx index e39d9dbff90..fe46edc4e9e 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdl/visning/partials/adresser/PdlKontaktadresse.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdl/visning/partials/adresser/PdlKontaktadresse.tsx @@ -5,7 +5,7 @@ import { } from '@/components/fagsystem/pdlf/visning/partials/Kontaktadresse' import { KontaktadresseData } from '@/pages/gruppe/PersonVisning/PersonMiljoeinfo/PdlDataTyper' import { ArrayHistorikk } from '@/components/ui/historikk/ArrayHistorikk' -import _ from 'lodash' +import * as _ from 'lodash-es' type PdlKontaktadresseProps = { data: Array diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdl/visning/partials/adresser/PdlOppholdsadresse.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdl/visning/partials/adresser/PdlOppholdsadresse.tsx index 0b31e4335e4..8946cecbc63 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdl/visning/partials/adresser/PdlOppholdsadresse.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdl/visning/partials/adresser/PdlOppholdsadresse.tsx @@ -5,7 +5,7 @@ import { } from '@/components/fagsystem/pdlf/visning/partials/Oppholdsadresse' import { OppholdsadresseData } from '@/pages/gruppe/PersonVisning/PersonMiljoeinfo/PdlDataTyper' import { ArrayHistorikk } from '@/components/ui/historikk/ArrayHistorikk' -import _ from 'lodash' +import * as _ from 'lodash-es' type PdlOppholdsadresseProps = { data: Array diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdl/visning/partials/relasjoner/PdlForeldreansvar.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdl/visning/partials/relasjoner/PdlForeldreansvar.tsx index 8ebf394a467..4b6fc3d4836 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdl/visning/partials/relasjoner/PdlForeldreansvar.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdl/visning/partials/relasjoner/PdlForeldreansvar.tsx @@ -1,6 +1,6 @@ import { TitleValue } from '@/components/ui/titleValue/TitleValue' import SubOverskrift from '@/components/ui/subOverskrift/SubOverskrift' -import _ from 'lodash' +import * as _ from 'lodash-es' import { formatDate } from '@/utils/DataFormatter' import { AdresseKodeverk } from '@/config/kodeverk' import { Foreldreansvar } from '@/components/fagsystem/pdlf/PdlTypes' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/adresser/adressebeskyttelse/Adressebeskyttelse.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/adresser/adressebeskyttelse/Adressebeskyttelse.tsx index b7f122bf844..03070ba8e98 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/adresser/adressebeskyttelse/Adressebeskyttelse.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/adresser/adressebeskyttelse/Adressebeskyttelse.tsx @@ -6,7 +6,7 @@ import { FormSelect } from '@/components/ui/form/inputs/select/Select' import { SelectOptionsManager as Options } from '@/service/SelectOptions' import { AvansertForm } from '@/components/fagsystem/pdlf/form/partials/avansert/AvansertForm' import { BestillingsveilederContext } from '@/components/bestillingsveileder/BestillingsveilederContext' -import _ from 'lodash' +import * as _ from 'lodash-es' import { UseFormReturn } from 'react-hook-form/dist/types' interface AdressebeskyttelseValues { diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/adresser/adressetyper/MatrikkeladresseTilfeldig.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/adresser/adressetyper/MatrikkeladresseTilfeldig.tsx index ba429f3221e..7534b11099c 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/adresser/adressetyper/MatrikkeladresseTilfeldig.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/adresser/adressetyper/MatrikkeladresseTilfeldig.tsx @@ -1,6 +1,6 @@ import { MatrikkelAdresseVelger } from '@/components/adresseVelger' import { DollyTextInput } from '@/components/ui/form/inputs/textInput/TextInput' -import _ from 'lodash' +import * as _ from 'lodash-es' import styled from 'styled-components' import { MatrikkelAdresse } from '@/components/adresseVelger/MatrikkelAdresseVelger' import { UseFormReturn } from 'react-hook-form/dist/types' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/adresser/bostedsadresse/Bostedsadresse.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/adresser/bostedsadresse/Bostedsadresse.tsx index a2d2e1c0f6c..d6b0967dca7 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/adresser/bostedsadresse/Bostedsadresse.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/adresser/bostedsadresse/Bostedsadresse.tsx @@ -12,7 +12,7 @@ import { import { FormDollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' import { SelectOptionsManager as Options } from '@/service/SelectOptions' import { FormDatepicker } from '@/components/ui/form/inputs/datepicker/Datepicker' -import _ from 'lodash' +import * as _ from 'lodash-es' import { MatrikkeladresseVelger, UkjentBosted, diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/adresser/kontaktadresse/Kontaktadresse.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/adresser/kontaktadresse/Kontaktadresse.tsx index 2ebcf9a29f4..0f8a97acb29 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/adresser/kontaktadresse/Kontaktadresse.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/adresser/kontaktadresse/Kontaktadresse.tsx @@ -1,5 +1,5 @@ import React, { useContext, useEffect } from 'react' -import _ from 'lodash' +import * as _ from 'lodash-es' import { getInitialKontaktadresse, initialPostboksadresse, diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/adresser/oppholdsadresse/Oppholdsadresse.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/adresser/oppholdsadresse/Oppholdsadresse.tsx index 4f9c57de406..95e658eff45 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/adresser/oppholdsadresse/Oppholdsadresse.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/adresser/oppholdsadresse/Oppholdsadresse.tsx @@ -1,5 +1,5 @@ import React, { useContext, useEffect } from 'react' -import _ from 'lodash' +import * as _ from 'lodash-es' import { getInitialOppholdsadresse, initialMatrikkeladresse, diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/alder/Alder.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/alder/Alder.tsx index 9ef01975d7d..b887a007442 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/alder/Alder.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/alder/Alder.tsx @@ -1,8 +1,7 @@ -import _ from 'lodash' +import * as _ from 'lodash-es' import { FormTextInput } from '@/components/ui/form/inputs/textInput/TextInput' import { FormDatepicker } from '@/components/ui/form/inputs/datepicker/Datepicker' import React, { useContext } from 'react' -import _get from 'lodash/get' import { BestillingsveilederContext } from '@/components/bestillingsveileder/BestillingsveilederContext' export const Alder = ({ formMethods }) => { @@ -16,7 +15,7 @@ export const Alder = ({ formMethods }) => { } const harFoedsel = () => { - const foedselListe = _get(formValues, 'pdldata.person.foedsel') + const foedselListe = _.get(formValues, 'pdldata.person.foedsel') return foedselListe?.some((foedsel) => foedsel?.foedselsaar || foedsel?.foedselsdato) } diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/familierelasjoner/forelderBarnRelasjon/DeltBosted.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/familierelasjoner/forelderBarnRelasjon/DeltBosted.tsx index ca9750a6220..f59cd4bb6ac 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/familierelasjoner/forelderBarnRelasjon/DeltBosted.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/familierelasjoner/forelderBarnRelasjon/DeltBosted.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useState } from 'react' -import _ from 'lodash' +import * as _ from 'lodash-es' import { FormSelect } from '@/components/ui/form/inputs/select/Select' import { SelectOptionsManager as Options } from '@/service/SelectOptions' import { diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/familierelasjoner/forelderBarnRelasjon/ForelderBarnRelasjon.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/familierelasjoner/forelderBarnRelasjon/ForelderBarnRelasjon.tsx index 65f9589deef..9c9829d1d28 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/familierelasjoner/forelderBarnRelasjon/ForelderBarnRelasjon.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/familierelasjoner/forelderBarnRelasjon/ForelderBarnRelasjon.tsx @@ -8,7 +8,7 @@ import { initialPdlBiPerson, initialPdlPerson, } from '@/components/fagsystem/pdlf/form/initialValues' -import _ from 'lodash' +import * as _ from 'lodash-es' import { AvansertForm } from '@/components/fagsystem/pdlf/form/partials/avansert/AvansertForm' import { FormCheckbox } from '@/components/ui/form/inputs/checbox/Checkbox' import { FormSelect } from '@/components/ui/form/inputs/select/Select' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/familierelasjoner/foreldreansvar/Foreldreansvar.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/familierelasjoner/foreldreansvar/Foreldreansvar.tsx index 0040bdc942c..08b9aab2699 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/familierelasjoner/foreldreansvar/Foreldreansvar.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/familierelasjoner/foreldreansvar/Foreldreansvar.tsx @@ -10,7 +10,7 @@ import { FormDollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldA import { FormSelect } from '@/components/ui/form/inputs/select/Select' import { SelectOptionsManager as Options } from '@/service/SelectOptions' import { FormDatepicker } from '@/components/ui/form/inputs/datepicker/Datepicker' -import _ from 'lodash' +import * as _ from 'lodash-es' import { ForeldreBarnRelasjon, TypeAnsvarlig } from '@/components/fagsystem/pdlf/PdlTypes' import { PdlEksisterendePerson } from '@/components/fagsystem/pdlf/form/partials/pdlPerson/PdlEksisterendePerson' import { PdlNyPerson } from '@/components/fagsystem/pdlf/form/partials/pdlPerson/PdlNyPerson' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/identifikasjon/falskIdentitet/FalskIdentitet.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/identifikasjon/falskIdentitet/FalskIdentitet.tsx index bd4595bbf2e..0b2d4da7022 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/identifikasjon/falskIdentitet/FalskIdentitet.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/identifikasjon/falskIdentitet/FalskIdentitet.tsx @@ -1,4 +1,4 @@ -import _ from 'lodash' +import * as _ from 'lodash-es' import { AdresseKodeverk } from '@/config/kodeverk' import { SelectOptionsManager as Options } from '@/service/SelectOptions' import { DollySelect, FormSelect } from '@/components/ui/form/inputs/select/Select' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/kontaktinformasjonForDoedsbo/Kontakt.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/kontaktinformasjonForDoedsbo/Kontakt.tsx index 650fc41de6a..bddbfa4097d 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/kontaktinformasjonForDoedsbo/Kontakt.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/kontaktinformasjonForDoedsbo/Kontakt.tsx @@ -3,7 +3,7 @@ import { Kategori } from '@/components/ui/form/kategori/Kategori' import { DollySelect, FormSelect } from '@/components/ui/form/inputs/select/Select' import { FormDatepicker } from '@/components/ui/form/inputs/datepicker/Datepicker' import { getPlaceholder, setNavn } from '../utils' -import _ from 'lodash' +import * as _ from 'lodash-es' import { initialNyPerson, initialOrganisasjon, diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/navn/Navn.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/navn/Navn.tsx index 432a29d8b88..0ab84d08b5e 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/navn/Navn.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/navn/Navn.tsx @@ -4,7 +4,7 @@ import { AvansertForm } from '@/components/fagsystem/pdlf/form/partials/avansert import { FormCheckbox } from '@/components/ui/form/inputs/checbox/Checkbox' import { Option } from '@/service/SelectOptionsOppslag' import { FormSelect } from '@/components/ui/form/inputs/select/Select' -import _, { isEmpty } from 'lodash' +import * as _ from 'lodash-es' import { useContext, useEffect, useState } from 'react' import { ArrowCirclepathIcon } from '@navikt/aksel-icons' import { Button } from '@navikt/ds-react' @@ -152,7 +152,7 @@ export const NavnForm = ({ formMethods, path, identtype, identMaster }: NavnType name={`${path}.hasMellomnavn`} id={`${path}.hasMellomnavn`} label="Har tilfeldig mellomnavn" - isDisabled={!isEmpty(selectedMellomnavn)} + isDisabled={!_.isEmpty(selectedMellomnavn)} checkboxMargin /> @@ -163,7 +163,7 @@ export const NavnForm = ({ formMethods, path, identtype, identMaster }: NavnType } export const Navn = ({ formMethods }: NavnTypes) => { - const opts = useContext(BestillingsveilederContext) + const opts: any = useContext(BestillingsveilederContext) return (
{ const fornavn = _.get(values, `${selectedValuePath}.fornavn`) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/familierelasjoner.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/familierelasjoner.tsx index 77cf677ab5c..d16866e09e1 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/familierelasjoner.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/familierelasjoner.tsx @@ -1,8 +1,11 @@ import * as Yup from 'yup' import { ifPresent, requiredDate, requiredString } from '@/utils/YupValidations' -import { matrikkeladresse, vegadresse } from '@/components/fagsystem/pdlf/form/validation/partials' import { testDatoFom, testDatoTom } from '@/components/fagsystem/utils' -import _ from 'lodash' +import * as _ from 'lodash-es' +import { + matrikkeladresse, + vegadresse, +} from '@/components/fagsystem/pdlf/form/validation/partials/adresser' const testForeldreansvar = (val: Yup.StringSchema) => { return val.test('er-gyldig-foreldreansvar', (selected, testContext) => { diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/index.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/index.tsx deleted file mode 100644 index 4ae6a1ec78f..00000000000 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/index.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { - bostedsadresse, - matrikkeladresse, - vegadresse, - oppholdsadresse, - kontaktadresse, - adressebeskyttelse, -} from './adresser' -import { - doedfoedtBarn, - forelderBarnRelasjon, - foreldreansvar, - sivilstand, - nyPerson, -} from './familierelasjoner' -import { innflytting } from './innvandring' -import { kontaktDoedsbo } from './kontaktinformasjonForDoedsbo' -import { sikkerhetstiltak } from './sikkerhetstiltak' -import { telefonnummer } from './telefonnummer' -import { utenlandskId, falskIdentitet } from './identifikasjon' -import { utflytting } from './utflytting' -import { statsborgerskap } from './statborgerskap' -import { vergemaal } from './vergemaal' -import { tilrettelagtKommunikasjon } from './tilrettelagtKommunikasjon' - -export { - bostedsadresse, - matrikkeladresse, - vegadresse, - oppholdsadresse, - kontaktadresse, - adressebeskyttelse, - doedfoedtBarn, - forelderBarnRelasjon, - foreldreansvar, - sivilstand, - nyPerson, - innflytting, - kontaktDoedsbo, - sikkerhetstiltak, - telefonnummer, - utenlandskId, - falskIdentitet, - utflytting, - statsborgerskap, - vergemaal, - tilrettelagtKommunikasjon, -} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/innvandring.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/innvandring.tsx index 43fdefd9921..1f1082cb6f8 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/innvandring.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/innvandring.tsx @@ -1,4 +1,4 @@ -import _ from 'lodash' +import * as _ from 'lodash-es' import * as Yup from 'yup' import { requiredDate, requiredString } from '@/utils/YupValidations' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/kontaktinformasjonForDoedsbo.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/kontaktinformasjonForDoedsbo.tsx index 1a7dedc523f..eee610339ff 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/kontaktinformasjonForDoedsbo.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/kontaktinformasjonForDoedsbo.tsx @@ -1,7 +1,7 @@ import * as Yup from 'yup' import { requiredDate, requiredString } from '@/utils/YupValidations' -import { nyPerson } from '@/components/fagsystem/pdlf/form/validation/partials' -import _ from 'lodash' +import * as _ from 'lodash-es' +import { nyPerson } from './familierelasjoner' export const kontaktDoedsbo = Yup.object().shape({ skifteform: requiredString, diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/sikkerhetstiltak.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/sikkerhetstiltak.tsx index abe9fff54b4..aadd695399f 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/sikkerhetstiltak.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/sikkerhetstiltak.tsx @@ -1,7 +1,7 @@ import * as Yup from 'yup' import { requiredDate, requiredString } from '@/utils/YupValidations' import { differenceInWeeks, isAfter } from 'date-fns' -import _ from 'lodash' +import * as _ from 'lodash-es' export const sikkerhetstiltak = Yup.array().of( Yup.object({ diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/telefonnummer.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/telefonnummer.tsx index a6036a4c8ed..ac4ccf7b295 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/telefonnummer.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/partials/telefonnummer.tsx @@ -1,6 +1,6 @@ import * as Yup from 'yup' import { requiredString } from '@/utils/YupValidations' -import _ from 'lodash' +import * as _ from 'lodash-es' const testTelefonnummer = () => Yup.string() diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/validation.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/validation.tsx index ad5627d5085..8aba76b166d 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/validation.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/validation/validation.tsx @@ -1,29 +1,33 @@ import * as Yup from 'yup' import { ifPresent, requiredDate, requiredString } from '@/utils/YupValidations' +import { bankkontoValidation } from '@/components/fagsystem/bankkonto/form' +import { tpsMessagingValidation } from '@/components/fagsystem/tpsmessaging/form/validation' +import { testDatoFom, testDatoTom } from '@/components/fagsystem/utils' +import { isSameDay } from 'date-fns' import { adressebeskyttelse, bostedsadresse, - doedfoedtBarn, + kontaktadresse, + oppholdsadresse, +} from '@/components/fagsystem/pdlf/form/validation/partials/adresser' +import { sikkerhetstiltak } from '@/components/fagsystem/pdlf/form/validation/partials/sikkerhetstiltak' +import { tilrettelagtKommunikasjon } from '@/components/fagsystem/pdlf/form/validation/partials/tilrettelagtKommunikasjon' +import { falskIdentitet, + utenlandskId, +} from '@/components/fagsystem/pdlf/form/validation/partials/identifikasjon' +import { telefonnummer } from '@/components/fagsystem/pdlf/form/validation/partials/telefonnummer' +import { + doedfoedtBarn, forelderBarnRelasjon, foreldreansvar, - innflytting, - kontaktadresse, - kontaktDoedsbo, - oppholdsadresse, - sikkerhetstiltak, sivilstand, - statsborgerskap, - telefonnummer, - tilrettelagtKommunikasjon, - utenlandskId, - utflytting, - vergemaal, -} from '@/components/fagsystem/pdlf/form/validation/partials' -import { bankkontoValidation } from '@/components/fagsystem/bankkonto/form' -import { tpsMessagingValidation } from '@/components/fagsystem/tpsmessaging/form/validation' -import { testDatoFom, testDatoTom } from '@/components/fagsystem/utils' -import { isSameDay } from 'date-fns' +} from '@/components/fagsystem/pdlf/form/validation/partials/familierelasjoner' +import { utflytting } from '@/components/fagsystem/pdlf/form/validation/partials/utflytting' +import { kontaktDoedsbo } from '@/components/fagsystem/pdlf/form/validation/partials/kontaktinformasjonForDoedsbo' +import { vergemaal } from '@/components/fagsystem/pdlf/form/validation/partials/vergemaal' +import { statsborgerskap } from '@/components/fagsystem/pdlf/form/validation/partials/statborgerskap' +import { innflytting } from '@/components/fagsystem/pdlf/form/validation/partials/innvandring' const testGyldigFom = (val) => { return val.test('is-unique', (selected: string, testContext: any) => { diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/PdlfVisning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/PdlfVisning.tsx index 71d21367c8f..f76d59a8980 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/PdlfVisning.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/PdlfVisning.tsx @@ -22,7 +22,7 @@ import { Persondetaljer } from '@/components/fagsystem/pdlf/visning/partials/Per import { PdlSikkerhetstiltak } from '@/components/fagsystem/pdl/visning/partials/PdlSikkerhetstiltak' import { TpsMBankkonto } from '@/components/fagsystem/pdl/visning/partials/tpsMessaging/TpsMBankkonto' import { ForeldreansvarVisning } from '@/components/fagsystem/pdlf/visning/partials/Foreldreansvar' -import { FullmaktVisning } from '@/components/fagsystem' +import FullmaktVisning from '@/components/fagsystem/fullmakt/visning/FullmaktVisning' export const getBankkontoData = (data) => { if (data?.kontoregister) { diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/PdlfVisningConnector.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/PdlfVisningConnector.tsx index 3f8a86e55d6..f30eef9d62e 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/PdlfVisningConnector.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/PdlfVisningConnector.tsx @@ -1,5 +1,5 @@ import { connect, RootStateOrAny } from 'react-redux' -import { PdlfVisning } from '@/components/fagsystem' +import { PdlfVisning } from './PdlfVisning' const mapStateToProps = (state: RootStateOrAny) => { return { diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Adressebeskyttelse.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Adressebeskyttelse.tsx index 52334a97f29..d24225fa3ee 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Adressebeskyttelse.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Adressebeskyttelse.tsx @@ -1,5 +1,5 @@ import React from 'react' -import _ from 'lodash' +import * as _ from 'lodash-es' import SubOverskrift from '@/components/ui/subOverskrift/SubOverskrift' import { ErrorBoundary } from '@/components/ui/appError/ErrorBoundary' import { DollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Boadresse.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Boadresse.tsx index dd5ef205155..0d73f67d2ac 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Boadresse.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Boadresse.tsx @@ -1,5 +1,5 @@ import React from 'react' -import _ from 'lodash' +import * as _ from 'lodash-es' import SubOverskrift from '@/components/ui/subOverskrift/SubOverskrift' import { ErrorBoundary } from '@/components/ui/appError/ErrorBoundary' import { DollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/DeltBosted.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/DeltBosted.tsx index 68c51dea480..17e35ccb798 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/DeltBosted.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/DeltBosted.tsx @@ -6,7 +6,7 @@ import { Matrikkeladresse } from '@/components/fagsystem/pdlf/visning/partials/M import { UkjentBosted } from '@/components/fagsystem/pdlf/visning/partials/UkjentBosted' import { DeltBostedValues, PersonData } from '@/components/fagsystem/pdlf/PdlTypes' import { initialDeltBosted } from '@/components/fagsystem/pdlf/form/initialValues' -import _ from 'lodash' +import * as _ from 'lodash-es' import VisningRedigerbarConnector from '@/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarConnector' import { OpplysningSlettet } from '@/components/fagsystem/pdlf/visning/visningRedigerbar/OpplysningSlettet' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/DoedfoedtBarn.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/DoedfoedtBarn.tsx index 407a76dcac4..078628fd3cc 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/DoedfoedtBarn.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/DoedfoedtBarn.tsx @@ -4,7 +4,7 @@ import { ErrorBoundary } from '@/components/ui/appError/ErrorBoundary' import { TitleValue } from '@/components/ui/titleValue/TitleValue' import { formatDate } from '@/utils/DataFormatter' import { DoedfoedtBarnData, PersonData } from '@/components/fagsystem/pdlf/PdlTypes' -import _ from 'lodash' +import * as _ from 'lodash-es' import { initialDoedfoedtBarn } from '@/components/fagsystem/pdlf/form/initialValues' import { OpplysningSlettet } from '@/components/fagsystem/pdlf/visning/visningRedigerbar/OpplysningSlettet' import VisningRedigerbarConnector from '@/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarConnector' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Doedsfall.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Doedsfall.tsx index 2afdde4d903..337e9f7ae13 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Doedsfall.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Doedsfall.tsx @@ -4,7 +4,7 @@ import SubOverskrift from '@/components/ui/subOverskrift/SubOverskrift' import { ErrorBoundary } from '@/components/ui/appError/ErrorBoundary' import { DollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' import { formatDate } from '@/utils/DataFormatter' -import _ from 'lodash' +import * as _ from 'lodash-es' import { DoedsfallData, Person } from '@/components/fagsystem/pdlf/PdlTypes' import { getInitialDoedsfall } from '@/components/fagsystem/pdlf/form/initialValues' import VisningRedigerbarConnector from '@/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarConnector' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Foedsel.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Foedsel.tsx index 23010408dd6..135fb55cee6 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Foedsel.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Foedsel.tsx @@ -5,7 +5,7 @@ import { ErrorBoundary } from '@/components/ui/appError/ErrorBoundary' import { DollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' import { formatDate } from '@/utils/DataFormatter' import KodeverkConnector from '@/components/kodeverk/KodeverkConnector' -import _ from 'lodash' +import * as _ from 'lodash-es' import { Kodeverk, KodeverkValues, diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/ForelderBarnRelasjon.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/ForelderBarnRelasjon.tsx index 171d5dc0f33..9907d68e291 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/ForelderBarnRelasjon.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/ForelderBarnRelasjon.tsx @@ -6,7 +6,7 @@ import { showLabel } from '@/utils/DataFormatter' import { RelatertPerson } from '@/components/fagsystem/pdlf/visning/partials/RelatertPerson' import { ForeldreBarnRelasjon, Relasjon } from '@/components/fagsystem/pdlf/PdlTypes' import { RelatertPersonUtenId } from '@/components/fagsystem/pdlf/visning/partials/RelatertPersonUtenId' -import _ from 'lodash' +import * as _ from 'lodash-es' import { getInitialBarn, getInitialForelder, diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Foreldreansvar.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Foreldreansvar.tsx index afac3357144..3b620a4699b 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Foreldreansvar.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Foreldreansvar.tsx @@ -3,7 +3,7 @@ import { getInitialForeldreansvar } from '@/components/fagsystem/pdlf/form/initi import { DollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' import * as React from 'react' import { TitleValue } from '@/components/ui/titleValue/TitleValue' -import _ from 'lodash' +import * as _ from 'lodash-es' import { formatDate } from '@/utils/DataFormatter' import { AdresseKodeverk } from '@/config/kodeverk' import { getEksisterendeNyPerson } from '@/components/fagsystem/utils' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Innvandring.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Innvandring.tsx index 7c90165aff1..fe65d6082ec 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Innvandring.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Innvandring.tsx @@ -9,7 +9,7 @@ import { UtvandringValues, } from '@/pages/gruppe/PersonVisning/PersonMiljoeinfo/PdlDataTyper' import { initialInnvandring } from '@/components/fagsystem/pdlf/form/initialValues' -import _ from 'lodash' +import * as _ from 'lodash-es' import VisningRedigerbarConnector from '@/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarConnector' import { PersonData } from '@/components/fagsystem/pdlf/PdlTypes' import { getSisteDato } from '@/components/bestillingsveileder/utils' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Kontaktadresse.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Kontaktadresse.tsx index 5052b471f24..046fca1d7ca 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Kontaktadresse.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Kontaktadresse.tsx @@ -11,7 +11,7 @@ import { KodeverkValues, KontaktadresseData, } from '@/pages/gruppe/PersonVisning/PersonMiljoeinfo/PdlDataTyper' -import _ from 'lodash' +import * as _ from 'lodash-es' import { AdresseKodeverk } from '@/config/kodeverk' import { getInitialKontaktadresse } from '@/components/fagsystem/pdlf/form/initialValues' import VisningRedigerbarConnector from '@/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarConnector' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/KontaktinformasjonForDoedsbo.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/KontaktinformasjonForDoedsbo.tsx index 0caa210884f..9df804f35b2 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/KontaktinformasjonForDoedsbo.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/KontaktinformasjonForDoedsbo.tsx @@ -5,7 +5,7 @@ import { TitleValue } from '@/components/ui/titleValue/TitleValue' import { Personnavn } from '@/components/fagsystem/pdlf/visning/partials/Personnavn' import { ErrorBoundary } from '@/components/ui/appError/ErrorBoundary' import { RelatertPerson } from '@/components/fagsystem/pdlf/visning/partials/RelatertPerson' -import _ from 'lodash' +import * as _ from 'lodash-es' import { initialKontaktinfoForDoedebo } from '@/components/fagsystem/pdlf/form/initialValues' import { getEksisterendeNyPerson } from '@/components/fagsystem/utils' import VisningRedigerbarConnector from '@/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarConnector' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Oppholdsadresse.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Oppholdsadresse.tsx index d150e52ae79..d7569bef3cd 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Oppholdsadresse.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Oppholdsadresse.tsx @@ -5,7 +5,7 @@ import { DollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray import { Vegadresse } from '@/components/fagsystem/pdlf/visning/partials/Vegadresse' import { Matrikkeladresse } from '@/components/fagsystem/pdlf/visning/partials/Matrikkeladresse' import { UtenlandskAdresse } from '@/components/fagsystem/pdlf/visning/partials/UtenlandskAdresse' -import _ from 'lodash' +import * as _ from 'lodash-es' import { getInitialOppholdsadresse } from '@/components/fagsystem/pdlf/form/initialValues' import { OppholdsadresseData } from '@/pages/gruppe/PersonVisning/PersonMiljoeinfo/PdlDataTyper' import VisningRedigerbarConnector from '@/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarConnector' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Persondetaljer.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Persondetaljer.tsx index 0485962c0ed..3e031d5f3dc 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Persondetaljer.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Persondetaljer.tsx @@ -3,7 +3,7 @@ import SubOverskrift from '@/components/ui/subOverskrift/SubOverskrift' import { TitleValue } from '@/components/ui/titleValue/TitleValue' import { ErrorBoundary } from '@/components/ui/appError/ErrorBoundary' import { formatDate, showLabel } from '@/utils/DataFormatter' -import _ from 'lodash' +import * as _ from 'lodash-es' import { getInitialKjoenn, getInitialNavn, diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Personstatus.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Personstatus.tsx index e8272db4a6a..d17f289aa4f 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Personstatus.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Personstatus.tsx @@ -2,7 +2,7 @@ import React from 'react' import { DollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' import { TitleValue } from '@/components/ui/titleValue/TitleValue' import { formatDate, showLabel } from '@/utils/DataFormatter' -import _ from 'lodash' +import * as _ from 'lodash-es' import { initialPersonstatus } from '@/components/fagsystem/pdlf/form/initialValues' import { OpplysningSlettet } from '@/components/fagsystem/pdlf/visning/visningRedigerbar/OpplysningSlettet' import VisningRedigerbarConnector from '@/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarConnector' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Sivilstand.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Sivilstand.tsx index 73c6b11c0a7..623bd91675b 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Sivilstand.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Sivilstand.tsx @@ -10,7 +10,7 @@ import { getInitialSivilstand, initialPdlPerson, } from '@/components/fagsystem/pdlf/form/initialValues' -import _ from 'lodash' +import * as _ from 'lodash-es' import React from 'react' import { getEksisterendeNyPerson } from '@/components/fagsystem/utils' import { OpplysningSlettet } from '@/components/fagsystem/pdlf/visning/visningRedigerbar/OpplysningSlettet' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Statsborgerskap.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Statsborgerskap.tsx index 98ea475bf63..7d889c9c283 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Statsborgerskap.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Statsborgerskap.tsx @@ -1,7 +1,7 @@ import { ErrorBoundary } from '@/components/ui/appError/ErrorBoundary' import { DollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' import React from 'react' -import _ from 'lodash' +import * as _ from 'lodash-es' import { getInitialStatsborgerskap } from '@/components/fagsystem/pdlf/form/initialValues' import { PersonData, StatsborgerskapData } from '@/components/fagsystem/pdlf/PdlTypes' import VisningRedigerbarConnector from '@/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarConnector' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Telefonnummer.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Telefonnummer.tsx index 7c5abe59a55..60923cb2708 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Telefonnummer.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Telefonnummer.tsx @@ -3,7 +3,7 @@ import { ErrorBoundary } from '@/components/ui/appError/ErrorBoundary' import { DollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' import { TitleValue } from '@/components/ui/titleValue/TitleValue' import { TelefonData } from '@/pages/gruppe/PersonVisning/PersonMiljoeinfo/PdlDataTyper' -import _ from 'lodash' +import * as _ from 'lodash-es' import VisningRedigerbarSamletConnector from '@/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarSamletConnector' type DataListe = { diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/UtenlandsId.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/UtenlandsId.tsx index 56bee220406..6dd6948851b 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/UtenlandsId.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/UtenlandsId.tsx @@ -6,7 +6,7 @@ import { oversettBoolean } from '@/utils/DataFormatter' import { ErrorBoundary } from '@/components/ui/appError/ErrorBoundary' import React from 'react' import { getInitialUtenlandskIdentifikasjonsnummer } from '@/components/fagsystem/pdlf/form/initialValues' -import _ from 'lodash' +import * as _ from 'lodash-es' import VisningRedigerbarConnector from '@/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarConnector' import { OpplysningSlettet } from '@/components/fagsystem/pdlf/visning/visningRedigerbar/OpplysningSlettet' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Utvandring.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Utvandring.tsx index b6c4710e456..c419984a9b8 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Utvandring.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Utvandring.tsx @@ -8,7 +8,7 @@ import { InnvandringValues, UtvandringValues, } from '@/pages/gruppe/PersonVisning/PersonMiljoeinfo/PdlDataTyper' -import _ from 'lodash' +import * as _ from 'lodash-es' import { PersonData } from '@/components/fagsystem/pdlf/PdlTypes' import { initialUtvandring } from '@/components/fagsystem/pdlf/form/initialValues' import VisningRedigerbarConnector from '@/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarConnector' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Vergemaal.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Vergemaal.tsx index b7da27f8235..0aa9c82222a 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Vergemaal.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/Vergemaal.tsx @@ -6,7 +6,7 @@ import { formatDate } from '@/utils/DataFormatter' import { RelatertPerson } from '@/components/fagsystem/pdlf/visning/partials/RelatertPerson' import { PersonData, Relasjon, VergemaalValues } from '@/components/fagsystem/pdlf/PdlTypes' import { VergemaalKodeverk } from '@/config/kodeverk' -import _ from 'lodash' +import * as _ from 'lodash-es' import { initialPdlPerson, initialVergemaal } from '@/components/fagsystem/pdlf/form/initialValues' import VisningRedigerbarConnector from '@/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarConnector' import { getEksisterendeNyPerson } from '@/components/fagsystem/utils' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbar.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbar.tsx index a12c8150e24..2035c20ccd5 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbar.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbar.tsx @@ -1,9 +1,9 @@ -import React, { useCallback, useRef, useState } from 'react' +import React, { lazy, Suspense, useCallback, useRef, useState } from 'react' import { FoedselForm } from '@/components/fagsystem/pdlf/form/partials/foedsel/Foedsel' import NavButton from '@/components/ui/button/NavButton/NavButton' import styled from 'styled-components' import Button from '@/components/ui/button/Button' -import _ from 'lodash' +import * as _ from 'lodash-es' import { DollyApi, PdlforvalterApi } from '@/service/Api' import Icon from '@/components/ui/icon/Icon' import { DollyModal } from '@/components/ui/modal/DollyModal' @@ -40,10 +40,9 @@ import { yupResolver } from '@hookform/resolvers/yup' import './VisningRedigerbarForm.less' import { FoedestedForm } from '@/components/fagsystem/pdlf/form/partials/foedsel/Foedested' import { FoedselsdatoForm } from '@/components/fagsystem/pdlf/form/partials/foedsel/Foedselsdato' -import DisplayFormState from '@/utils/DisplayFormState' -import DisplayFormErrors from '@/utils/DisplayFormErrors' import { devEnabled } from '@/components/bestillingsveileder/stegVelger/StegVelger' import { PersonstatusForm } from '@/components/fagsystem/pdlf/form/partials/personstatus/Personstatus' +import Loading from '@/components/ui/loading/Loading' type VisningTypes = { getPdlForvalter: Function @@ -131,6 +130,9 @@ export const VisningRedigerbar = ({ relatertPersonInfo = null, master = null, }: VisningTypes) => { + const DisplayFormState = lazy(() => import('@/utils/DisplayFormState')) + const DisplayFormErrors = lazy(() => import('@/utils/DisplayFormErrors')) + const [visningModus, setVisningModus] = useState(Modus.Les) const [errorMessagePdlf, setErrorMessagePdlf] = useState(null) const [errorMessagePdl, setErrorMessagePdl] = useState(null) @@ -401,8 +403,10 @@ export const VisningRedigerbar = ({ <> {devEnabled && ( <> - - + }> + + + )} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarForm.less b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarForm.less index 5e7e0fb9303..b7349111d77 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarForm.less +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarForm.less @@ -1,13 +1,5 @@ .visning-redigerbar-form { - &&& .react-datepicker__navigation { - position: fixed; - } - - && .react-datepicker__year-wrapper { - display: flow; - } - && .navds-form-field--small .navds-date__field-button { top: 18px; right: 33px; diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarPersondetaljer.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarPersondetaljer.tsx index bc8aa13cf32..cd2a78c1be3 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarPersondetaljer.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarPersondetaljer.tsx @@ -3,7 +3,7 @@ import * as Yup from 'yup' import NavButton from '@/components/ui/button/NavButton/NavButton' import styled from 'styled-components' import Button from '@/components/ui/button/Button' -import _ from 'lodash' +import * as _ from 'lodash-es' import { DollyApi, PdlforvalterApi, SkjermingApi } from '@/service/Api' import Icon from '@/components/ui/icon/Icon' import { DollyModal } from '@/components/ui/modal/DollyModal' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarSamlet.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarSamlet.tsx index d0b6bf951a0..4a046cb474f 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarSamlet.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarSamlet.tsx @@ -4,14 +4,13 @@ import Loading from '@/components/ui/loading/Loading' import NavButton from '@/components/ui/button/NavButton/NavButton' import styled from 'styled-components' import Button from '@/components/ui/button/Button' -import _ from 'lodash' +import * as _ from 'lodash-es' import { DollyApi, PdlforvalterApi } from '@/service/Api' import Icon from '@/components/ui/icon/Icon' import { DollyModal } from '@/components/ui/modal/DollyModal' import useBoolean from '@/utils/hooks/useBoolean' import { ifPresent } from '@/utils/YupValidations' import { DollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' -import { telefonnummer } from '@/components/fagsystem/pdlf/form/validation/partials' import { TelefonnummerFormRedigering } from '@/components/fagsystem/pdlf/form/partials/telefonnummer/Telefonnummer' import { TelefonnummerLes } from '@/components/fagsystem/pdlf/visning/partials/Telefonnummer' import { @@ -21,6 +20,7 @@ import { import { OpplysningSlettet } from '@/components/fagsystem/pdlf/visning/visningRedigerbar/OpplysningSlettet' import { Form, FormProvider, useForm } from 'react-hook-form' import { yupResolver } from '@hookform/resolvers/yup' +import { telefonnummer } from '../../form/validation/partials/telefonnummer' type VisningTypes = { getPdlForvalter: Function diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarValidation.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarValidation.tsx index 42353f80f5f..33b39771bb3 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarValidation.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/visningRedigerbar/VisningRedigerbarValidation.tsx @@ -2,24 +2,24 @@ import * as Yup from 'yup' import { ifPresent } from '@/utils/YupValidations' import { doedsfall, navn } from '@/components/fagsystem/pdlf/form/validation/validation' import { - adressebeskyttelse, - bostedsadresse, + deltBosted, doedfoedtBarn, forelderBarnRelasjon, - innflytting, - kontaktadresse, - kontaktDoedsbo, - oppholdsadresse, - sivilstand, - statsborgerskap, - utenlandskId, - utflytting, - vergemaal, -} from '@/components/fagsystem/pdlf/form/validation/partials' -import { - deltBosted, foreldreansvarForBarn, + sivilstand, } from '@/components/fagsystem/pdlf/form/validation/partials/familierelasjoner' +import { statsborgerskap } from '@/components/fagsystem/pdlf/form/validation/partials/statborgerskap' +import { innflytting } from '@/components/fagsystem/pdlf/form/validation/partials/innvandring' +import { utflytting } from '@/components/fagsystem/pdlf/form/validation/partials/utflytting' +import { vergemaal } from '@/components/fagsystem/pdlf/form/validation/partials/vergemaal' +import { + adressebeskyttelse, + bostedsadresse, + kontaktadresse, + oppholdsadresse, +} from '@/components/fagsystem/pdlf/form/validation/partials/adresser' +import { kontaktDoedsbo } from '@/components/fagsystem/pdlf/form/validation/partials/kontaktinformasjonForDoedsbo' +import { utenlandskId } from '@/components/fagsystem/pdlf/form/validation/partials/identifikasjon' export const visningRedigerbarValidation = Yup.object().shape( { diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pensjon/form/validation.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pensjon/form/validation.tsx index 271c2000ec8..09250a9197a 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pensjon/form/validation.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pensjon/form/validation.tsx @@ -1,5 +1,5 @@ import * as Yup from 'yup' -import _ from 'lodash' +import * as _ from 'lodash-es' import { ifPresent, requiredNumber, requiredString } from '@/utils/YupValidations' import { TjenestepensjonForm } from '@/components/fagsystem/tjenestepensjon/form/Form' import { AlderspensjonForm } from '@/components/fagsystem/alderspensjon/form/Form' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sigrunstubPensjonsgivende/form/Form.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sigrunstubPensjonsgivende/form/Form.tsx index 7cb6080f139..d3737415d10 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sigrunstubPensjonsgivende/form/Form.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sigrunstubPensjonsgivende/form/Form.tsx @@ -16,7 +16,7 @@ import { import { getInitialInntekt } from '@/components/fagsystem/sigrunstubPensjonsgivende/utils' import { validation } from '@/components/fagsystem/sigrunstubPensjonsgivende/form/validation' import { useFormContext } from 'react-hook-form' -import _ from 'lodash' +import * as _ from 'lodash-es' export const getInitialSigrunstubPensjonsgivende = (kodeverk = null, skatteordning = null) => { return { diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sigrunstubPensjonsgivende/form/PensjonsgivendeInntektForm.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sigrunstubPensjonsgivende/form/PensjonsgivendeInntektForm.tsx index fc86b544780..844e8b33ea5 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sigrunstubPensjonsgivende/form/PensjonsgivendeInntektForm.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sigrunstubPensjonsgivende/form/PensjonsgivendeInntektForm.tsx @@ -8,7 +8,7 @@ import { getInitialInntekt, kodeverkKeyToLabel, } from '@/components/fagsystem/sigrunstubPensjonsgivende/utils' -import _ from 'lodash' +import * as _ from 'lodash-es' const getSkatteordningOptions = (skatteordning) => { return skatteordning?.map((item) => ({ value: item, label: _.capitalize(item) })) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/skatteetaten/visning/SkatteetatenVisning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/skatteetaten/visning/SkatteetatenVisning.tsx index 824f1a79860..6cdeb3ddc8b 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/skatteetaten/visning/SkatteetatenVisning.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/skatteetaten/visning/SkatteetatenVisning.tsx @@ -1,7 +1,7 @@ import React from 'react' import Loading from '@/components/ui/loading/Loading' import Icon from '@/components/ui/icon/Icon' -import _get from 'lodash/get' +import * as _ from 'lodash-es' import { BrregErFrVisning } from '@/components/fagsystem/skatteetaten/visning/BrregErFrVisning' import { InntektVisning } from '@/components/fagsystem/skatteetaten/visning/InntektVisning' import { TjenestepensjonsavtaleVisning } from '@/components/fagsystem/skatteetaten/visning/TjenestepensjonsavtaleVisning' @@ -29,7 +29,7 @@ export const SkatteetatenVisning = ({ data, loading }: SkatteetatenVisningProps) const tjenestepensjonavtaleListe = tenorRelasjoner.tjenestepensjonavtale const harTjenestepensjonavtale = tjenestepensjonavtaleListe?.length > 0 - const harDagligLederRolle = _get(tenorRelasjoner, 'brreg-er-fr')?.length > 0 + const harDagligLederRolle = _.get(tenorRelasjoner, 'brreg-er-fr')?.length > 0 const skattemeldingListe = tenorRelasjoner.skattemelding const harSkattemelding = skattemeldingListe?.length > 0 diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/skattekort/visning/Visning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/skattekort/visning/Visning.tsx index 102d0525cb5..c5ed5d7cfe3 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/skattekort/visning/Visning.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/skattekort/visning/Visning.tsx @@ -1,5 +1,5 @@ import Loading from '@/components/ui/loading/Loading' -import React from 'react' +import React, { lazy, Suspense } from 'react' import SubOverskrift from '@/components/ui/subOverskrift/SubOverskrift' import { Alert } from '@navikt/ds-react' import { ErrorBoundary } from '@/components/ui/appError/ErrorBoundary' @@ -10,13 +10,14 @@ import { useSkattekortKodeverk } from '@/utils/hooks/useSkattekort' import { ForskuddstrekkVisning } from '@/components/fagsystem/skattekort/visning/ForskuddstrekkVisning' import Button from '@/components/ui/button/Button' import useBoolean from '@/utils/hooks/useBoolean' -import { CodeView } from '@/components/codeView' type SkattekortVisning = { liste?: Array loading?: boolean } +const PrettyCode = lazy(() => import('@/components/codeView/PrettyCode')) + export const showKodeverkLabel = (kodeverkstype: string, value: string) => { const { kodeverk, loading, error } = useSkattekortKodeverk(kodeverkstype) if (loading || error) { @@ -106,7 +107,9 @@ export const SkattekortVisning = ({ liste, loading }: SkattekortVisning) => { {viserXml && (skattekort?.skattekortXml ? ( - + }> + + ) : ( Kunne ikke vise skattekort-xml diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/SykemeldingTypes.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/SykemeldingTypes.tsx index 31d22143ac3..a05759a545a 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/SykemeldingTypes.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/SykemeldingTypes.tsx @@ -32,6 +32,7 @@ export type SykemeldingDetaljert = { helsepersonell: Helsepersonell arbeidsgiver: Arbeidsgiver detaljer: Detaljer + kontaktMedPasient?: KontaktMedPasient perioder: Array } idx: number @@ -44,6 +45,11 @@ export type Diagnose = { system?: string } +export type KontaktMedPasient = { + begrunnelseIkkeKontakt: string + kontaktDato?: string +} + export type Helsepersonell = { fornavn: string mellomnavn?: string diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/form/partials/DetaljertSykemelding.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/form/partials/DetaljertSykemelding.tsx index d35debdd1a4..5377f25f09d 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/form/partials/DetaljertSykemelding.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/form/partials/DetaljertSykemelding.tsx @@ -15,8 +15,12 @@ import { } from '@/components/fagsystem/sykdom/SykemeldingTypes' import { useKodeverk } from '@/utils/hooks/useKodeverk' import { getRandomValue } from '@/components/fagsystem/utils' -import { useEffect } from 'react' +import { useContext, useEffect } from 'react' import { useHelsepersonellOptions } from '@/utils/hooks/useSelectOptions' +import { useSykemeldingValidering } from '@/utils/hooks/useSykemelding' +import { DollyErrorMessage } from '@/utils/DollyErrorMessage' +import { useWatch } from 'react-hook-form' +import { SwrMutateContext } from '@/components/bestillingsveileder/SwrMutateContext' type DiagnoseSelect = { diagnoseNavn: string @@ -42,10 +46,35 @@ const initialValuesPeriode = { const KODESYSTEM = '2.16.578.1.12.4.1.1.7170' export const DetaljertSykemelding = ({ formMethods }: SykemeldingForm) => { + const setContextMutate: any = useContext(SwrMutateContext) + const handleDiagnoseChange = (v: DiagnoseSelect, path: string) => { formMethods.setValue(`${path}.diagnose`, v.diagnoseNavn) formMethods.setValue(`${path}.system`, KODESYSTEM) } + const detaljertSykemelding = useWatch({ + name: 'sykemelding.detaljertSykemelding', + control: formMethods.control, + }) + + const { data, mutate, errorMessage } = useSykemeldingValidering(detaljertSykemelding) + + useEffect(() => { + if (errorMessage && errorMessage.length > 0) { + formMethods.setError('manual.sykemelding.detaljertSykemelding', { + type: 'manual', + message: errorMessage, + }) + } else formMethods.clearErrors('manual.sykemelding.detaljertSykemelding') + }, [errorMessage, data]) + + useEffect(() => { + setContextMutate(() => mutate) + formMethods.setError('manual.sykemelding.detaljertSykemelding', { + type: 'manual', + message: 'Trykk "Videre" for å validere sykemeldingen', + }) + }, [mutate]) const handleLegeChange = (v: Helsepersonell) => { formMethods.setValue('sykemelding.detaljertSykemelding.helsepersonell', { @@ -95,6 +124,7 @@ export const DetaljertSykemelding = ({ formMethods }: SykemeldingForm) => { return (
+
{ /> )} + +
+ + +
+
{ + const setFormMutate: any = useContext(SwrMutateContext) + const formMethods = useFormContext() + + useEffect(() => { + setFormMutate?.(undefined) + formMethods.clearErrors('manual.sykemelding.detaljertSykemelding') + }, []) return (
diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/Visning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/Visning.tsx index 660ab7fe61f..e5f3e48d002 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/Visning.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/Visning.tsx @@ -1,131 +1,123 @@ -import _ from 'lodash' +import * as _ from 'lodash-es' import SubOverskrift from '@/components/ui/subOverskrift/SubOverskrift' -import {SyntSykemelding} from './partials/SyntSykemelding' -import {DetaljertSykemelding} from './partials/DetaljertSykemelding' -import { - Sykemelding, - SykemeldingDetaljert, - SykemeldingSynt -} from '../SykemeldingTypes' -import {erGyldig} from '@/components/transaksjonid/GyldigeBestillinger' -import {Alert} from '@navikt/ds-react' +import { SyntSykemelding } from './partials/SyntSykemelding' +import { DetaljertSykemelding } from './partials/DetaljertSykemelding' +import { Sykemelding, SykemeldingDetaljert, SykemeldingSynt } from '../SykemeldingTypes' +import { erGyldig } from '@/components/transaksjonid/GyldigeBestillinger' +import { Alert } from '@navikt/ds-react' import React from 'react' -import {MiljoTabs} from '@/components/ui/miljoTabs/MiljoTabs' -import {useBestilteMiljoer} from '@/utils/hooks/useBestilling' +import { MiljoTabs } from '@/components/ui/miljoTabs/MiljoTabs' +import { useBestilteMiljoer } from '@/utils/hooks/useBestilling' import Loading from '@/components/ui/loading/Loading' export const sjekkManglerSykemeldingData = (sykemeldingData) => { - return ( - !sykemeldingData || - sykemeldingData?.length < 1 || - sykemeldingData?.every((miljoData) => !miljoData.data) - ) + return ( + !sykemeldingData || + sykemeldingData?.length < 1 || + sykemeldingData?.every((miljoData) => !miljoData.data) + ) } export const sjekkManglerSykemeldingBestilling = (sykemeldingBestilling) => { - return !sykemeldingBestilling || sykemeldingBestilling?.length < 1 + return !sykemeldingBestilling || sykemeldingBestilling?.length < 1 } -const VisningAvBestilling = ({bestillinger}) => { - if (!bestillinger) { - return null - } - - return bestillinger?.map((bestilling: SykemeldingSynt | SykemeldingDetaljert, idx: number) => { - if (!bestilling.erGjenopprettet) { - const syntSykemelding = _.get(bestilling, 'data.sykemelding.syntSykemelding') - const detaljertSykemelding = _.get(bestilling, 'data.sykemelding.detaljertSykemelding') - - return syntSykemelding ? ( - - ) : detaljertSykemelding ? ( - - ) : null - } - }) +const VisningAvBestilling = ({ bestillinger }) => { + if (!bestillinger) { + return null + } + + return bestillinger?.map((bestilling: SykemeldingSynt | SykemeldingDetaljert, idx: number) => { + if (!bestilling.erGjenopprettet) { + const syntSykemelding = _.get(bestilling, 'data.sykemelding.syntSykemelding') + const detaljertSykemelding = _.get(bestilling, 'data.sykemelding.detaljertSykemelding') + + return syntSykemelding ? ( + + ) : detaljertSykemelding ? ( + + ) : null + } + }) } -const VisningAvTransaksjonsId = ({data}) => { - if (!data) { - return null - } - - const syntSykemelding = _.get(data, 'syntSykemeldingRequest') - const detaljertSykemelding = _.get(data, 'detaljertSykemeldingRequest') - const sykemeldingId = _.get(data, 'sykemeldingId') - - if (syntSykemelding) { - syntSykemelding['sykemeldingId'] = sykemeldingId - return - } - if (detaljertSykemelding) { - detaljertSykemelding['sykemeldingId'] = sykemeldingId - return < DetaljertSykemelding sykemelding={detaljertSykemelding}/> - } +const VisningAvTransaksjonsId = ({ data }) => { + if (!data) { + return null + } + + const syntSykemelding = _.get(data, 'syntSykemeldingRequest') + const detaljertSykemelding = _.get(data, 'detaljertSykemeldingRequest') + const sykemeldingId = _.get(data, 'sykemeldingId') + + if (syntSykemelding) { + syntSykemelding['sykemeldingId'] = sykemeldingId + return + } + if (detaljertSykemelding) { + detaljertSykemelding['sykemeldingId'] = sykemeldingId + return + } } export const SykemeldingVisning = ({ - data, - loading, - bestillingIdListe, - tilgjengeligMiljoe, - bestillinger, - }: Sykemelding) => { - const {bestilteMiljoer} = useBestilteMiljoer(bestillingIdListe, 'SYKEMELDING') - - if (loading) { - return - } - - if (!data && !bestillinger) { - return null - } - - const manglerFagsystemData = - sjekkManglerSykemeldingData(data) && sjekkManglerSykemeldingBestilling(bestillinger) - - const miljoerMedData = data?.map((miljoData) => miljoData.data && miljoData.miljo) - const errorMiljoer = bestilteMiljoer?.filter((miljo) => !miljoerMedData?.includes(miljo)) - - const forsteMiljo = data?.find((miljoData) => miljoData?.data)?.miljo - - const filteredData = - tilgjengeligMiljoe && data?.filter((item) => tilgjengeligMiljoe.includes(item.miljo)) - - return ( -
- - {manglerFagsystemData ? ( - - Fant ikke sykemelding-data på person - - ) : sjekkManglerSykemeldingData(data) ? ( - - ) : ( - - - - )} -
- ) + data, + loading, + bestillingIdListe, + tilgjengeligMiljoe, + bestillinger, +}: Sykemelding) => { + const { bestilteMiljoer } = useBestilteMiljoer(bestillingIdListe, 'SYKEMELDING') + + if (loading) { + return + } + + if (!data && !bestillinger) { + return null + } + + const manglerFagsystemData = + sjekkManglerSykemeldingData(data) && sjekkManglerSykemeldingBestilling(bestillinger) + + const miljoerMedData = data?.map((miljoData) => miljoData.data && miljoData.miljo) + const errorMiljoer = bestilteMiljoer?.filter((miljo) => !miljoerMedData?.includes(miljo)) + + const forsteMiljo = data?.find((miljoData) => miljoData?.data)?.miljo + + const filteredData = + tilgjengeligMiljoe && data?.filter((item) => tilgjengeligMiljoe.includes(item.miljo)) + + return ( +
+ + {manglerFagsystemData ? ( + + Fant ikke sykemelding-data på person + + ) : sjekkManglerSykemeldingData(data) ? ( + + ) : ( + + + + )} +
+ ) } SykemeldingVisning.filterValues = (bestillinger: Array, ident: string) => { - if (!bestillinger) { - return null - } - - return bestillinger.filter( - (bestilling: any) => - bestilling.data?.sykemelding && erGyldig(bestilling.id, 'SYKEMELDING', ident), - ) + if (!bestillinger) { + return null + } + + return bestillinger.filter( + (bestilling: any) => + bestilling.data?.sykemelding && erGyldig(bestilling.id, 'SYKEMELDING', ident), + ) } diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/partials/DetaljertSykemelding.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/partials/DetaljertSykemelding.tsx index 4fe1c7172eb..e421013949d 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/partials/DetaljertSykemelding.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/partials/DetaljertSykemelding.tsx @@ -1,119 +1,114 @@ import * as React from 'react' -import {formatStringDates, oversettBoolean} from '@/utils/DataFormatter' -import {TitleValue} from '@/components/ui/titleValue/TitleValue' -import {Bidiagnoser} from './Bidiagnoser' -import {Perioder} from './Perioder' -import {ArbeidKodeverk} from '@/config/kodeverk' -import { - SykemeldingDetaljert -} from '@/components/fagsystem/sykdom/SykemeldingTypes' +import { formatStringDates, oversettBoolean } from '@/utils/DataFormatter' +import { TitleValue } from '@/components/ui/titleValue/TitleValue' +import { Bidiagnoser } from './Bidiagnoser' +import { Perioder } from './Perioder' +import { ArbeidKodeverk } from '@/config/kodeverk' +import { SykemeldingDetaljert } from '@/components/fagsystem/sykdom/SykemeldingTypes' import styled from 'styled-components' export const SykemeldingKategori = styled.div` - width: 100%; + width: 100%; - h4 { - margin-top: 5px; - margin-bottom: 15px; - } + h4 { + margin-top: 5px; + margin-bottom: 15px; + } ` -export const DetaljertSykemelding = ({ - sykemelding, - idx - }: SykemeldingDetaljert) => { - console.log('sykemelding', sykemelding) - return ( -
- -
- - - -
- <> - -

Diagnose

-
-
- - -
- - - <> - -

Helsepersonell

-
-
- - - - -
- - <> - -

Arbeidsgiver

-
-
- - - -
- - - <> - -

Detaljer

-
-
- - - - - -
- -
-
- ) -} +export const DetaljertSykemelding = ({ sykemelding, idx }: SykemeldingDetaljert) => ( +
+ +
+ + + +
+ <> + +

Diagnose

+
+
+ + +
+ + + {sykemelding.kontaktMedPasient && ( + <> + +

Tilbakedatering

+
+
+ + +
+ + )} + <> + +

Helsepersonell

+
+
+ + + + +
+ + <> + +

Arbeidsgiver

+
+
+ + + +
+ + + <> + +

Detaljer

+
+
+ + + + + +
+ +
+
+) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/tpsf/visning/Visning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/tpsf/visning/Visning.tsx index 129e48d241d..8b66d99c1c4 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/tpsf/visning/Visning.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/tpsf/visning/Visning.tsx @@ -1,4 +1,4 @@ -import _ from 'lodash' +import * as _ from 'lodash-es' import { MidlertidigAdresse, Postadresse, diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/tpsf/visning/partials/Adressevalg.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/tpsf/visning/partials/Adressevalg.tsx index a3144fe72f5..136c6a43953 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/tpsf/visning/partials/Adressevalg.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/tpsf/visning/partials/Adressevalg.tsx @@ -1,7 +1,7 @@ import { Historikk } from '@/components/ui/historikk/Historikk' import { Adressevisning } from '@/components/fagsystem/tpsf/visning/partials/Boadresse' import { PostadresseVisning } from '@/components/fagsystem/tpsf/visning/partials/Postadresse' -import _ from 'lodash' +import * as _ from 'lodash-es' export const Adressevalg = ({ data }: any) => { return ( diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/tpsf/visning/partials/MidlertidigAdresse.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/tpsf/visning/partials/MidlertidigAdresse.tsx index 243863772a1..2d7795b8b7a 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/tpsf/visning/partials/MidlertidigAdresse.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/tpsf/visning/partials/MidlertidigAdresse.tsx @@ -4,7 +4,7 @@ import { TitleValue } from '@/components/ui/titleValue/TitleValue' import KodeverkConnector from '@/components/kodeverk/KodeverkConnector' import { Historikk } from '@/components/ui/historikk/Historikk' import { ErrorBoundary } from '@/components/ui/appError/ErrorBoundary' -import _ from 'lodash' +import * as _ from 'lodash-es' type AlleMidlertidigeAdresser = { midlertidigAdresse: Array diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/tpsf/visning/partials/Personinfo.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/tpsf/visning/partials/Personinfo.tsx index 8e1c0cfa49b..64cd18d3fe5 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/tpsf/visning/partials/Personinfo.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/tpsf/visning/partials/Personinfo.tsx @@ -3,7 +3,7 @@ import SubOverskrift from '@/components/ui/subOverskrift/SubOverskrift' import { TitleValue } from '@/components/ui/titleValue/TitleValue' import { formatAlder, formatDate, formatKjonn, gtTypeLabel } from '@/utils/DataFormatter' import { GtKodeverk, PersoninformasjonKodeverk } from '@/config/kodeverk' -import _ from 'lodash' +import * as _ from 'lodash-es' function hentSkjermingData(skjermingPath) { if (!skjermingPath) { diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/tpsf/visning/partials/Postadresse.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/tpsf/visning/partials/Postadresse.tsx index c70283141ef..42efa7d4300 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/tpsf/visning/partials/Postadresse.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/tpsf/visning/partials/Postadresse.tsx @@ -2,7 +2,7 @@ import { AdresseKodeverk } from '@/config/kodeverk' import SubOverskrift from '@/components/ui/subOverskrift/SubOverskrift' import { TitleValue } from '@/components/ui/titleValue/TitleValue' import { Historikk } from '@/components/ui/historikk/Historikk' -import _ from 'lodash' +import * as _ from 'lodash-es' export const PostadresseVisning = ({ postadresse }) => { const { postLinje1, postLinje2, postLinje3, postLand } = postadresse diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/udistub/form/validation.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/udistub/form/validation.tsx index 689165b6bcd..47aabeb8da5 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/udistub/form/validation.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/udistub/form/validation.tsx @@ -1,5 +1,5 @@ import * as Yup from 'yup' -import _ from 'lodash' +import * as _ from 'lodash-es' import { ifPresent, requiredBoolean, requiredString } from '@/utils/YupValidations' import { testDatoFom, testDatoTom } from '@/components/fagsystem/utils' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/udistub/visning/UdiVisning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/udistub/visning/UdiVisning.tsx index fab4549f125..2ff674e39d8 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/udistub/visning/UdiVisning.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/udistub/visning/UdiVisning.tsx @@ -1,4 +1,4 @@ -import _ from 'lodash' +import * as _ from 'lodash-es' import SubOverskrift from '@/components/ui/subOverskrift/SubOverskrift' import Loading from '@/components/ui/loading/Loading' import { Oppholdsstatus } from './partials/Oppholdsstatus' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/udistub/visning/partials/Oppholdsstatus.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/udistub/visning/partials/Oppholdsstatus.tsx index bcd4afe21f8..d6462397fff 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/udistub/visning/partials/Oppholdsstatus.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/udistub/visning/partials/Oppholdsstatus.tsx @@ -1,4 +1,4 @@ -import _ from 'lodash' +import * as _ from 'lodash-es' import { TitleValue } from '@/components/ui/titleValue/TitleValue' import { formatStringDates, showLabel } from '@/utils/DataFormatter' import { AvslagEllerBortfall, AvslagEllerBortfallVisning } from './AvslagEllerBortfallVisning' diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/utils.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/utils.tsx index 466901b1772..841d1c7945a 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/utils.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/utils.tsx @@ -1,4 +1,4 @@ -import _ from 'lodash' +import * as _ from 'lodash-es' import { isAfter, isBefore, isEqual } from 'date-fns' import { Relasjon } from '@/components/fagsystem/pdlf/PdlTypes' diff --git a/apps/dolly-frontend/src/main/js/src/components/infostripe/InfoStripe.tsx b/apps/dolly-frontend/src/main/js/src/components/infostripe/InfoStripe.tsx index 0cd7d7a1735..a9167a3fde2 100644 --- a/apps/dolly-frontend/src/main/js/src/components/infostripe/InfoStripe.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/infostripe/InfoStripe.tsx @@ -7,7 +7,7 @@ import Button from '@/components/ui/button/Button' import Icon from '@/components/ui/icon/Icon' import './InfoStripe.less' -import _ from 'lodash' +import * as _ from 'lodash-es' const getInfoStripeUrl = `/dolly-backend/api/v1/infostripe` const HIDDEN_ALERTS = 'HIDDEN_ALERTS' diff --git a/apps/dolly-frontend/src/main/js/src/components/inntektStub/validerInntekt/Inntekt.tsx b/apps/dolly-frontend/src/main/js/src/components/inntektStub/validerInntekt/Inntekt.tsx index 8e252384b93..6305ef97800 100644 --- a/apps/dolly-frontend/src/main/js/src/components/inntektStub/validerInntekt/Inntekt.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/inntektStub/validerInntekt/Inntekt.tsx @@ -1,4 +1,4 @@ -import _ from 'lodash' +import * as _ from 'lodash-es' import { AdresseKodeverk } from '@/config/kodeverk' import { FormSelect } from '@/components/ui/form/inputs/select/Select' import { FormTextInput } from '@/components/ui/form/inputs/textInput/TextInput' diff --git a/apps/dolly-frontend/src/main/js/src/components/inntektStub/validerInntekt/index.tsx b/apps/dolly-frontend/src/main/js/src/components/inntektStub/validerInntekt/index.tsx index e53826e7653..101f155b647 100644 --- a/apps/dolly-frontend/src/main/js/src/components/inntektStub/validerInntekt/index.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/inntektStub/validerInntekt/index.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useState } from 'react' import Inntekt from '@/components/inntektStub/validerInntekt/Inntekt' import InntektstubService from '@/service/services/inntektstub/InntektstubService' -import _ from 'lodash' +import * as _ from 'lodash-es' import { Form, useFormContext, useWatch } from 'react-hook-form' import { isObjectEmptyDeep } from '@/components/ui/form/formUtils' diff --git a/apps/dolly-frontend/src/main/js/src/components/redigerGruppe/RedigerGruppe.tsx b/apps/dolly-frontend/src/main/js/src/components/redigerGruppe/RedigerGruppe.tsx index 1b072fd6533..c42680f8752 100644 --- a/apps/dolly-frontend/src/main/js/src/components/redigerGruppe/RedigerGruppe.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/redigerGruppe/RedigerGruppe.tsx @@ -9,7 +9,7 @@ import { useNavigate } from 'react-router-dom' import { REGEX_BACKEND_GRUPPER, useMatchMutate } from '@/utils/hooks/useMutate' import { TestComponentSelectors } from '#/mocks/Selectors' import { useGruppeById } from '@/utils/hooks/useGruppe' -import _get from 'lodash/get' +import * as _ from 'lodash-es' import { Form, FormProvider, useForm } from 'react-hook-form' import { yupResolver } from '@hookform/resolvers/yup' @@ -45,8 +45,8 @@ const RedigerGruppe = ({ const { gruppe } = useGruppeById(gruppeId) const erRedigering = gruppe?.id !== undefined const initialValues = { - navn: _get(gruppe, 'navn', ''), - hensikt: _get(gruppe, 'hensikt', ''), + navn: _.get(gruppe, 'navn', ''), + hensikt: _.get(gruppe, 'hensikt', ''), } const mutate = useMatchMutate() const formMethods = useForm({ diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/background/Background.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/background/Background.tsx index dec5bce3e5a..69e579a6b90 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/background/Background.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/background/Background.tsx @@ -21,7 +21,7 @@ import '@/snow.scss' import '@/rain.scss' import '@/flowers.scss' import { NEDBOER_TYPE, useWeatherFyrstikkAlleen } from '@/utils/hooks/useWeather' -import _ from 'lodash' +import * as _ from 'lodash-es' const month = new Date().getMonth() const day = new Date().getDate() diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/button/RelatertPersonImportButton/RelatertPersonImportButton.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/button/RelatertPersonImportButton/RelatertPersonImportButton.tsx index a260807bcb6..0d404d55c23 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/button/RelatertPersonImportButton/RelatertPersonImportButton.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/button/RelatertPersonImportButton/RelatertPersonImportButton.tsx @@ -9,7 +9,7 @@ import { DollyApi } from '@/service/Api' import './RelatertPersonImportButton.less' import { DollyCheckbox } from '@/components/ui/form/inputs/checbox/Checkbox' import { allCapsToCapitalized } from '@/utils/DataFormatter' -import _ from 'lodash' +import * as _ from 'lodash-es' import { REGEX_BACKEND_GRUPPER, useMatchMutate } from '@/utils/hooks/useMutate' import { FormProvider, useFieldArray, useForm } from 'react-hook-form' diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/dollyTable/table/Table.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/dollyTable/table/Table.tsx index c22f479fe25..8ee83a542df 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/dollyTable/table/Table.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/dollyTable/table/Table.tsx @@ -1,7 +1,7 @@ import cn from 'classnames' import Row from './TableRow' import Column from './TableColumn' -import _ from 'lodash' +import * as _ from 'lodash-es' import { LaastGruppeIconItem } from '@/components/ui/icon/IconItem' import './Table.less' diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/form/formUtils.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/form/formUtils.tsx index 4648751b76f..0be8bce498b 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/form/formUtils.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/form/formUtils.tsx @@ -1,4 +1,4 @@ -import _ from 'lodash' +import * as _ from 'lodash-es' import { runningE2ETest } from '@/service/services/Request' import { isDate } from 'date-fns' import { useFormContext } from 'react-hook-form' @@ -13,7 +13,7 @@ export const panelError = (attributtPath) => { // Strings er akseptert, men konverter til Array if (!Array.isArray(attributtPath)) attributtPath = [attributtPath] - return attributtPath.some((attr) => _.has(errors, attr)) + return attributtPath.some((attr) => _.has(errors, attr) || _.has(errors, `manual.${attr}`)) } export const SyntEvent = (name, value) => ({ target: { name, value } }) diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/datepicker/Datepicker.less b/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/datepicker/Datepicker.less deleted file mode 100644 index a0530bcd5cd..00000000000 --- a/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/datepicker/Datepicker.less +++ /dev/null @@ -1,5 +0,0 @@ -@import (reference) '@/styles/variables.less'; - -.react-datepicker-wrapper { - width: 100%; -} diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/datepicker/Datepicker.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/datepicker/Datepicker.tsx index be2062d8add..0a075c14630 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/datepicker/Datepicker.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/datepicker/Datepicker.tsx @@ -1,10 +1,6 @@ -import { registerLocale } from 'react-datepicker' import { addYears, subYears } from 'date-fns' -import locale_nb from 'date-fns/locale/nb' import { Vis } from '@/components/bestillingsveileder/VisAttributt' import { SyntEvent } from '@/components/ui/form/formUtils' -import 'react-datepicker/dist/react-datepicker.css' -import './Datepicker.less' import { useFormContext } from 'react-hook-form' import { DatePicker, useDatepicker } from '@navikt/ds-react' import React, { BaseSyntheticEvent, useCallback, useEffect, useState } from 'react' @@ -14,8 +10,6 @@ import { Label } from '@/components/ui/form/inputs/label/Label' import { formatDate } from '@/utils/DataFormatter' import { convertInputToDate } from '@/components/ui/form/DateFormatUtils' -registerLocale('nb', locale_nb) - export const DollyDatepicker = (props: any) => { const { excludeDates, diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/label/Label.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/label/Label.tsx index a8c614c877f..637125e5865 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/label/Label.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/label/Label.tsx @@ -1,5 +1,5 @@ import cn from 'classnames' -import _ from 'lodash' +import * as _ from 'lodash-es' import styled from 'styled-components' import './Label.less' import { Hjelpetekst } from '@/components/hjelpetekst/Hjelpetekst' diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/monthpicker/Monthpicker.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/monthpicker/Monthpicker.tsx index a0f244a194c..a039e09eaff 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/monthpicker/Monthpicker.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/monthpicker/Monthpicker.tsx @@ -3,7 +3,7 @@ import { InputWrapper } from '@/components/ui/form/inputWrapper/InputWrapper' import { MonthPicker, useMonthpicker } from '@navikt/ds-react' import { addYears, isDate, subYears } from 'date-fns' import { useFormContext } from 'react-hook-form' -import _ from 'lodash' +import * as _ from 'lodash-es' import { useEffect } from 'react' interface MonthpickerProps { diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/select/Select.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/select/Select.tsx index c15f0a5cd95..a28c6220437 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/select/Select.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/select/Select.tsx @@ -7,7 +7,7 @@ import { SyntEvent } from '@/components/ui/form/formUtils' import './Select.less' import MenuList from '@/components/ui/form/inputs/select/MenuList' import Option from '@/components/ui/form/inputs/select/Option' -import _ from 'lodash' +import * as _ from 'lodash-es' import { useKodeverk } from '@/utils/hooks/useKodeverk' import { useController, useFormContext } from 'react-hook-form' import { useContext } from 'react' diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/textInput/TextInput.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/textInput/TextInput.tsx index 75289255037..6490cd4e0fd 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/textInput/TextInput.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/textInput/TextInput.tsx @@ -10,7 +10,7 @@ import { ShowErrorContext, ShowErrorContextType, } from '@/components/bestillingsveileder/ShowErrorContext' -import _ from 'lodash' +import * as _ from 'lodash-es' import FormFieldInput from '@/components/ui/form/inputs/textInput/FormFieldInput' import { Button } from '@navikt/ds-react' diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/historikk/Historikk.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/historikk/Historikk.tsx index 20ef1f64f6e..eaa14fb0c36 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/historikk/Historikk.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/historikk/Historikk.tsx @@ -1,4 +1,4 @@ -import _ from 'lodash' +import * as _ from 'lodash-es' import './historikk.less' diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/titleValue/TitleValue.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/titleValue/TitleValue.tsx index b03486dabb4..bfd25080578 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/titleValue/TitleValue.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/titleValue/TitleValue.tsx @@ -1,5 +1,5 @@ import cn from 'classnames' -import _ from 'lodash' +import * as _ from 'lodash-es' import KodeverkConnector from '@/components/kodeverk/KodeverkConnector' import Loading from '@/components/ui/loading/Loading' diff --git a/apps/dolly-frontend/src/main/js/src/ducks/bestilling/index.tsx b/apps/dolly-frontend/src/main/js/src/ducks/bestilling/index.tsx index 1c12d2937c0..a1f690c4970 100644 --- a/apps/dolly-frontend/src/main/js/src/ducks/bestilling/index.tsx +++ b/apps/dolly-frontend/src/main/js/src/ducks/bestilling/index.tsx @@ -1,10 +1,9 @@ import { createActions } from 'redux-actions' import { DollyApi } from '@/service/Api' -import _ from 'lodash' -import _set from 'lodash/fp/set' import { handleActions } from '@/ducks/utils/immerHandleActions' import { getLeggTilIdent, rootPaths } from '@/components/bestillingsveileder/utils' import { v4 as uuid } from 'uuid' +import * as _ from 'lodash-es' import { Logger } from '@/logger/Logger' export const actions = createActions( @@ -57,17 +56,13 @@ export const sendBestilling = (values, opts, gruppeId, navigate) => async (dispa } else if (opts.is.leggTilPaaGruppe) { bestillingAction = actions.postBestillingLeggTilPaaGruppe(gruppeId, values) } else if (opts.is.opprettFraIdenter) { - values = _set('opprettFraIdenter', opts.opprettFraIdenter, values) + values = Object.assign({}, values, { opprettFraIdenter: opts.opprettFraIdenter }) bestillingAction = actions.postBestillingFraEksisterendeIdenter(gruppeId, values) } else if (opts.is.importTestnorge) { - values = _set( - 'identer', - opts.importPersoner.map((person) => person.ident), - values, - ) - if (!values.environments) { - values = _set('environments', [], values) - } + values = Object.assign({}, values, { + identer: opts.importPersoner.map((person) => person.ident), + environments: values.environments || [], + }) bestillingAction = actions.postTestnorgeBestilling(values.gruppeId, values) } else if (values.organisasjon) { trackBestilling(values) diff --git a/apps/dolly-frontend/src/main/js/src/ducks/bestillingStatus/index.tsx b/apps/dolly-frontend/src/main/js/src/ducks/bestillingStatus/index.tsx index c639daa2546..43fecef6679 100644 --- a/apps/dolly-frontend/src/main/js/src/ducks/bestillingStatus/index.tsx +++ b/apps/dolly-frontend/src/main/js/src/ducks/bestillingStatus/index.tsx @@ -1,5 +1,5 @@ import { createActions } from 'redux-actions' -import _ from 'lodash' +import * as _ from 'lodash-es' import { DollyApi } from '@/service/Api' export const { diff --git a/apps/dolly-frontend/src/main/js/src/ducks/errors/index.tsx b/apps/dolly-frontend/src/main/js/src/ducks/errors/index.tsx index 7709b9750f2..69e0ca868b4 100644 --- a/apps/dolly-frontend/src/main/js/src/ducks/errors/index.tsx +++ b/apps/dolly-frontend/src/main/js/src/ducks/errors/index.tsx @@ -1,6 +1,6 @@ import { createAction } from 'redux-actions' import { createSelector } from 'reselect' -import _ from 'lodash' +import * as _ from 'lodash-es' export const clearAllErrors = createAction('ERRORS/CLEAR_ALL_ERRORS') export const addGlobalError = createAction('ERRORS/ADD_GLOBAL_ERROR') diff --git a/apps/dolly-frontend/src/main/js/src/ducks/fagsystem/index.tsx b/apps/dolly-frontend/src/main/js/src/ducks/fagsystem/index.tsx index 62c205f6273..2411b201ba6 100644 --- a/apps/dolly-frontend/src/main/js/src/ducks/fagsystem/index.tsx +++ b/apps/dolly-frontend/src/main/js/src/ducks/fagsystem/index.tsx @@ -14,7 +14,7 @@ import { onSuccess } from '@/ducks/utils/requestActions' import { successMiljoSelector } from '@/ducks/bestillingStatus' import { handleActions } from '@/ducks/utils/immerHandleActions' import { formatAlder, formatKjonn } from '@/utils/DataFormatter' -import _ from 'lodash' +import * as _ from 'lodash-es' export const actions = createActions( { diff --git a/apps/dolly-frontend/src/main/js/src/ducks/finnPerson/index.tsx b/apps/dolly-frontend/src/main/js/src/ducks/finnPerson/index.tsx index 2eaf7f7ae4a..789c5c5f03d 100644 --- a/apps/dolly-frontend/src/main/js/src/ducks/finnPerson/index.tsx +++ b/apps/dolly-frontend/src/main/js/src/ducks/finnPerson/index.tsx @@ -4,7 +4,7 @@ import { onFailure, onSuccess } from '@/ducks/utils/requestActions' import { handleActions } from '@/ducks/utils/immerHandleActions' import { LOCATION_CHANGE } from 'redux-first-history' import { VisningType } from '@/pages/gruppe/Gruppe' -import { isEmpty } from 'lodash' +import * as _ from 'lodash-es' import { ERROR_NAVIGATE_IDENT } from '../errors/ErrorMessages' export const { @@ -56,7 +56,7 @@ export default handleActions( state.feilmelding = action.payload.data?.message }, [onSuccess(navigerTilPerson)](state, action) { - state.feilmelding = isEmpty(action.payload?.data) + state.feilmelding = _.isEmpty(action.payload?.data) ? ERROR_NAVIGATE_IDENT : action.payload?.data?.message state.hovedperson = action.payload.data.identHovedperson diff --git a/apps/dolly-frontend/src/main/js/src/pages/dollySoek/ResultatVisning.tsx b/apps/dolly-frontend/src/main/js/src/pages/dollySoek/ResultatVisning.tsx index 27ee2a1e790..5f7f331a08a 100644 --- a/apps/dolly-frontend/src/main/js/src/pages/dollySoek/ResultatVisning.tsx +++ b/apps/dolly-frontend/src/main/js/src/pages/dollySoek/ResultatVisning.tsx @@ -12,7 +12,7 @@ import { NavigerTilPerson } from '@/pages/dollySoek/NavigerTilPerson' import { PersonVisning } from '@/pages/dollySoek/PersonVisning' import { usePdlPersonbolk } from '@/utils/hooks/usePdlPerson' import { runningE2ETest } from '@/service/services/Request' -import _ from 'lodash' +import * as _ from 'lodash-es' export const ResultatVisning = ({ resultat, soekError }) => { const identString = resultat?.identer?.join(',') diff --git a/apps/dolly-frontend/src/main/js/src/pages/dollySoek/SoekForm.tsx b/apps/dolly-frontend/src/main/js/src/pages/dollySoek/SoekForm.tsx index 46ad101518e..0f723ad62d7 100644 --- a/apps/dolly-frontend/src/main/js/src/pages/dollySoek/SoekForm.tsx +++ b/apps/dolly-frontend/src/main/js/src/pages/dollySoek/SoekForm.tsx @@ -7,7 +7,7 @@ import { Accordion, Button } from '@navikt/ds-react' import { AdresseKodeverk, GtKodeverk } from '@/config/kodeverk' import { useSoekIdenter, useSoekTyper } from '@/utils/hooks/usePersonSoek' import { ResultatVisning } from '@/pages/dollySoek/ResultatVisning' -import _ from 'lodash' +import * as _ from 'lodash-es' import { TestComponentSelectors } from '#/mocks/Selectors' import { Form, FormProvider, useForm } from 'react-hook-form' import { diff --git a/apps/dolly-frontend/src/main/js/src/pages/gruppe/BestillingListe/BestillingListe.tsx b/apps/dolly-frontend/src/main/js/src/pages/gruppe/BestillingListe/BestillingListe.tsx index 1f9036433cf..357447d6d5d 100644 --- a/apps/dolly-frontend/src/main/js/src/pages/gruppe/BestillingListe/BestillingListe.tsx +++ b/apps/dolly-frontend/src/main/js/src/pages/gruppe/BestillingListe/BestillingListe.tsx @@ -1,4 +1,4 @@ -import _ from 'lodash' +import * as _ from 'lodash-es' import { DollyTable } from '@/components/ui/dollyTable/DollyTable' import ContentContainer from '@/components/ui/contentContainer/ContentContainer' import BestillingDetaljer from '@/components/bestilling/detaljer/BestillingDetaljer' diff --git a/apps/dolly-frontend/src/main/js/src/pages/gruppe/Gruppe.tsx b/apps/dolly-frontend/src/main/js/src/pages/gruppe/Gruppe.tsx index 4faaeea7d11..3dea1a065ea 100644 --- a/apps/dolly-frontend/src/main/js/src/pages/gruppe/Gruppe.tsx +++ b/apps/dolly-frontend/src/main/js/src/pages/gruppe/Gruppe.tsx @@ -1,30 +1,42 @@ +import React, { Suspense } from 'react' import useBoolean from '@/utils/hooks/useBoolean' import Loading from '@/components/ui/loading/Loading' -import NavButton from '@/components/ui/button/NavButton/NavButton' -import PersonListeConnector from './PersonListe/PersonListeConnector' -import BestillingListeConnector from './BestillingListe/BestillingListeConnector' -import { BestillingsveilederModal } from '@/components/bestillingsveileder/startModal/StartModal' -import Icon from '@/components/ui/icon/Icon' import { useLocation, useNavigate, useParams } from 'react-router-dom' import { useDispatch } from 'react-redux' -import FinnPersonBestillingConnector from '@/pages/gruppeOversikt/FinnPersonBestillingConnector' import { resetNavigering, resetPaginering } from '@/ducks/finnPerson' -import GruppeHeaderConnector from '@/pages/gruppe/GruppeHeader/GruppeHeaderConnector' import { useCurrentBruker } from '@/utils/hooks/useBruker' import { useGruppeById } from '@/utils/hooks/useGruppe' import { useIkkeFerdigBestillingerGruppe } from '@/utils/hooks/useBestilling' -import StatusListeConnector from '@/components/bestilling/statusListe/StatusListeConnector' -import './Gruppe.less' -import { GruppeFeil, GruppeFeilmelding } from '@/pages/gruppe/GruppeFeil/GruppeFeilmelding' import { ToggleGroup } from '@navikt/ds-react' import { TestComponentSelectors } from '#/mocks/Selectors' +import './Gruppe.less' +import { GruppeFeil, GruppeFeilmelding } from '@/pages/gruppe/GruppeFeil/GruppeFeilmelding' +import GruppeHeaderConnector from '@/pages/gruppe/GruppeHeader/GruppeHeaderConnector' +import NavButton from '@/components/ui/button/NavButton/NavButton' +import Icon from '@/components/ui/icon/Icon' +import { lazyWithPreload } from '@/utils/lazyWithPreload' + +const PersonListeConnector = lazyWithPreload(() => import('./PersonListe/PersonListeConnector')) +const BestillingListeConnector = lazyWithPreload( + () => import('./BestillingListe/BestillingListeConnector'), +) +const BestillingsveilederModal = lazyWithPreload( + () => import('@/components/bestillingsveileder/startModal/StartModal'), +) + +const FinnPersonBestillingConnector = lazyWithPreload( + () => import('@/pages/gruppeOversikt/FinnPersonBestillingConnector'), +) +const StatusListeConnector = lazyWithPreload( + () => import('@/components/bestilling/statusListe/StatusListeConnector'), +) export type GruppeProps = { visning: string - setVisning: Function + setVisning: (value: VisningType) => void sidetall: number sideStoerrelse: number - sorting: object + sorting: { kolonne: string; retning: string } update: string } @@ -41,16 +53,14 @@ export default ({ sorting, update, }: GruppeProps) => { - const { gruppeId } = useParams() - const { - currentBruker: { brukernavn, brukertype }, - loading: loadingBruker, - } = useCurrentBruker() - + const { gruppeId } = useParams<{ gruppeId: string }>() + const { currentBruker, loading: loadingBruker } = useCurrentBruker() const location = useLocation() + const dispatch = useDispatch() + const navigate = useNavigate() const { bestillingerById: ikkeFerdigBestillinger } = useIkkeFerdigBestillingerGruppe( - gruppeId, + gruppeId!, 'personer', sidetall, sideStoerrelse, @@ -58,7 +68,7 @@ export default ({ ) const { bestillingerById, loading: loadingBestillinger } = useIkkeFerdigBestillingerGruppe( - gruppeId, + gruppeId!, visning, sidetall, sideStoerrelse, @@ -69,22 +79,18 @@ export default ({ gruppe, identer, loading: loadingGruppe, - // @ts-ignore } = useGruppeById( - gruppeId, + gruppeId!, location?.state?.sidetall || sidetall, sideStoerrelse, false, - sorting?.kolonne, - sorting?.retning, + sorting?.kolonne || '', + sorting?.retning || '', ) const [startBestillingAktiv, visStartBestilling, skjulStartBestilling] = useBoolean(false) - const dispatch = useDispatch() - const navigate = useNavigate() - - const bankIdBruker = brukertype === 'BANKID' + const bankIdBruker = currentBruker?.brukertype === 'BANKID' if (loadingBruker || loadingGruppe || loadingBestillinger) { return @@ -111,105 +117,115 @@ export default ({ return (
- - {ikkeFerdigBestillinger && ( - // @ts-ignore - - )} -
-
- {!bankIdBruker && ( + }> + + {ikkeFerdigBestillinger && ( + + )} +
+
+ {!bankIdBruker && ( + { + BestillingsveilederModal?.preload?.() + StatusListeConnector?.preload?.() + }} + disabled={erLaast} + title={ + erLaast ? 'Denne gruppen er låst, og du kan ikke legge til flere personer.' : '' + } + className="margin-top-5 margin-bottom-5 margin-right-10" + > + Opprett personer + + )} + navigate(`/tenor/personer`, { + state: { + gruppe: gruppe, + }, + }) + } disabled={erLaast} title={ erLaast ? 'Denne gruppen er låst, og du kan ikke legge til flere personer.' : '' } - className="margin-top-5 margin-bottom-5 margin-right-10" + className="margin-top-5 margin-bottom-5" > - Opprett personer + Importer personer - )} - - navigate(`/tenor/personer`, { - state: { - gruppe: gruppe, - }, - }) - } - disabled={erLaast} - title={erLaast ? 'Denne gruppen er låst, og du kan ikke legge til flere personer.' : ''} - className="margin-top-5 margin-bottom-5" - > - Importer personer - -
- {!bankIdBruker && } -
-
- -
+ {!bankIdBruker && } +
+
+ - - {`Personer (${gruppe.antallIdenter || 0})`} - - - + + {`Personer (${gruppe.antallIdenter || 0})`} + + - {`Bestillinger (${gruppe.antallBestillinger || 0})`} - - + value={VisningType.VISNING_BESTILLING} + > + + {`Bestillinger (${gruppe.antallBestillinger || 0})`} + + +
-
- {startBestillingAktiv && ( - - )} - {visning === VisningType.VISNING_PERSONER && ( - - )} - {visning === VisningType.VISNING_BESTILLING && ( - - )} + {startBestillingAktiv && ( + + )} + {visning === VisningType.VISNING_PERSONER && ( + + )} + {visning === VisningType.VISNING_BESTILLING && ( + + )} +
) } diff --git a/apps/dolly-frontend/src/main/js/src/pages/gruppe/PersonListe/PersonListe.tsx b/apps/dolly-frontend/src/main/js/src/pages/gruppe/PersonListe/PersonListe.tsx index 7c618b4af48..145656f26d7 100644 --- a/apps/dolly-frontend/src/main/js/src/pages/gruppe/PersonListe/PersonListe.tsx +++ b/apps/dolly-frontend/src/main/js/src/pages/gruppe/PersonListe/PersonListe.tsx @@ -9,7 +9,7 @@ import { ErrorBoundary } from '@/components/ui/appError/ErrorBoundary' import useBoolean from '@/utils/hooks/useBoolean' import { KommentarModal } from '@/pages/gruppe/PersonListe/modal/KommentarModal' import { selectPersonListe, sokSelector } from '@/ducks/fagsystem' -import _ from 'lodash' +import * as _ from 'lodash-es' import DollyTooltip from '@/components/ui/button/DollyTooltip' import { setSorting } from '@/ducks/finnPerson' import { useDispatch } from 'react-redux' @@ -47,7 +47,7 @@ export default function PersonListe({ tmpPersoner, sorting, bestillingerById, -}) { +}: any) { const [isKommentarModalOpen, openKommentarModal, closeKommentarModal] = useBoolean(false) const [selectedIdent, setSelectedIdent] = useState(null) const [identListe, setIdentListe] = useState([]) diff --git a/apps/dolly-frontend/src/main/js/src/pages/gruppe/PersonVisning/PersonMiljoeinfo/TpsDataVisning.tsx b/apps/dolly-frontend/src/main/js/src/pages/gruppe/PersonVisning/PersonMiljoeinfo/TpsDataVisning.tsx index c807e0a056a..3c27d5d4763 100644 --- a/apps/dolly-frontend/src/main/js/src/pages/gruppe/PersonVisning/PersonMiljoeinfo/TpsDataVisning.tsx +++ b/apps/dolly-frontend/src/main/js/src/pages/gruppe/PersonVisning/PersonMiljoeinfo/TpsDataVisning.tsx @@ -2,11 +2,11 @@ import './DataVisning.less' // @ts-ignore import Tooltip from 'rc-tooltip' import 'rc-tooltip/assets/bootstrap_white.css' -import { TpsfVisning } from '@/components/fagsystem' import DollyTooltip from '@/components/ui/button/DollyTooltip' import { ApiFeilmelding } from '@/pages/gruppe/PersonVisning/PersonMiljoeinfo/PdlDataVisning' import React from 'react' import { TestComponentSelectors } from '#/mocks/Selectors' +import { TpsfVisning } from '@/components/fagsystem/tpsf/visning/Visning' type TpsData = { data: Array diff --git a/apps/dolly-frontend/src/main/js/src/pages/gruppe/PersonVisning/PersonVisning.tsx b/apps/dolly-frontend/src/main/js/src/pages/gruppe/PersonVisning/PersonVisning.tsx index 2d746a05ec2..22dc526611b 100644 --- a/apps/dolly-frontend/src/main/js/src/pages/gruppe/PersonVisning/PersonVisning.tsx +++ b/apps/dolly-frontend/src/main/js/src/pages/gruppe/PersonVisning/PersonVisning.tsx @@ -2,22 +2,6 @@ import React, { useEffect } from 'react' import Button from '@/components/ui/button/Button' import { TidligereBestillinger } from '@/pages/gruppe/PersonVisning/TidligereBestillinger/TidligereBestillinger' import { PersonMiljoeinfo } from '@/pages/gruppe/PersonVisning/PersonMiljoeinfo/PersonMiljoeinfo' -import { - AaregVisning, - ArenaVisning, - BrregVisning, - DokarkivVisning, - HistarkVisning, - InntektsmeldingVisning, - InntektstubVisning, - InstVisning, - KrrVisning, - PensjonVisning, - SigrunstubVisning, - SykemeldingVisning, - TpVisning, - UdiVisning, -} from '@/components/fagsystem' import BeskrivelseConnector from '@/components/beskrivelse/BeskrivelseConnector' import { SlettButton } from '@/components/ui/button/SlettButton/SlettButton' import { BestillingSammendragModal } from '@/components/bestilling/sammendrag/BestillingSammendragModal' @@ -32,9 +16,15 @@ import { RelatertPersonImportButton } from '@/components/ui/button/RelatertPerso import { useAsync } from 'react-use' import { DollyApi } from '@/service/Api' import { GjenopprettPerson } from '@/components/bestilling/gjenopprett/GjenopprettPerson' -import { sjekkManglerBrregData } from '@/components/fagsystem/brregstub/visning/BrregVisning' -import { sjekkManglerPensjonData } from '@/components/fagsystem/pensjon/visning/PensjonVisning' -import { sjekkManglerAaregData } from '@/components/fagsystem/aareg/visning/Visning' +import { + BrregVisning, + sjekkManglerBrregData, +} from '@/components/fagsystem/brregstub/visning/BrregVisning' +import { + PensjonVisning, + sjekkManglerPensjonData, +} from '@/components/fagsystem/pensjon/visning/PensjonVisning' +import { AaregVisning, sjekkManglerAaregData } from '@/components/fagsystem/aareg/visning/Visning' import { useArbeidsforhold } from '@/utils/hooks/useOrganisasjoner' import { useArbeidsplassencvData, @@ -47,8 +37,11 @@ import { useTpData, useTransaksjonIdData, } from '@/utils/hooks/useFagsystemer' -import { sjekkManglerTpData } from '@/components/fagsystem/tjenestepensjon/visning/TpVisning' -import { sjekkManglerInstData } from '@/components/fagsystem/inst/visning/InstVisning' +import { + sjekkManglerTpData, + TpVisning, +} from '@/components/fagsystem/tjenestepensjon/visning/TpVisning' +import { InstVisning, sjekkManglerInstData } from '@/components/fagsystem/inst/visning/InstVisning' import { harAaregBestilling, harAfpOffentligBestilling, @@ -74,13 +67,14 @@ import { sjekkManglerApData, } from '@/components/fagsystem/alderspensjon/visning/AlderspensjonVisning' import { ArbeidsplassenVisning } from '@/components/fagsystem/arbeidsplassen/visning/Visning' -import _has from 'lodash/has' +import * as _ from 'lodash-es' import { MedlVisning } from '@/components/fagsystem/medl/visning' import { useMedlPerson } from '@/utils/hooks/useMedl' import StyledAlert from '@/components/ui/alert/StyledAlert' import { sjekkManglerSykemeldingBestilling, sjekkManglerSykemeldingData, + SykemeldingVisning, } from '@/components/fagsystem/sykdom/visning/Visning' import { sjekkManglerUforetrygdData, @@ -104,6 +98,15 @@ import { sjekkManglerYrkesskadeData, YrkesskaderVisning, } from '@/components/fagsystem/yrkesskader/visning/YrkesskaderVisning' +import { InntektsmeldingVisning } from '@/components/fagsystem/inntektsmelding/visning/Visning' +import { SigrunstubVisning } from '@/components/fagsystem/sigrunstub/visning/Visning' +import { InntektstubVisning } from '@/components/fagsystem/inntektstub/visning/Visning' +import { ArenaVisning } from '@/components/fagsystem/arena/visning/ArenaVisning' +import { KrrVisning } from '@/components/fagsystem/krrstub/visning/KrrVisning' +import { UdiVisning } from '@/components/fagsystem/udistub/visning/UdiVisning' + +import DokarkivVisning from '@/components/fagsystem/dokarkiv/visning/DokarkivVisning' +import HistarkVisning from '@/components/fagsystem/histark/visning/HistarkVisning' const getIdenttype = (ident) => { if (parseInt(ident.charAt(0)) > 3) { @@ -383,7 +386,7 @@ export default ({ const getArbeidsplassencvHjemmel = () => { if (!harArbeidsplassenBestilling(bestillingerFagsystemer)) return null const arbeidsplassenBestillinger = bestillingListe.filter((bestilling) => - _has(bestilling.data, 'arbeidsplassenCV'), + _.has(bestilling.data, 'arbeidsplassenCV'), ) return arbeidsplassenBestillinger?.[0]?.data?.arbeidsplassenCV?.harHjemmel } diff --git a/apps/dolly-frontend/src/main/js/src/pages/inntektStubPage/InntektStubPage.tsx b/apps/dolly-frontend/src/main/js/src/pages/inntektStubPage/InntektStubPage.tsx deleted file mode 100644 index b54e89630c1..00000000000 --- a/apps/dolly-frontend/src/main/js/src/pages/inntektStubPage/InntektStubPage.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import InntektStub from '@/components/inntektStub/validerInntekt' - -const InntektStubPage = () => ( - <> -

Inntektstub

- - -) - -InntektStubPage.displayName = 'InntektStubPage' - -export default InntektStubPage diff --git a/apps/dolly-frontend/src/main/js/src/pages/organisasjoner/OrganisasjonBestilling.tsx b/apps/dolly-frontend/src/main/js/src/pages/organisasjoner/OrganisasjonBestilling.tsx index 2cf3e771375..e7eecf66f2f 100644 --- a/apps/dolly-frontend/src/main/js/src/pages/organisasjoner/OrganisasjonBestilling.tsx +++ b/apps/dolly-frontend/src/main/js/src/pages/organisasjoner/OrganisasjonBestilling.tsx @@ -1,4 +1,4 @@ -import _ from 'lodash' +import * as _ from 'lodash-es' import { ErrorBoundary } from '@/components/ui/appError/ErrorBoundary' import { DollyTable } from '@/components/ui/dollyTable/DollyTable' import { BestillingIconItem } from '@/components/ui/icon/IconItem' diff --git a/apps/dolly-frontend/src/main/js/src/pages/organisasjoner/OrganisasjonListe.tsx b/apps/dolly-frontend/src/main/js/src/pages/organisasjoner/OrganisasjonListe.tsx index 427ccf8a8dc..3b8a5ed5504 100644 --- a/apps/dolly-frontend/src/main/js/src/pages/organisasjoner/OrganisasjonListe.tsx +++ b/apps/dolly-frontend/src/main/js/src/pages/organisasjoner/OrganisasjonListe.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useState } from 'react' -import _ from 'lodash' +import * as _ from 'lodash-es' import { ErrorBoundary } from '@/components/ui/appError/ErrorBoundary' import 'rc-tooltip/assets/bootstrap.css' import { OrganisasjonItem } from '@/components/ui/icon/IconItem' diff --git a/apps/dolly-frontend/src/main/js/src/pages/organisasjoner/OrganisasjonTenorSoek/OrganisasjonTenorSoekPage.tsx b/apps/dolly-frontend/src/main/js/src/pages/organisasjoner/OrganisasjonTenorSoek/OrganisasjonTenorSoekPage.tsx index 9bc24fc4633..0a202dadb0f 100644 --- a/apps/dolly-frontend/src/main/js/src/pages/organisasjoner/OrganisasjonTenorSoek/OrganisasjonTenorSoekPage.tsx +++ b/apps/dolly-frontend/src/main/js/src/pages/organisasjoner/OrganisasjonTenorSoek/OrganisasjonTenorSoekPage.tsx @@ -29,7 +29,7 @@ const initialState = { nesteSide: null, } -export const OrganisasjonTenorSoekPage = () => { +export default () => { const [request, setRequest] = useState({}) const [state, setState] = useState(initialState) const { response, loading, error, mutate } = useTenorOversiktOrganisasjoner( diff --git a/apps/dolly-frontend/src/main/js/src/pages/organisasjoner/OrganisasjonTenorSoek/SoekFormOrg.tsx b/apps/dolly-frontend/src/main/js/src/pages/organisasjoner/OrganisasjonTenorSoek/SoekFormOrg.tsx index e18848b4179..2075d097826 100644 --- a/apps/dolly-frontend/src/main/js/src/pages/organisasjoner/OrganisasjonTenorSoek/SoekFormOrg.tsx +++ b/apps/dolly-frontend/src/main/js/src/pages/organisasjoner/OrganisasjonTenorSoek/SoekFormOrg.tsx @@ -1,9 +1,8 @@ import { Form, FormProvider, useForm } from 'react-hook-form' import styled from 'styled-components' import { Accordion } from '@navikt/ds-react' -import React from 'react' +import React, { lazy, Suspense } from 'react' import { Header } from '@/components/ui/soekForm/SoekForm' -import DisplayFormState from '@/utils/DisplayFormState' import { isDate } from 'date-fns' import { fixTimezone } from '@/components/ui/form/formUtils' import { EnhetsregisteretForetaksregisteret } from '@/pages/organisasjoner/OrganisasjonTenorSoek/soekFormPartials/EnhetsregisteretForetaksregisteret' @@ -12,6 +11,7 @@ import { EnhetsregisteretArbeidsforhold } from '@/pages/organisasjoner/Organisas import { SamletReskontroinnsyn } from '@/pages/organisasjoner/OrganisasjonTenorSoek/soekFormPartials/SamletReskontroinnsyn' import { Tjenestepensjonsavtale } from '@/pages/organisasjoner/OrganisasjonTenorSoek/soekFormPartials/Tjenestepensjonsavtale' import { TestComponentSelectors } from '#/mocks/Selectors' +import Loading from '@/components/ui/loading/Loading' const SoekefeltWrapper = styled.div` display: flex; @@ -29,6 +29,8 @@ const Soekefelt = styled.div` ` export const SoekFormOrg = ({ setRequest, mutate }: any) => { + const DisplayFormState = lazy(() => import('@/utils/DisplayFormState')) + const formMethods = useForm({ mode: 'onChange', defaultValues: {}, @@ -207,7 +209,11 @@ export const SoekFormOrg = ({ setRequest, mutate }: any) => { - {devEnabled && } + {devEnabled && ( + }> + + + )} diff --git a/apps/dolly-frontend/src/main/js/src/pages/tenorSoek/SoekForm.tsx b/apps/dolly-frontend/src/main/js/src/pages/tenorSoek/SoekForm.tsx index b0b0a264988..b154de34f0e 100644 --- a/apps/dolly-frontend/src/main/js/src/pages/tenorSoek/SoekForm.tsx +++ b/apps/dolly-frontend/src/main/js/src/pages/tenorSoek/SoekForm.tsx @@ -1,9 +1,8 @@ import { Form, FormProvider, useForm } from 'react-hook-form' import styled from 'styled-components' import { Accordion } from '@navikt/ds-react' -import React from 'react' +import React, { lazy, Suspense } from 'react' import { Header } from '@/components/ui/soekForm/SoekForm' -import DisplayFormState from '@/utils/DisplayFormState' import { EnhetsregisteretForetaksregisteret } from '@/pages/tenorSoek/soekFormPartials/EnhetsregisteretForetaksregisteret' import { FolkeregisteretIdentifikasjonStatus } from '@/pages/tenorSoek/soekFormPartials/FolkeregisteretIdentifikasjonStatus' import { FolkeregisteretStatsborgerskap } from '@/pages/tenorSoek/soekFormPartials/FolkeregisteretStatsborgerskap' @@ -16,6 +15,7 @@ import { fixTimezone } from '@/components/ui/form/formUtils' import { Tjenestepensjonsavtale } from '@/pages/tenorSoek/soekFormPartials/Tjenestepensjonsavtale' import { Skattemelding } from '@/pages/tenorSoek/soekFormPartials/Skattemelding' import { InntektAordningen } from '@/pages/tenorSoek/soekFormPartials/InntektAordningen' +import Loading from '@/components/ui/loading/Loading' const SoekefeltWrapper = styled.div` display: flex; @@ -33,6 +33,7 @@ const Soekefelt = styled.div` ` export const SoekForm = ({ setRequest, setMarkertePersoner, mutate }: any) => { + const DisplayFormState = lazy(() => import('@/utils/DisplayFormState')) const formMethods = useForm({ mode: 'onChange', defaultValues: {}, @@ -290,7 +291,11 @@ export const SoekForm = ({ setRequest, setMarkertePersoner, mutate }: any) => { - {devEnabled && } + {devEnabled && ( + }> + + + )} diff --git a/apps/dolly-frontend/src/main/js/src/pages/tenorSoek/resultatVisning/PersonVisning.tsx b/apps/dolly-frontend/src/main/js/src/pages/tenorSoek/resultatVisning/PersonVisning.tsx index 8b6989c98c4..7948b878300 100644 --- a/apps/dolly-frontend/src/main/js/src/pages/tenorSoek/resultatVisning/PersonVisning.tsx +++ b/apps/dolly-frontend/src/main/js/src/pages/tenorSoek/resultatVisning/PersonVisning.tsx @@ -1,6 +1,6 @@ import { Alert, Box } from '@navikt/ds-react' import React from 'react' -import _ from 'lodash' +import * as _ from 'lodash-es' import { FolkeregisteretVisning } from '@/pages/tenorSoek/resultatVisning/FolkeregisteretVisning' import styled from 'styled-components' import { InntektVisning } from '@/pages/tenorSoek/resultatVisning/InntektVisning' diff --git a/apps/dolly-frontend/src/main/js/src/pages/tenorSoek/resultatVisning/TabsVisning.tsx b/apps/dolly-frontend/src/main/js/src/pages/tenorSoek/resultatVisning/TabsVisning.tsx index f68031380ed..3724e2ed864 100644 --- a/apps/dolly-frontend/src/main/js/src/pages/tenorSoek/resultatVisning/TabsVisning.tsx +++ b/apps/dolly-frontend/src/main/js/src/pages/tenorSoek/resultatVisning/TabsVisning.tsx @@ -1,8 +1,7 @@ import { Tabs } from '@navikt/ds-react' -import React from 'react' +import React, { lazy } from 'react' import styled from 'styled-components' import { FileCodeIcon, KeyVerticalIcon } from '@navikt/aksel-icons' -import SyntaxHighlighter from 'react-syntax-highlighter' const TabsVisningFormatter = styled.div` width: 100%; @@ -20,12 +19,9 @@ const TabsVisningFormatter = styled.div` } ` -const StyledCodeView = styled(SyntaxHighlighter)` - font-size: 0.9em; - margin: 0; -` - export const TabsVisning = ({ children, kildedata }: any) => { + const PrettyCode = lazy(() => import('@/components/codeView/PrettyCode')) + if (!kildedata) { return
{children}
} @@ -60,9 +56,7 @@ export const TabsVisning = ({ children, kildedata }: any) => { marginBottom: '15px', }} > - - {kildedataPretty} - + diff --git a/apps/dolly-frontend/src/main/js/src/pages/testnorgePage/TestnorgePage.tsx b/apps/dolly-frontend/src/main/js/src/pages/testnorgePage/TestnorgePage.tsx index 4d8773b5b4e..d1a5fb95f30 100644 --- a/apps/dolly-frontend/src/main/js/src/pages/testnorgePage/TestnorgePage.tsx +++ b/apps/dolly-frontend/src/main/js/src/pages/testnorgePage/TestnorgePage.tsx @@ -1,4 +1,4 @@ -import React, { Fragment, useState } from 'react' +import React, { Fragment, lazy, Suspense, useState } from 'react' import Title from '@/components/Title' import SearchContainer from './search/searchContainer/SearchContainer' import { SearchOptions } from './search/SearchOptions' @@ -9,21 +9,23 @@ import '@/pages/gruppe/PersonVisning/PersonVisning.less' import { PdlData } from '@/pages/gruppe/PersonVisning/PersonMiljoeinfo/PdlDataTyper' import './TestnorgePage.less' import * as Yup from 'yup' -import DisplayFormState from '@/utils/DisplayFormState' import { Gruppe } from '@/utils/hooks/useGruppe' import { Hjelpetekst } from '@/components/hjelpetekst/Hjelpetekst' import { bottom } from '@popperjs/core' import { TestComponentSelectors } from '#/mocks/Selectors' import { Form, FormProvider, useForm } from 'react-hook-form' import { yupResolver } from '@hookform/resolvers/yup' -import DisplayFormErrors from '@/utils/DisplayFormErrors' import PersonSearch from '@/service/services/personsearch/PersonSearch' +import Loading from '@/components/ui/loading/Loading' type TestnorgePageProps = { gruppe?: Gruppe } export default ({ gruppe }: TestnorgePageProps) => { + const DisplayFormState = lazy(() => import('@/utils/DisplayFormState')) + const DisplayFormErrors = lazy(() => import('@/utils/DisplayFormErrors')) + const [items, setItems] = useState([]) const [loading, setLoading] = useState(false) const [valgtePersoner, setValgtePersoner] = useState([]) @@ -96,9 +98,11 @@ export default ({ gruppe }: TestnorgePageProps) => {
- {devEnabled && } {devEnabled && ( - + }> + + + )} { diff --git a/apps/dolly-frontend/src/main/js/src/styles/main.less b/apps/dolly-frontend/src/main/js/src/styles/main.less index cde2341ce66..ba33a7c4103 100644 --- a/apps/dolly-frontend/src/main/js/src/styles/main.less +++ b/apps/dolly-frontend/src/main/js/src/styles/main.less @@ -19,14 +19,6 @@ body { .dfa-blokk_content { - &&& .react-datepicker__navigation { - position: fixed; - } - - && .react-datepicker__year-wrapper { - display: flow; - } - && .navds-form-field--small .navds-date__field-button { top: 18px; right: 33px; diff --git a/apps/dolly-frontend/src/main/js/src/utils/DataFormatter.tsx b/apps/dolly-frontend/src/main/js/src/utils/DataFormatter.tsx index a7a3ef6d558..7ef37728209 100644 --- a/apps/dolly-frontend/src/main/js/src/utils/DataFormatter.tsx +++ b/apps/dolly-frontend/src/main/js/src/utils/DataFormatter.tsx @@ -1,5 +1,5 @@ import { format, isDate } from 'date-fns' -import _ from 'lodash' +import * as _ from 'lodash-es' import { SelectOptionsManager as Options } from '@/service/SelectOptions' import { useKodeverk } from '@/utils/hooks/useKodeverk' import { convertInputToDate, initDayjs } from '@/components/ui/form/DateFormatUtils' diff --git a/apps/dolly-frontend/src/main/js/src/utils/DisplayFormErrors.tsx b/apps/dolly-frontend/src/main/js/src/utils/DisplayFormErrors.tsx index b1d84e9f926..ed239f69b08 100644 --- a/apps/dolly-frontend/src/main/js/src/utils/DisplayFormErrors.tsx +++ b/apps/dolly-frontend/src/main/js/src/utils/DisplayFormErrors.tsx @@ -15,11 +15,7 @@ const replacer = (key: string, value: any) => { } else return value } -export default function DisplayFormErrors({ - visState = false, - errors = null as any, - label = 'Vis state', -}) { +const DisplayFormErrors = ({ visState = false, errors = null as any, label = 'Vis state' }) => { const [showState, toggleShowState] = useToggle(visState) return (
) } + +export default DisplayFormErrors diff --git a/apps/dolly-frontend/src/main/js/src/utils/DisplayFormState.tsx b/apps/dolly-frontend/src/main/js/src/utils/DisplayFormState.tsx index 891219a7062..96c88b2b5fd 100644 --- a/apps/dolly-frontend/src/main/js/src/utils/DisplayFormState.tsx +++ b/apps/dolly-frontend/src/main/js/src/utils/DisplayFormState.tsx @@ -14,7 +14,7 @@ const replacer = (key: string, value: any) => { } else return value } -export default function DisplayFormState({ visState = false, label = 'Vis form' }) { +export default ({ visState = false, label = 'Vis form' }) => { const { getValues } = useFormContext() const [showState, toggleShowState] = useToggle(visState) diff --git a/apps/dolly-frontend/src/main/js/src/utils/DollyErrorMessage.tsx b/apps/dolly-frontend/src/main/js/src/utils/DollyErrorMessage.tsx index 291c331d96a..bd5ee097f69 100644 --- a/apps/dolly-frontend/src/main/js/src/utils/DollyErrorMessage.tsx +++ b/apps/dolly-frontend/src/main/js/src/utils/DollyErrorMessage.tsx @@ -1,16 +1,24 @@ import * as React from 'react' +import { useContext } from 'react' import { useFormContext } from 'react-hook-form' import { ErrorMessage } from '@hookform/error-message' +import { + ShowErrorContext, + ShowErrorContextType, +} from '@/components/bestillingsveileder/ShowErrorContext' export const DollyErrorMessage = ({ name }: { name: string }) => { const { formState: { errors }, } = useFormContext() + const errorContext: ShowErrorContextType = useContext(ShowErrorContext) return ( -

{message}

} - /> + errorContext.showError && ( +

{message}

} + /> + ) ) } diff --git a/apps/dolly-frontend/src/main/js/src/utils/EgneOrganisasjoner.tsx b/apps/dolly-frontend/src/main/js/src/utils/EgneOrganisasjoner.tsx index 1ec01387def..ede3680f503 100644 --- a/apps/dolly-frontend/src/main/js/src/utils/EgneOrganisasjoner.tsx +++ b/apps/dolly-frontend/src/main/js/src/utils/EgneOrganisasjoner.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useState } from 'react' -import _ from 'lodash' +import * as _ from 'lodash-es' import { Adresse, Organisasjon } from '@/service/services/organisasjonforvalter/types' import { useCurrentBruker } from '@/utils/hooks/useBruker' import { EgneOrgSelect } from '@/components/ui/form/inputs/select/EgneOrgSelect' diff --git a/apps/dolly-frontend/src/main/js/src/utils/FileUploader/FileUploader.tsx b/apps/dolly-frontend/src/main/js/src/utils/FileUploader/FileUploader.tsx index 877f9e4cd4e..1de42407ae7 100644 --- a/apps/dolly-frontend/src/main/js/src/utils/FileUploader/FileUploader.tsx +++ b/apps/dolly-frontend/src/main/js/src/utils/FileUploader/FileUploader.tsx @@ -1,7 +1,7 @@ import React from 'react' import { useDropzone } from 'react-dropzone' import styled from 'styled-components' -import _ from 'lodash' +import * as _ from 'lodash-es' const getColor = (props: any) => { if (props.isDragAccept) { diff --git a/apps/dolly-frontend/src/main/js/src/utils/GenererGyldigNorskBankkonto.tsx b/apps/dolly-frontend/src/main/js/src/utils/GenererGyldigNorskBankkonto.tsx index c6d3eb68796..0c79dab6aa4 100644 --- a/apps/dolly-frontend/src/main/js/src/utils/GenererGyldigNorskBankkonto.tsx +++ b/apps/dolly-frontend/src/main/js/src/utils/GenererGyldigNorskBankkonto.tsx @@ -1,4 +1,4 @@ -import _ from 'lodash' +import * as _ from 'lodash-es' const CHECK_DIGIT_1 = [3, 7, 6, 1, 8, 9, 4, 5, 2] const CHECK_DIGIT_2 = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2] diff --git a/apps/dolly-frontend/src/main/js/src/utils/Merge.tsx b/apps/dolly-frontend/src/main/js/src/utils/Merge.tsx index 43012ca91c5..88c6e9c7f09 100644 --- a/apps/dolly-frontend/src/main/js/src/utils/Merge.tsx +++ b/apps/dolly-frontend/src/main/js/src/utils/Merge.tsx @@ -1,4 +1,4 @@ -import _ from 'lodash' +import * as _ from 'lodash-es' function _mergeKeepShapeArray(dest, source) { if (source.length != dest.length) { diff --git a/apps/dolly-frontend/src/main/js/src/utils/YupValidations.tsx b/apps/dolly-frontend/src/main/js/src/utils/YupValidations.tsx index e4e6c9ebcca..4851cc7f6da 100644 --- a/apps/dolly-frontend/src/main/js/src/utils/YupValidations.tsx +++ b/apps/dolly-frontend/src/main/js/src/utils/YupValidations.tsx @@ -1,5 +1,5 @@ import * as Yup from 'yup' -import _ from 'lodash' +import * as _ from 'lodash-es' import { parseDate } from '@/utils/DataFormatter' import { isDate } from 'date-fns' diff --git a/apps/dolly-frontend/src/main/js/src/utils/hooks/useKodeverk.tsx b/apps/dolly-frontend/src/main/js/src/utils/hooks/useKodeverk.tsx index f7ab4d5ac77..ae5123baa6f 100644 --- a/apps/dolly-frontend/src/main/js/src/utils/hooks/useKodeverk.tsx +++ b/apps/dolly-frontend/src/main/js/src/utils/hooks/useKodeverk.tsx @@ -1,6 +1,6 @@ import useSWR from 'swr' import { fetcher } from '@/api' -import _, { toLower } from 'lodash' +import * as _ from 'lodash-es' import { SelectOptionsFormat } from '@/service/SelectOptionsFormat' import { SortKodeverkArray } from '@/service/services/dolly/Utils' @@ -43,7 +43,11 @@ export const useKodeverk = (kodeverkNavn) => { const kodeverkSortert = SortKodeverkArray({ koder: koder, name: kodeverkNavn }) return { - kodeverk: SelectOptionsFormat.formatOptions(toLower(kodeverkNavn), kodeverkSortert, isLoading), + kodeverk: SelectOptionsFormat.formatOptions( + _.toLower(kodeverkNavn), + kodeverkSortert, + isLoading, + ), loading: isLoading, error: error, } diff --git a/apps/dolly-frontend/src/main/js/src/utils/hooks/useSykemelding.tsx b/apps/dolly-frontend/src/main/js/src/utils/hooks/useSykemelding.tsx new file mode 100644 index 00000000000..e490b3e8b06 --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/utils/hooks/useSykemelding.tsx @@ -0,0 +1,39 @@ +import { sykemeldingFetcher } from '@/api' +import { AxiosError } from 'axios' +import useSWRMutation from 'swr/mutation' + +type RuleHit = { + messageForSender: string + messageForUser: string + ruleName: string + ruleStatus: string +} + +type SykemeldingResponse = { + message?: string + status?: string + ruleHits?: RuleHit[] +} + +export const useSykemeldingValidering = (values: any) => { + const { data, error, trigger } = useSWRMutation>( + '/testnav-sykemelding-api/api/v1/sykemeldinger/validate', + (url: string) => sykemeldingFetcher(url, values), + ) + + const errorMessage = + error?.status === 400 + ? `Mangler felter: ${error.response?.data?.message + ?.split(',') + .map((field: string) => field.trim()) + .join(', ')}` + : data?.status === 'INVALID' + ? `Validering av sykemelding feilet: ${data.ruleHits?.[0]?.messageForUser}` + : '' + + return { + data: data, + mutate: trigger, + errorMessage: errorMessage, + } +} diff --git a/apps/dolly-frontend/src/main/js/src/utils/lazyWithPreload.tsx b/apps/dolly-frontend/src/main/js/src/utils/lazyWithPreload.tsx new file mode 100644 index 00000000000..6d3b6fefc28 --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/utils/lazyWithPreload.tsx @@ -0,0 +1,13 @@ +import React, { lazy, LazyExoticComponent } from 'react' + +type PreloadableComponent> = LazyExoticComponent & { + preload: () => void +} + +export function lazyWithPreload>( + factory: () => Promise<{ default: T }>, +): PreloadableComponent { + const Component = lazy(factory) as PreloadableComponent + Component.preload = factory + return Component +} diff --git a/apps/dolly-frontend/src/main/js/vite.config.js b/apps/dolly-frontend/src/main/js/vite.config.js index f69d89ac8bd..d9b061d7065 100644 --- a/apps/dolly-frontend/src/main/js/vite.config.js +++ b/apps/dolly-frontend/src/main/js/vite.config.js @@ -41,14 +41,34 @@ function __preserveRef(key, v) { } } +const createProxyConfig = (routes) => { + const target = 'http://localhost:8020' + const secure = false + return Object.fromEntries( + Object.entries(routes).map(([path, { changeOrigin }]) => [ + path, + { target, changeOrigin, secure }, + ]), + ) +} + export default defineConfig(({ mode }) => ({ base: '/', build: { outDir: 'build', - sourcemap: true, + sourcemap: false, cssCodeSplit: false, rollupOptions: { external: ['./nais.js'], + output: { + manualChunks(id) { + if (id.includes('node_modules') && !id.includes('navikt')) { + return id.toString().split('node_modules/')[1].split('/')[0].toString() + } else if (id.includes('navikt')) { + return 'navikt' + } + }, + }, }, }, css: { @@ -66,7 +86,7 @@ export default defineConfig(({ mode }) => ({ }, }, server: mode === 'local-dev' && { - proxy: proxyRoutes, + proxy: createProxyConfig(proxyRoutes), port: 3000, }, test: { diff --git a/apps/dolly-frontend/src/main/resources/application-dev.yml b/apps/dolly-frontend/src/main/resources/application-dev.yml index 175d41a8932..f29676d22e0 100644 --- a/apps/dolly-frontend/src/main/resources/application-dev.yml +++ b/apps/dolly-frontend/src/main/resources/application-dev.yml @@ -22,4 +22,7 @@ consumers: url: http://testnav-bruker-service-dev.dolly.svc.cluster.local testnav-pdl-forvalter: name: testnav-pdl-forvalter-dev - url: http://testnav-pdl-forvalter-dev.dolly.svc.cluster.local \ No newline at end of file + url: http://testnav-pdl-forvalter-dev.dolly.svc.cluster.local + testnav-sykemelding-api: + name: testnav-sykemelding-api-dev + url: http://testnav-sykemelding-api-dev.dolly.svc.cluster.local \ No newline at end of file diff --git a/apps/dolly-frontend/src/main/resources/application-local.yml b/apps/dolly-frontend/src/main/resources/application-local.yml index 8cb8c235ba2..be0739b2cf1 100644 --- a/apps/dolly-frontend/src/main/resources/application-local.yml +++ b/apps/dolly-frontend/src/main/resources/application-local.yml @@ -87,4 +87,7 @@ consumers: testnav-levende-arbeidsforhold-scheduler: url: https://testnav-levende-arbeidsforhold-scheduler.intern.dev.nav.no testnav-yrkesskade-proxy: - url: https://testnav-yrkesskade-proxy.intern.dev.nav.no \ No newline at end of file + url: https://testnav-yrkesskade-proxy.intern.dev.nav.no + testnav-sykemelding-api: + name: testnav-sykemelding-api-dev + url: https://testnav-sykemelding-api-dev.intern.dev.nav.no diff --git a/apps/dolly-frontend/src/main/resources/application.yml b/apps/dolly-frontend/src/main/resources/application.yml index 69f5d0d1672..9653c61db58 100644 --- a/apps/dolly-frontend/src/main/resources/application.yml +++ b/apps/dolly-frontend/src/main/resources/application.yml @@ -240,6 +240,11 @@ consumers: namespace: dolly name: testnav-yrkesskade-proxy url: http://testnav-yrkesskade-proxy.dolly.svc.cluster.local + testnav-sykemelding-api: + cluster: dev-gcp + namespace: dolly + name: testnav-sykemelding-api + url: http://testnav-sykemelding-api.dolly.svc.cluster.local management: endpoints: diff --git a/apps/sykemelding-api/src/main/resources/application-dev.yml b/apps/sykemelding-api/src/main/resources/application-dev.yml deleted file mode 100644 index e69de29bb2d..00000000000 From 7f51565337a449bed28cddfdf9e189d0cfc3e0ff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Dec 2024 13:40:27 +0100 Subject: [PATCH 50/59] Bump nanoid in /apps/endringsmelding-frontend/src/main/js (#3704) Bumps [nanoid](https://github.com/ai/nanoid) from 3.3.7 to 3.3.8. - [Release notes](https://github.com/ai/nanoid/releases) - [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md) - [Commits](https://github.com/ai/nanoid/compare/3.3.7...3.3.8) --- updated-dependencies: - dependency-name: nanoid dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../endringsmelding-frontend/src/main/js/package-lock.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/endringsmelding-frontend/src/main/js/package-lock.json b/apps/endringsmelding-frontend/src/main/js/package-lock.json index 4f842cb844c..b15f54fc4f4 100644 --- a/apps/endringsmelding-frontend/src/main/js/package-lock.json +++ b/apps/endringsmelding-frontend/src/main/js/package-lock.json @@ -3274,16 +3274,15 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, From 1ea2342517e8d663f29f804cfac36d5a51b00b56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristen=20H=C3=A6rum?= Date: Thu, 19 Dec 2024 13:45:46 +0100 Subject: [PATCH 51/59] Bugfix/altinn3 tilgang (#3700) Lagt til proxy for altinn3-tilgang-service i prod, oppdatert endepunkter for Altinn3-tilgang-service, oppdatert dolly-idporten frontend --------- Co-authored-by: stigus Co-authored-by: Cato Olsen --- .github/workflows/integration-tests.yml | 10 +- apps/altinn3-tilgang-service/README.md | 1 + apps/altinn3-tilgang-service/build.gradle | 1 + apps/altinn3-tilgang-service/config.dev.yml | 1 + apps/altinn3-tilgang-service/config.prod.yml | 1 + .../docker-compose.yml | 18 +++ apps/altinn3-tilgang-service/settings.gradle | 2 +- .../consumer/altinn/AltinnConsumer.java | 45 ++++--- .../CreateAccessListeMemberCommand.java | 10 +- .../DeleteAccessListMemberCommand.java | 8 +- .../command/GetAccessListMembersCommand.java | 8 +- .../command/GetAuthorizedPartiesCommand.java | 40 +++++++ .../consumer/altinn/dto/AccessToken.java | 0 ....java => AltinnAccessListResponseDTO.java} | 2 +- .../AltinnAuthorizedPartiesRequestDTO.java | 18 +++ .../altinn/dto/AuthorizedPartyDTO.java | 42 +++++++ .../domain/PersonRequest.java | 13 ++ .../AltinnBrukerTilgangController.java | 33 ++++++ ... AltinnOrganisasjonTilgangController.java} | 6 +- .../service/AltinnBrukerTilgangService.java | 112 ++++++++++++++++++ ... => AltinnOrganisasjonTilgangService.java} | 2 +- .../service/MiljoerOversiktService.java | 14 +-- .../src/main/resources/application-local.yml | 6 +- .../src/main/resources/application.yml | 3 +- apps/dolly-frontend/config.idporten.yml | 5 +- apps/dolly-frontend/config.test.yml | 2 - apps/dolly-frontend/config.unstable.yml | 2 - apps/dolly-frontend/config.yml | 2 - .../web/DollyFrontendApplicationStarter.java | 2 - .../no/nav/dolly/web/config/Consumers.java | 1 - ...inn3PersonOrganisasjonTilgangConsumer.java | 66 +++++++++++ .../PersonOrganisasjonTilgangConsumer.java | 62 ---------- ...PostPersonOrganisasjonTilgangCommand.java} | 24 ++-- .../consumers/dto/AltinnBrukerRequest.java | 11 ++ .../web/consumers/dto/OrganisasjonDTO.java | 12 -- .../provider/web/BrukerTilgangController.java | 29 +++++ .../web/provider/web/SessionController.java | 7 +- .../main/js/playwright/mocks/BasicMocks.tsx | 3 +- .../main/js/playwright/tests/Bankid.spec.ts | 2 +- .../src/main/js/proxy-routes.json | 7 +- .../PersonOrganisasjonTilgangService.tsx | 5 +- .../utils/hooks/useOrganisasjonTilgang.tsx | 2 +- .../src/main/resources/application-local.yml | 3 - .../src/main/resources/application.yml | 5 - .../src/main/resources/logback-spring.xml | 14 +-- .../libs/dto/altinn3/v1/OrganisasjonDTO.java | 17 +++ .../libs/dto/altinn3/v1/PersonDTO.java | 32 +++++ .../GetAuthenticatedResourceServerType.java | 16 ++- .../action/GetAuthenticatedToken.java | 27 ++++- .../action/GetAuthenticatedUserId.java | 20 +++- .../reactivesecurity/action/JwtResolver.java | 23 +--- .../action/Oauth2Resolver.java | 35 ++++++ 52 files changed, 618 insertions(+), 214 deletions(-) create mode 100644 apps/altinn3-tilgang-service/docker-compose.yml create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAuthorizedPartiesCommand.java delete mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AccessToken.java rename apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/{AltinnResponseDTO.java => AltinnAccessListResponseDTO.java} (95%) create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnAuthorizedPartiesRequestDTO.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AuthorizedPartyDTO.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/domain/PersonRequest.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnBrukerTilgangController.java rename apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/{AltinnTilgangController.java => AltinnOrganisasjonTilgangController.java} (89%) create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnBrukerTilgangService.java rename apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/{AltinnTilgangService.java => AltinnOrganisasjonTilgangService.java} (98%) create mode 100644 apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/Altinn3PersonOrganisasjonTilgangConsumer.java delete mode 100644 apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/PersonOrganisasjonTilgangConsumer.java rename apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/command/{GetPersonOrganisasjonTilgangCommand.java => PostPersonOrganisasjonTilgangCommand.java} (59%) create mode 100644 apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/dto/AltinnBrukerRequest.java delete mode 100644 apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/dto/OrganisasjonDTO.java create mode 100644 apps/dolly-frontend/src/main/java/no/nav/dolly/web/provider/web/BrukerTilgangController.java create mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/altinn3/v1/OrganisasjonDTO.java create mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/altinn3/v1/PersonDTO.java create mode 100644 libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/Oauth2Resolver.java diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index 16c25d9ff37..9351999c60b 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -3,7 +3,6 @@ on: push: paths: - 'apps/bruker-service/**' - - 'apps/person-organisasjon-tilgang-service/**' workflow_dispatch: jobs: @@ -14,11 +13,4 @@ jobs: working-directory: 'apps/bruker-service/' healthcheck: 'http://localhost:8002/internal/isAlive' secrets: - NAV_TOKEN: ${{ secrets.NAV_TOKEN }} - person-organisasjon-tilgang-service: - if: github.event.pull_request.draft == false - uses: ./.github/workflows/common.integration-test.yml - with: - working-directory: 'apps/person-organisasjon-tilgang-service/' - healthcheck: 'http://localhost:8001/internal/isAlive' - secrets: inherit \ No newline at end of file + NAV_TOKEN: ${{ secrets.NAV_TOKEN }} \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/README.md b/apps/altinn3-tilgang-service/README.md index ad8b6f4dd72..baad90dca7e 100644 --- a/apps/altinn3-tilgang-service/README.md +++ b/apps/altinn3-tilgang-service/README.md @@ -10,3 +10,4 @@ Swagger finnes under [/swagger-ui.html](https://testnav-altinn3-tilgang-service. ## Lokal kjøring * [Generelt.](../../docs/local_general.md) * [Secret Manager.](../../docs/local_secretmanager.md) +* [Database i GCP.](../../docs/gcp_db.md) diff --git a/apps/altinn3-tilgang-service/build.gradle b/apps/altinn3-tilgang-service/build.gradle index 1ea7ae40843..cf1162f4ca0 100644 --- a/apps/altinn3-tilgang-service/build.gradle +++ b/apps/altinn3-tilgang-service/build.gradle @@ -10,6 +10,7 @@ sonarqube { } dependencies { + implementation "no.nav.testnav.libs:data-transfer-objects" implementation "no.nav.testnav.libs:reactive-core" implementation "no.nav.testnav.libs:reactive-security" diff --git a/apps/altinn3-tilgang-service/config.dev.yml b/apps/altinn3-tilgang-service/config.dev.yml index b9d45fba561..16511daa0a1 100644 --- a/apps/altinn3-tilgang-service/config.dev.yml +++ b/apps/altinn3-tilgang-service/config.dev.yml @@ -23,6 +23,7 @@ spec: consumes: - name: altinn:resourceregistry/accesslist.read - name: altinn:resourceregistry/accesslist.write + - name: altinn:accessmanagement/authorizedparties.resourceowner accessPolicy: inbound: rules: diff --git a/apps/altinn3-tilgang-service/config.prod.yml b/apps/altinn3-tilgang-service/config.prod.yml index f24efb9735e..2ea338b1fb7 100644 --- a/apps/altinn3-tilgang-service/config.prod.yml +++ b/apps/altinn3-tilgang-service/config.prod.yml @@ -23,6 +23,7 @@ spec: consumes: - name: altinn:resourceregistry/accesslist.read - name: altinn:resourceregistry/accesslist.write + - name: altinn:accessmanagement/authorizedparties.resourceowner accessPolicy: inbound: rules: diff --git a/apps/altinn3-tilgang-service/docker-compose.yml b/apps/altinn3-tilgang-service/docker-compose.yml new file mode 100644 index 00000000000..b0eb57bd211 --- /dev/null +++ b/apps/altinn3-tilgang-service/docker-compose.yml @@ -0,0 +1,18 @@ +services: + + cloud_sql_proxy: + image: gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.14.2 + network_mode: host + command: + - "dolly-dev-ff83:europe-north1:testnav-altinn3-tilgang-local" + - "--credentials-file=/application_default_credentials.json" + - "--run-connection-test" + volumes: + - type: bind + # Set a variable $DOLLY_APPLICATION_CREDENTIALS. We don't use + # GOOGLE_APPLICATION_CREDENTIALS, as this causes an extra step during login. + # + # - $HOME/.config/gcloud/application_default_credentials.json for Linux/macOS. + # - $APPDATA/gcloud/application_default_credentials.json for Windows. + source: $DOLLY_APPLICATION_CREDENTIALS + target: /application_default_credentials.json \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/settings.gradle b/apps/altinn3-tilgang-service/settings.gradle index e7a413ca6d0..d7e1b8e69d7 100644 --- a/apps/altinn3-tilgang-service/settings.gradle +++ b/apps/altinn3-tilgang-service/settings.gradle @@ -6,9 +6,9 @@ rootProject.name = 'altinn3-tilgang-service' includeBuild "../../plugins/java" +includeBuild '../../libs/data-transfer-objects' includeBuild '../../libs/reactive-core' includeBuild '../../libs/reactive-security' -includeBuild '../../libs/vault' develocity { buildScan { diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/AltinnConsumer.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/AltinnConsumer.java index ae8f52b3b39..cf62199a355 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/AltinnConsumer.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/AltinnConsumer.java @@ -10,8 +10,11 @@ import no.nav.testnav.altinn3tilgangservice.consumer.altinn.command.CreateAccessListeMemberCommand; import no.nav.testnav.altinn3tilgangservice.consumer.altinn.command.DeleteAccessListMemberCommand; import no.nav.testnav.altinn3tilgangservice.consumer.altinn.command.GetAccessListMembersCommand; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.command.GetAuthorizedPartiesCommand; import no.nav.testnav.altinn3tilgangservice.consumer.altinn.command.GetExchangeTokenCommand; -import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnResponseDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnAccessListResponseDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnAuthorizedPartiesRequestDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AuthorizedPartyDTO; import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.BrregResponseDTO; import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.OrganisasjonCreateDTO; import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.OrganisasjonDeleteDTO; @@ -25,6 +28,7 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -76,7 +80,7 @@ public Flux delete(String organisasjonsnummer) { return Flux.from(getAccessListMembers() .flatMapMany(value -> Flux.fromIterable(value.getData())) - .map(AltinnResponseDTO.AccessListMembershipDTO::getIdentifiers) + .map(AltinnAccessListResponseDTO.AccessListMembershipDTO::getIdentifiers) .collectList() .map(data -> getIdentifier(data, organisasjonsnummer)) .map(identifier -> @@ -106,16 +110,16 @@ public Flux create(String organisasjonsnummer) { new OrganisasjonCreateDTO(organisasjonsnummer), altinnConfig).call()) .flatMapMany(response -> - isBlank(response.getFeilmelding()) ? - Flux.fromIterable(response.getData()) - .map(this::getOrgnummer) - .filter(organisasjonsnummer::equals) - .flatMap(brregConsumer::getEnheter) : - Mono.just(BrregResponseDTO.builder() - .organisasjonsnummer(organisasjonsnummer) - .feilmelding(response.getFeilmelding()) - .status(response.getStatus()) - .build())) + isBlank(response.getFeilmelding()) ? + Flux.fromIterable(response.getData()) + .map(this::getOrgnummer) + .filter(organisasjonsnummer::equals) + .flatMap(brregConsumer::getEnheter) : + Mono.just(BrregResponseDTO.builder() + .organisasjonsnummer(organisasjonsnummer) + .feilmelding(response.getFeilmelding()) + .status(response.getStatus()) + .build())) .map(response -> mapperFacade.map(response, Organisasjon.class)); } @@ -125,7 +129,18 @@ public Flux getOrganisasjoner() { .flatMapMany(this::convertToOrganisasjon); } - private Mono getAccessListMembers() { + public Flux getAuthorizedParties(String ident) { + + return maskinportenConsumer.getAccessToken() + .flatMap(this::exchangeToken) + .flatMap(exchangeToken -> new GetAuthorizedPartiesCommand(webClient, + new AltinnAuthorizedPartiesRequestDTO(ident), + exchangeToken).call()) + .map(Arrays::asList) + .flatMapIterable(list -> list); + } + + private Mono getAccessListMembers() { return maskinportenConsumer.getAccessToken() .flatMap(this::exchangeToken) @@ -135,7 +150,7 @@ private Mono getAccessListMembers() { altinnConfig).call()); } - private Flux convertToOrganisasjon(AltinnResponseDTO altInnResponse) { + private Flux convertToOrganisasjon(AltinnAccessListResponseDTO altInnResponse) { return Flux.fromIterable(altInnResponse.getData()) .map(this::getOrgnummer) @@ -155,7 +170,7 @@ private OrganisasjonDeleteDTO getIdentifier(List data, String organisa } @SneakyThrows - private String getOrgnummer(AltinnResponseDTO.AccessListMembershipDTO data) { + private String getOrgnummer(AltinnAccessListResponseDTO.AccessListMembershipDTO data) { return data.getIdentifiers() .get(ORGANISASJON_ID) diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/CreateAccessListeMemberCommand.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/CreateAccessListeMemberCommand.java index 997a7b65a70..d665fd9723d 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/CreateAccessListeMemberCommand.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/CreateAccessListeMemberCommand.java @@ -3,7 +3,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.testnav.altinn3tilgangservice.config.AltinnConfig; -import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnResponseDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnAccessListResponseDTO; import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.OrganisasjonCreateDTO; import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; @@ -16,7 +16,7 @@ @Slf4j @RequiredArgsConstructor -public class CreateAccessListeMemberCommand implements Callable> { +public class CreateAccessListeMemberCommand implements Callable> { private static final String ALTINN_URL = "/resourceregistry/api/v1/access-lists/{owner}/{identifier}/members"; @@ -27,7 +27,7 @@ public class CreateAccessListeMemberCommand implements Callable call() { + public Mono call() { return webClient .post() @@ -37,14 +37,14 @@ public Mono call() { .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .retrieve() - .bodyToMono(AltinnResponseDTO.class) + .bodyToMono(AltinnAccessListResponseDTO.class) .doOnError(WebClientFilter::logErrorMessage) .doOnSuccess(value -> log.info("Altinn organisasjontilgang opprettet for {}", organisasjon.getData().stream() .map(data -> data.split(":")) .map(data -> data[data.length-1]) .collect(Collectors.joining()))) - .onErrorResume(throwable -> Mono.just(AltinnResponseDTO.builder() + .onErrorResume(throwable -> Mono.just(AltinnAccessListResponseDTO.builder() .status(WebClientFilter.getStatus(throwable)) .feilmelding(WebClientFilter.getMessage(throwable)) .build())); diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/DeleteAccessListMemberCommand.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/DeleteAccessListMemberCommand.java index ddaac4a82da..e685b681507 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/DeleteAccessListMemberCommand.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/DeleteAccessListMemberCommand.java @@ -3,7 +3,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.testnav.altinn3tilgangservice.config.AltinnConfig; -import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnResponseDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnAccessListResponseDTO; import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.OrganisasjonDeleteDTO; import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; @@ -19,7 +19,7 @@ @Slf4j @RequiredArgsConstructor -public class DeleteAccessListMemberCommand implements Callable> { +public class DeleteAccessListMemberCommand implements Callable> { private static final String ALTINN_URL = "/resourceregistry/api/v1/access-lists/{owner}/{identifier}/members"; @@ -30,7 +30,7 @@ public class DeleteAccessListMemberCommand implements Callable call() { + public Mono call() { return webClient .method(HttpMethod.DELETE) @@ -41,7 +41,7 @@ public Mono call() { .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .bodyValue(identifiers) .retrieve() - .bodyToMono(AltinnResponseDTO.class) + .bodyToMono(AltinnAccessListResponseDTO.class) .doOnSuccess(value -> log.info("Altinn organisasjontilgang slettet for {}", identifiers.getData().stream() .filter(data -> data.contains(ORGANISASJON_ID)) diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAccessListMembersCommand.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAccessListMembersCommand.java index 1c615118bf7..19f63d2f8db 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAccessListMembersCommand.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAccessListMembersCommand.java @@ -3,7 +3,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.testnav.altinn3tilgangservice.config.AltinnConfig; -import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnResponseDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnAccessListResponseDTO; import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; @@ -14,7 +14,7 @@ @Slf4j @RequiredArgsConstructor -public class GetAccessListMembersCommand implements Callable> { +public class GetAccessListMembersCommand implements Callable> { private static final String ALTINN_URL = "/resourceregistry/api/v1/access-lists/{owner}/{identifier}/members"; @@ -23,7 +23,7 @@ public class GetAccessListMembersCommand implements Callable call() { + public Mono call() { return webClient .get() @@ -32,7 +32,7 @@ public Mono call() { .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .retrieve() - .bodyToMono(AltinnResponseDTO.class) + .bodyToMono(AltinnAccessListResponseDTO.class) .doOnError(WebClientFilter::logErrorMessage) .doOnSuccess(value -> log.info("Altinn-tilgang hentet")); } diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAuthorizedPartiesCommand.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAuthorizedPartiesCommand.java new file mode 100644 index 00000000000..d58693bacb2 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAuthorizedPartiesCommand.java @@ -0,0 +1,40 @@ +package no.nav.testnav.altinn3tilgangservice.consumer.altinn.command; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnAuthorizedPartiesRequestDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AuthorizedPartyDTO; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.util.concurrent.Callable; + +@Slf4j +@RequiredArgsConstructor +public class GetAuthorizedPartiesCommand implements Callable> { + + private static final String ALTINN_URL = "/accessmanagement/api/v1/resourceowner/authorizedparties"; + + private final WebClient webClient; + private final AltinnAuthorizedPartiesRequestDTO request; + private final String token; + + @Override + public Mono call() { + + log.info("Spørring på bruker {}", request); + return webClient + .post() + .uri(builder -> builder.path(ALTINN_URL) + .build()) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .bodyValue(request) + .retrieve() + .bodyToMono(AuthorizedPartyDTO[].class) + .doOnError(WebClientFilter::logErrorMessage); + } +} \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AccessToken.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AccessToken.java deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnResponseDTO.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnAccessListResponseDTO.java similarity index 95% rename from apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnResponseDTO.java rename to apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnAccessListResponseDTO.java index 720fec9136f..6521fa55049 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnResponseDTO.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnAccessListResponseDTO.java @@ -17,7 +17,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class AltinnResponseDTO { +public class AltinnAccessListResponseDTO { private List data; private String feilmelding; diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnAuthorizedPartiesRequestDTO.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnAuthorizedPartiesRequestDTO.java new file mode 100644 index 00000000000..7e2eecded37 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnAuthorizedPartiesRequestDTO.java @@ -0,0 +1,18 @@ +package no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto; + +import lombok.Data; + +@Data +public class AltinnAuthorizedPartiesRequestDTO { + + private static final String IDENT_IDENTIFIKATOR = "urn:altinn:person:identifier-no"; + + private String type; + private String value; + + public AltinnAuthorizedPartiesRequestDTO(String ident) { + + this.type = IDENT_IDENTIFIKATOR; + this.value = ident; + } +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AuthorizedPartyDTO.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AuthorizedPartyDTO.java new file mode 100644 index 00000000000..0fe03486d57 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AuthorizedPartyDTO.java @@ -0,0 +1,42 @@ +package no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.List; + +import static java.util.Objects.isNull; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AuthorizedPartyDTO { + + private String name; + private String organizationNumber; + private String unitType; + private Boolean isDeleted; + private List authorizedResources; + private List subunits; + + public List getAuthorizedResources() { + + if (isNull(authorizedResources)) { + authorizedResources = new ArrayList<>(); + } + return authorizedResources; + } + + public List getSubunits() { + + if (isNull(subunits)) { + subunits = new ArrayList<>(); + } + return subunits; + } +} + diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/domain/PersonRequest.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/domain/PersonRequest.java new file mode 100644 index 00000000000..40f9ef759f0 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/domain/PersonRequest.java @@ -0,0 +1,13 @@ +package no.nav.testnav.altinn3tilgangservice.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class PersonRequest { + + private String ident; +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnBrukerTilgangController.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnBrukerTilgangController.java new file mode 100644 index 00000000000..55893774beb --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnBrukerTilgangController.java @@ -0,0 +1,33 @@ +package no.nav.testnav.altinn3tilgangservice.provider; + +import lombok.RequiredArgsConstructor; +import no.nav.testnav.altinn3tilgangservice.domain.PersonRequest; +import no.nav.testnav.altinn3tilgangservice.service.AltinnBrukerTilgangService; +import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO; +import no.nav.testnav.libs.dto.altinn3.v1.PersonDTO; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@RestController +@RequestMapping("/api/v1/brukertilgang") +@RequiredArgsConstructor +public class AltinnBrukerTilgangController { + + private final AltinnBrukerTilgangService brukerTilgangService; + + @PostMapping + public Flux getPersonOrganisasjonTilgang(@RequestBody PersonRequest request) { + + return brukerTilgangService.getPersonOrganisasjonTilgang(request.getIdent()); + } + + @PostMapping("/detaljert") + public Mono getPersonOrganisasjonDetaljertTilgang(@RequestBody PersonRequest request) { + + return brukerTilgangService.getPersonOrganisasjonDetaljertTilgang(request.getIdent()); + } +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnTilgangController.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnOrganisasjonTilgangController.java similarity index 89% rename from apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnTilgangController.java rename to apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnOrganisasjonTilgangController.java index 140f414c701..484700ce2d9 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnTilgangController.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnOrganisasjonTilgangController.java @@ -4,7 +4,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.testnav.altinn3tilgangservice.domain.OrganisasjonResponse; -import no.nav.testnav.altinn3tilgangservice.service.AltinnTilgangService; +import no.nav.testnav.altinn3tilgangservice.service.AltinnOrganisasjonTilgangService; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -20,9 +20,9 @@ @RestController @RequestMapping("/api/v1/organisasjoner") @RequiredArgsConstructor -public class AltinnTilgangController { +public class AltinnOrganisasjonTilgangController { - private final AltinnTilgangService altinnTilgangService; + private final AltinnOrganisasjonTilgangService altinnTilgangService; @GetMapping @Operation(description = "Henter alle organisasjoner med Altinn-tilgang") diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnBrukerTilgangService.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnBrukerTilgangService.java new file mode 100644 index 00000000000..581ba8f8ff5 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnBrukerTilgangService.java @@ -0,0 +1,112 @@ +package no.nav.testnav.altinn3tilgangservice.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.AltinnConsumer; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AuthorizedPartyDTO; +import no.nav.testnav.altinn3tilgangservice.domain.Organisasjon; +import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO; +import no.nav.testnav.libs.dto.altinn3.v1.PersonDTO; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.util.function.Tuple2; + +import java.util.List; + +import static org.apache.commons.lang3.BooleanUtils.isFalse; +import static org.apache.commons.lang3.StringUtils.isNotBlank; + +@Slf4j +@Service +@RequiredArgsConstructor +public class AltinnBrukerTilgangService { + + private static final String DOLLY_RESOURCE = "nav_dolly_tilgang-samarbeidspartnere"; + private final AltinnConsumer altinnConsumer; + + public Flux getPersonOrganisasjonTilgang(String ident) { + + return Flux.zip( + altinnConsumer.getAuthorizedParties(ident), + altinnConsumer.getOrganisasjoner().collectList()) + .flatMap(this::getOrganisasjon); + } + + private Mono getOrganisasjon(Tuple2> organisasjoner) { + + return Mono.just(organisasjoner.getT1()) + .filter(party -> party.getAuthorizedResources().contains(DOLLY_RESOURCE)) + .filter(party -> organisasjoner.getT2().stream() + .anyMatch(organisasjon -> organisasjon.getOrganisasjonsnummer().equals(party.getOrganizationNumber()))) + .map(part -> OrganisasjonDTO.builder() + .navn(part.getName()) + .organisasjonsnummer(part.getOrganizationNumber()) + .organisasjonsform(part.getUnitType()) + .build()); + } + + public Mono getPersonOrganisasjonDetaljertTilgang(String ident) { + + return Mono.zip( + altinnConsumer.getAuthorizedParties(ident).collectList(), + altinnConsumer.getOrganisasjoner().collectList()) + .flatMapMany(this::getTilpassetOrganisasjon) + .collectList() + .map(organisasjoner -> PersonDTO.builder() + .ident(ident) + .organisasjoner(organisasjoner) + .build()); + } + + private Flux getTilpassetOrganisasjon(Tuple2, List> organisasjoner) { + + return Flux.fromIterable(organisasjoner.getT1()) + .filter(party -> isNotBlank(party.getOrganizationNumber()) && isNotBlank(party.getName())) + .filter(party -> isFalse(party.getIsDeleted())) + .map(party -> PersonDTO.OrganisasjonDTO.builder() + .navn(party.getName()) + .organisasjonsnummer(party.getOrganizationNumber()) + .organisasjonsform(party.getUnitType()) + .hasAltinnDollyTilgang(hasAltinnDollyTilgang(party)) + .hasDollyOrganisasjonTilgang(hasDollyOrganisasjonTilgang(organisasjoner.getT2(), party)) + .melding(getMelding(party.getName(), party.getOrganizationNumber(), + hasAltinnDollyTilgang(party), hasDollyOrganisasjonTilgang(organisasjoner.getT2(), party))) + .build()); + } + + private static boolean hasAltinnDollyTilgang(AuthorizedPartyDTO authorizedParty) { + + return authorizedParty.getAuthorizedResources().contains(DOLLY_RESOURCE); + } + + private static boolean hasDollyOrganisasjonTilgang(List organisasjoner, AuthorizedPartyDTO party) { + + return organisasjoner.stream() + .anyMatch(organisasjon -> organisasjon.getOrganisasjonsnummer().equals(party.getOrganizationNumber())); + } + + private static String getMelding(String orgnavn, String orgnummer, boolean hasAltinnDollyTilgang, boolean hasDollyOrganisasjonTilgang) { + + return new StringBuilder() + .append(!hasAltinnDollyTilgang ? + "Du mangler tilgang i Altinn på følgende tjenste: " + + "\"Tilgang til NAVs Dolly for samarbeidspartnere\" " + + "for organisasjon %s (med orgnummer %s)%n".formatted(orgnavn, orgnummer) : "") + .append(!hasAltinnDollyTilgang && !hasDollyOrganisasjonTilgang ? + " og %n" : "") + .append(!hasDollyOrganisasjonTilgang ? + "Organisasjon %s (med orgnummer %s) " .formatted(orgnavn, orgnummer) + + "mangler tilgang på Dolly syntetiske testdata selvbetjening%n" : "") + .append(!hasAltinnDollyTilgang || !hasDollyOrganisasjonTilgang ? + "Hvis du har til hensikt å bruke Dolly til å generere testdata, gjør følgende:%n" : "") + .append(!hasAltinnDollyTilgang ? + "- Ta kontakt med Altinn-ansvarlig i %s (med orgnummer %s) ".formatted(orgnavn, orgnummer) + + "og spør om vedkommene kan gi deg tilgang til tjenesten: " + + "\"Tilgang til NAVs Dolly for samarbeidspartnere\"%n" : "") + .append(!hasDollyOrganisasjonTilgang ? + "- Ta kontakt med NAV ved Anders Marstrander epost: anders.marstrander@nav.no, og spør om " + + "organisasjon med orgnr %s kan gis tilgang til Dolly syntetiske testdata selvbetjening%n".formatted(orgnummer) : "") + .toString(); + } +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnTilgangService.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnOrganisasjonTilgangService.java similarity index 98% rename from apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnTilgangService.java rename to apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnOrganisasjonTilgangService.java index d4151a28ecf..6dc40eb83fd 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnTilgangService.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnOrganisasjonTilgangService.java @@ -17,7 +17,7 @@ @Service @RequiredArgsConstructor -public class AltinnTilgangService { +public class AltinnOrganisasjonTilgangService { private static final String ORGANISASJON_TILGANG = "tilgang"; private final AltinnConsumer altinnConsumer; diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/MiljoerOversiktService.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/MiljoerOversiktService.java index 81202173881..3774737e83f 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/MiljoerOversiktService.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/MiljoerOversiktService.java @@ -4,7 +4,9 @@ import no.nav.testnav.altinn3tilgangservice.consumer.altinn.AltinnConsumer; import no.nav.testnav.altinn3tilgangservice.database.entity.OrganisasjonTilgang; import no.nav.testnav.altinn3tilgangservice.database.repository.OrganisasjonTilgangRepository; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; +import org.springframework.web.server.ResponseStatusException; import reactor.core.publisher.Mono; import static org.apache.commons.lang3.BooleanUtils.isTrue; @@ -47,17 +49,13 @@ public Mono updateMiljoe(String orgnummer, String miljoe) { organisasjon.setMiljoe(miljoe); return organisasjonTilgangRepository.save(organisasjon); }) : - organisasjonTilgangRepository.save(OrganisasjonTilgang.builder() - .organisasjonNummer(orgnummer) - .miljoe(miljoe) - .build())); + + throwError(orgnummer)); } private static Mono throwError(String orgnummer) { - return Mono.just(OrganisasjonTilgang.builder() - .organisasjonNummer(orgnummer) - .feilmelding("404 Not found: Organisasjonsnummer %s ble ikke funnet".formatted(orgnummer)) - .build()); + throw new ResponseStatusException(HttpStatus.NOT_FOUND, + "Organisasjonsnummer %s ble ikke funnet".formatted(orgnummer)); } } diff --git a/apps/altinn3-tilgang-service/src/main/resources/application-local.yml b/apps/altinn3-tilgang-service/src/main/resources/application-local.yml index 7916eb7f7fa..b53b18bab13 100644 --- a/apps/altinn3-tilgang-service/src/main/resources/application-local.yml +++ b/apps/altinn3-tilgang-service/src/main/resources/application-local.yml @@ -1,9 +1,9 @@ -ALTINN_URL: https://tt02.altinn.no +ALTINN_URL: https://platform.tt02.altinn.no AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} -MASKINPORTEN_CLIENT_ID: dummy +MASKINPORTEN_CLIENT_ID: ef2960de-7fa6-4396-80a5-2eca00e4af28 MASKINPORTEN_CLIENT_JWK: dummy -MASKINPORTEN_SCOPES: dummy +MASKINPORTEN_SCOPES: altinn:resourceregistry/accesslist.read altinn:resourceregistry/accesslist.write altinn:accessmanagement/authorizedparties.resourceowner MASKINPORTEN_WELL_KNOWN_URL: https://test.maskinporten.no/.well-known/oauth-authorization-server TOKEN_X_ISSUER: dummy diff --git a/apps/altinn3-tilgang-service/src/main/resources/application.yml b/apps/altinn3-tilgang-service/src/main/resources/application.yml index 70a799743f3..16f513682d3 100644 --- a/apps/altinn3-tilgang-service/src/main/resources/application.yml +++ b/apps/altinn3-tilgang-service/src/main/resources/application.yml @@ -52,4 +52,5 @@ server: encoding: charset: UTF-8 error: - include-message: always \ No newline at end of file + include-message: always + include-stacktrace: never \ No newline at end of file diff --git a/apps/dolly-frontend/config.idporten.yml b/apps/dolly-frontend/config.idporten.yml index aed20782252..64f2ba53138 100644 --- a/apps/dolly-frontend/config.idporten.yml +++ b/apps/dolly-frontend/config.idporten.yml @@ -17,7 +17,7 @@ spec: tenant: nav.no replicas: min: 1 - max: 2 + max: 1 port: 8080 ingresses: - "https://dolly-idporten.ekstern.dev.nav.no" @@ -42,11 +42,8 @@ spec: - application: testnav-organisasjon-faste-data-service - application: testnav-organisasjon-forvalter - application: testnav-organisasjon-service - - application: testnav-organisasjon-tilgang-service - application: testnav-pdl-forvalter - application: testnav-person-faste-data-service - - application: testnav-person-organisasjon-tilgang-service - - application: testnav-person-organisasjon-tilgang-service-dev - application: testnav-person-search-service - application: testnav-person-service - application: testnav-skattekort-service diff --git a/apps/dolly-frontend/config.test.yml b/apps/dolly-frontend/config.test.yml index 260eafa9a3e..9494c59a1f0 100644 --- a/apps/dolly-frontend/config.test.yml +++ b/apps/dolly-frontend/config.test.yml @@ -46,10 +46,8 @@ spec: - application: testnav-organisasjon-faste-data-service - application: testnav-organisasjon-forvalter - application: testnav-organisasjon-service - - application: testnav-organisasjon-tilgang-service - application: testnav-pdl-forvalter-dev - application: testnav-person-faste-data-service - - application: testnav-person-organisasjon-tilgang-service-dev - application: testnav-person-search-service - application: testnav-person-service - application: testnav-sykemelding-api-dev diff --git a/apps/dolly-frontend/config.unstable.yml b/apps/dolly-frontend/config.unstable.yml index 7a6b3df1dba..19b2a8aa5cc 100644 --- a/apps/dolly-frontend/config.unstable.yml +++ b/apps/dolly-frontend/config.unstable.yml @@ -44,9 +44,7 @@ spec: - application: testnav-organisasjon-faste-data-service - application: testnav-organisasjon-forvalter - application: testnav-organisasjon-service - - application: testnav-organisasjon-tilgang-service - application: testnav-pdl-forvalter-dev - - application: testnav-person-organisasjon-tilgang-service-dev - application: testnav-person-search-service - application: testnav-person-service - application: testnav-tenor-search-service diff --git a/apps/dolly-frontend/config.yml b/apps/dolly-frontend/config.yml index f0429be6a19..2faeb17bc3a 100644 --- a/apps/dolly-frontend/config.yml +++ b/apps/dolly-frontend/config.yml @@ -51,10 +51,8 @@ spec: - application: testnav-organisasjon-faste-data-service - application: testnav-organisasjon-forvalter - application: testnav-organisasjon-service - - application: testnav-organisasjon-tilgang-service - application: testnav-pdl-forvalter - application: testnav-person-faste-data-service - - application: testnav-person-organisasjon-tilgang-service - application: testnav-person-search-service - application: testnav-person-service - application: testnav-skattekort-service diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java index 2df2a6e90d0..d6bcdebdc7b 100644 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java @@ -53,7 +53,6 @@ public class DollyFrontendApplicationStarter { @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { - return builder .routes() .route(createRoute(consumers.getTestnavKontoregisterPersonProxy())) @@ -85,7 +84,6 @@ public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { .route(createRoute(consumers.getTestnavSigrunstubProxy())) .route(createRoute(consumers.getTestnavPdlForvalter(), "testnav-pdl-forvalter")) .route(createRoute(consumers.getTestnavPersonSearchService())) - .route(createRoute(consumers.getTestnavPersonOrganisasjonTilgangService(), "testnav-person-organisasjon-tilgang-service")) .route(createRoute(consumers.getTestnavSkjermingsregisterProxy())) .route(createRoute(consumers.getTestnavDokarkivProxy())) .route(createRoute(consumers.getTestnavArbeidsplassenCVProxy())) diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java index c29e9a91726..86a118efec9 100644 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java @@ -51,7 +51,6 @@ public class Consumers { private ServerProperties testnavOrganisasjonService; private ServerProperties testnavPdlForvalter; private ServerProperties testnavPensjonTestdataFacadeProxy; - private ServerProperties testnavPersonOrganisasjonTilgangService; private ServerProperties testnavPersonSearchService; private ServerProperties testnavPersonService; private ServerProperties testnavSigrunstubProxy; diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/Altinn3PersonOrganisasjonTilgangConsumer.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/Altinn3PersonOrganisasjonTilgangConsumer.java new file mode 100644 index 00000000000..50a38ef30f7 --- /dev/null +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/Altinn3PersonOrganisasjonTilgangConsumer.java @@ -0,0 +1,66 @@ +package no.nav.dolly.web.consumers; + +import lombok.extern.slf4j.Slf4j; +import no.nav.dolly.web.config.Consumers; +import no.nav.dolly.web.consumers.command.PostPersonOrganisasjonTilgangCommand; +import no.nav.dolly.web.service.AccessService; +import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO; +import no.nav.testnav.libs.reactivesecurity.action.GetAuthenticatedUserId; +import no.nav.testnav.libs.securitycore.domain.ServerProperties; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.reactive.function.client.WebClientResponseException; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@Slf4j +@Component +public class Altinn3PersonOrganisasjonTilgangConsumer { + + private final WebClient webClient; + private final ServerProperties serverProperties; + private final AccessService accessService; + private final GetAuthenticatedUserId getAuthenticatedUserId; + + public Altinn3PersonOrganisasjonTilgangConsumer( + Consumers consumers, + AccessService accessService, + WebClient.Builder webClientBuilder, + GetAuthenticatedUserId getAuthenticatedUserId) { + + this.accessService = accessService; + serverProperties = consumers.getTestnavAltinn3TilgangService(); + + this.webClient = webClientBuilder + .baseUrl(serverProperties.getUrl()) + .build(); + this.getAuthenticatedUserId = getAuthenticatedUserId; + } + + public Mono hasAccess(String organisasjonsnummer, ServerWebExchange exchange) { + + return getAuthenticatedUserId + .call() + .flatMap(userId -> accessService.getAccessToken(serverProperties, exchange) + .flatMapMany(accessToken -> new PostPersonOrganisasjonTilgangCommand(webClient, userId, accessToken).call()) + .filter(organisasjonDTO -> organisasjonDTO.getOrganisasjonsnummer().equals(organisasjonsnummer)) + .onErrorResume( + WebClientResponseException.class::isInstance, + throwable -> { + log.warn("Person har ikke tilgang til organisasjon {}.", organisasjonsnummer); + return Mono.empty(); + }) + .reduce(Boolean.FALSE, (acc, value) -> Boolean.TRUE)); + } + + public Flux getOrganisasjoner(ServerWebExchange exchange) { + + return getAuthenticatedUserId + .call() + .flatMapMany(userId -> + accessService.getAccessToken(serverProperties, exchange) + .flatMapMany(accessToken -> new PostPersonOrganisasjonTilgangCommand(webClient, userId, accessToken).call())); + } +} + diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/PersonOrganisasjonTilgangConsumer.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/PersonOrganisasjonTilgangConsumer.java deleted file mode 100644 index cec7481322b..00000000000 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/PersonOrganisasjonTilgangConsumer.java +++ /dev/null @@ -1,62 +0,0 @@ -package no.nav.dolly.web.consumers; - -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.extern.slf4j.Slf4j; -import no.nav.dolly.web.config.Consumers; -import no.nav.dolly.web.consumers.command.GetPersonOrganisasjonTilgangCommand; -import no.nav.dolly.web.service.AccessService; -import no.nav.testnav.libs.securitycore.domain.ServerProperties; -import org.springframework.http.MediaType; -import org.springframework.http.codec.json.Jackson2JsonDecoder; -import org.springframework.http.codec.json.Jackson2JsonEncoder; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.client.ExchangeStrategies; -import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.reactive.function.client.WebClientResponseException; -import org.springframework.web.server.ServerWebExchange; -import reactor.core.publisher.Mono; - -@Slf4j -@Component -public class PersonOrganisasjonTilgangConsumer { - private final WebClient webClient; - private final ServerProperties serverProperties; - - private final AccessService accessService; - - public PersonOrganisasjonTilgangConsumer( - Consumers consumers, - AccessService accessService, - ObjectMapper objectMapper, - WebClient.Builder webClientBuilder) { - - this.accessService = accessService; - serverProperties = consumers.getTestnavPersonOrganisasjonTilgangService(); - ExchangeStrategies jacksonStrategy = ExchangeStrategies.builder() - .codecs(config -> { - config.defaultCodecs() - .jackson2JsonEncoder(new Jackson2JsonEncoder(objectMapper, MediaType.APPLICATION_JSON)); - config.defaultCodecs() - .jackson2JsonDecoder(new Jackson2JsonDecoder(objectMapper, MediaType.APPLICATION_JSON)); - }).build(); - - this.webClient = webClientBuilder - .exchangeStrategies(jacksonStrategy) - .baseUrl(serverProperties.getUrl()) - .build(); - } - - public Mono hasAccess(String organisasjonsnummer, ServerWebExchange exchange) { - return accessService.getAccessToken(serverProperties, exchange) - .flatMap(accessToken -> new GetPersonOrganisasjonTilgangCommand(webClient, accessToken, organisasjonsnummer).call()) - .onErrorResume( - WebClientResponseException.class::isInstance, - throwable -> { - log.warn("Person har ikke tilgang til organisasjon {}.", organisasjonsnummer); - return Mono.empty(); - }) - .flatMap(value -> Mono.just(true)) - .switchIfEmpty(Mono.just(false)); - } -} - diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/command/GetPersonOrganisasjonTilgangCommand.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/command/PostPersonOrganisasjonTilgangCommand.java similarity index 59% rename from apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/command/GetPersonOrganisasjonTilgangCommand.java rename to apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/command/PostPersonOrganisasjonTilgangCommand.java index 3bdfb86c837..7b7e5ece269 100644 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/command/GetPersonOrganisasjonTilgangCommand.java +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/command/PostPersonOrganisasjonTilgangCommand.java @@ -2,11 +2,12 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import no.nav.dolly.web.consumers.dto.OrganisasjonDTO; +import no.nav.dolly.web.consumers.dto.AltinnBrukerRequest; +import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO; import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; +import reactor.core.publisher.Flux; import reactor.util.retry.Retry; import java.time.Duration; @@ -14,21 +15,24 @@ @Slf4j @RequiredArgsConstructor -public class GetPersonOrganisasjonTilgangCommand implements Callable> { +public class PostPersonOrganisasjonTilgangCommand implements Callable> { + private final WebClient webClient; + private final String ident; private final String token; - private final String organisasjonsnummer; @Override - public Mono call() { + public Flux call() { + return webClient - .get() - .uri(builder -> builder.path("/api/v1/person/organisasjoner/{organisasjonsnummer}").build(organisasjonsnummer)) + .post() + .uri(builder -> builder.path("/api/v1/brukertilgang").build()) .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) + .bodyValue(new AltinnBrukerRequest(ident)) .retrieve() - .bodyToMono(OrganisasjonDTO.class) - .doOnError(error -> log.error("Feilet å hente organisasjon, status: {}, feilmelding: ", - WebClientFilter.getMessage(error), + .bodyToFlux(OrganisasjonDTO.class) + .doOnError(error -> log.error("Feilet å hente organisasjon, status: {}, feilmelding: {}", + WebClientFilter.getStatus(error), WebClientFilter.getMessage(error), error)) .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/dto/AltinnBrukerRequest.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/dto/AltinnBrukerRequest.java new file mode 100644 index 00000000000..91dbb8b2a03 --- /dev/null +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/dto/AltinnBrukerRequest.java @@ -0,0 +1,11 @@ +package no.nav.dolly.web.consumers.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class AltinnBrukerRequest { + + private String ident; +} diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/dto/OrganisasjonDTO.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/dto/OrganisasjonDTO.java deleted file mode 100644 index fdd85cd2839..00000000000 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/dto/OrganisasjonDTO.java +++ /dev/null @@ -1,12 +0,0 @@ -package no.nav.dolly.web.consumers.dto; - -import java.time.LocalDateTime; - -public record OrganisasjonDTO( - String navn, - String orgnisasjonsnummer, - String orgnisasjonsfrom, - LocalDateTime gyldigTil -) { -} - diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/provider/web/BrukerTilgangController.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/provider/web/BrukerTilgangController.java new file mode 100644 index 00000000000..829b41b4fab --- /dev/null +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/provider/web/BrukerTilgangController.java @@ -0,0 +1,29 @@ +package no.nav.dolly.web.provider.web; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.dolly.web.consumers.Altinn3PersonOrganisasjonTilgangConsumer; +import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +import java.util.List; + +@Slf4j +@RestController +@RequestMapping("/altinn") +@RequiredArgsConstructor +public class BrukerTilgangController { + + private final Altinn3PersonOrganisasjonTilgangConsumer altinn3PersonOrganisasjonTilgangConsumer; + + @GetMapping("/organisasjoner") + public Mono> getOrganisasjoner(ServerWebExchange exchange) { + + return altinn3PersonOrganisasjonTilgangConsumer.getOrganisasjoner(exchange) + .collectList(); + } +} diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/provider/web/SessionController.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/provider/web/SessionController.java index 0652790796c..f6222576b25 100644 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/provider/web/SessionController.java +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/provider/web/SessionController.java @@ -2,7 +2,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import no.nav.dolly.web.consumers.PersonOrganisasjonTilgangConsumer; +import no.nav.dolly.web.consumers.Altinn3PersonOrganisasjonTilgangConsumer; import no.nav.dolly.web.service.BrukerService; import no.nav.testnav.libs.securitycore.config.UserSessionConstant; import org.springframework.http.HttpStatus; @@ -24,7 +24,7 @@ public class SessionController { private final BrukerService brukerService; - private final PersonOrganisasjonTilgangConsumer personOrganisasjonTilgangConsumer; + private final Altinn3PersonOrganisasjonTilgangConsumer altinn3PersonOrganisasjonTilgangConsumer; /** * Ping endepunkt for aa holde sessionen aapen. @@ -44,7 +44,8 @@ public Mono> delete(ServerWebExchange exchange) { @PutMapping("/user") public Mono> addUserToSession(@RequestParam String organisasjonsnummer, ServerWebExchange exchange) { - return personOrganisasjonTilgangConsumer + + return altinn3PersonOrganisasjonTilgangConsumer .hasAccess(organisasjonsnummer, exchange) .doOnError(e -> log.error("Feil ved sjekk av tilgang til org {}", organisasjonsnummer, e)) .flatMap(hasAccess -> { diff --git a/apps/dolly-frontend/src/main/js/playwright/mocks/BasicMocks.tsx b/apps/dolly-frontend/src/main/js/playwright/mocks/BasicMocks.tsx index 7518f066e45..ce86904ffba 100644 --- a/apps/dolly-frontend/src/main/js/playwright/mocks/BasicMocks.tsx +++ b/apps/dolly-frontend/src/main/js/playwright/mocks/BasicMocks.tsx @@ -23,8 +23,7 @@ export const personOrgTilgangMock = [ { navn: 'testytest', organisasjonsnummer: '12345678', - organisasjonsfrom: 'BEDR', - gyldigTil: '2100-10-10T10:10:10.100Z', + organisasjonsform: 'BEDR', }, ] diff --git a/apps/dolly-frontend/src/main/js/playwright/tests/Bankid.spec.ts b/apps/dolly-frontend/src/main/js/playwright/tests/Bankid.spec.ts index 10d86341dca..f832c6a7883 100644 --- a/apps/dolly-frontend/src/main/js/playwright/tests/Bankid.spec.ts +++ b/apps/dolly-frontend/src/main/js/playwright/tests/Bankid.spec.ts @@ -11,7 +11,7 @@ test.describe('Bankid testing', () => { headers: { 'content-type': 'application/json' }, }) }) - await page.route(new RegExp(/testnav-person-organisasjon-tilgang-service/), async (route) => { + await page.route(new RegExp(/altinn\/organisasjoner/), async (route) => { await route.fulfill({ status: 200, body: JSON.stringify(personOrgTilgangMock), diff --git a/apps/dolly-frontend/src/main/js/proxy-routes.json b/apps/dolly-frontend/src/main/js/proxy-routes.json index 2b7e1cf21bb..ea55ec091c7 100644 --- a/apps/dolly-frontend/src/main/js/proxy-routes.json +++ b/apps/dolly-frontend/src/main/js/proxy-routes.json @@ -29,6 +29,10 @@ "/session/user": { "changeOrigin": false }, + "/altinn/organisasjoner": { + "target": "http://localhost:8020", + "secure": false + }, "/testnav-organisasjon-faste-data-service/api": { "changeOrigin": true }, @@ -113,9 +117,6 @@ "/testnav-person-search-service/api": { "changeOrigin": true }, - "/testnav-person-organisasjon-tilgang-service/api": { - "changeOrigin": true - }, "/testnav-pdl-forvalter/api": { "changeOrigin": true }, diff --git a/apps/dolly-frontend/src/main/js/src/service/services/personOrganisasjonTilgang/PersonOrganisasjonTilgangService.tsx b/apps/dolly-frontend/src/main/js/src/service/services/personOrganisasjonTilgang/PersonOrganisasjonTilgangService.tsx index c67a1f009c7..e079958b6b3 100644 --- a/apps/dolly-frontend/src/main/js/src/service/services/personOrganisasjonTilgang/PersonOrganisasjonTilgangService.tsx +++ b/apps/dolly-frontend/src/main/js/src/service/services/personOrganisasjonTilgang/PersonOrganisasjonTilgangService.tsx @@ -1,8 +1,7 @@ import Request from '@/service/services/Request' import logoutBruker from '@/components/utlogging/logoutBruker' -const personOrgTilgangServiceUrl = - '/testnav-person-organisasjon-tilgang-service/api/v1/person/organisasjoner' +const personOrgTilgangServiceUrl = '/altinn/organisasjoner' export default { getOrganisasjoner() { @@ -15,5 +14,5 @@ export default { .then((response) => { return response }) - }, + } } diff --git a/apps/dolly-frontend/src/main/js/src/utils/hooks/useOrganisasjonTilgang.tsx b/apps/dolly-frontend/src/main/js/src/utils/hooks/useOrganisasjonTilgang.tsx index 98f8d78bfb6..47969f3c8eb 100644 --- a/apps/dolly-frontend/src/main/js/src/utils/hooks/useOrganisasjonTilgang.tsx +++ b/apps/dolly-frontend/src/main/js/src/utils/hooks/useOrganisasjonTilgang.tsx @@ -3,7 +3,7 @@ import { fetcher } from '@/api' import { useBrukerProfil } from '@/utils/hooks/useBruker' const getOrganisasjonMiljoeUrl = (orgnummer: string) => - `/testnav-altinn3-tilgang-service/api/v1/miljoer/organisasjon/orgnummer?orgnummer=${orgnummer}` + `/testnav-altinn3-tilgang-service/api/v1/miljoer/organisasjon/${orgnummer}` const organisasjonTilgangUrl = `/testnav-altinn3-tilgang-service/api/v1/organisasjoner` diff --git a/apps/dolly-frontend/src/main/resources/application-local.yml b/apps/dolly-frontend/src/main/resources/application-local.yml index be0739b2cf1..48b781833ba 100644 --- a/apps/dolly-frontend/src/main/resources/application-local.yml +++ b/apps/dolly-frontend/src/main/resources/application-local.yml @@ -41,9 +41,6 @@ consumers: testnav-varslinger-service: name: testnav-varslinger-service-dev url: http://testnav-varslinger-service-dev.intern.dev.nav.no - testnav-person-organisasjon-tilgang-service: - name: testnav-person-organisasjon-tilgang-service-dev - url: https://testnav-person-organisasjon-tilgang-service.intern.dev.nav.no oppsummeringsdokument-service: url: https://testnav-oppsummeringsdokument-service.intern.dev.nav.no testnav-bruker-service: diff --git a/apps/dolly-frontend/src/main/resources/application.yml b/apps/dolly-frontend/src/main/resources/application.yml index 9653c61db58..1731e1a42b7 100644 --- a/apps/dolly-frontend/src/main/resources/application.yml +++ b/apps/dolly-frontend/src/main/resources/application.yml @@ -155,11 +155,6 @@ consumers: namespace: dolly name: testnorge-tilbakemelding-api url: http://testnorge-tilbakemelding-api.dolly.svc.cluster.local - testnav-person-organisasjon-tilgang-service: - cluster: dev-gcp - namespace: dolly - name: testnav-person-organisasjon-tilgang-service - url: http://testnav-person-organisasjon-tilgang-service.dolly.svc.cluster.local testnav-bruker-service: cluster: dev-gcp namespace: dolly diff --git a/apps/dolly-frontend/src/main/resources/logback-spring.xml b/apps/dolly-frontend/src/main/resources/logback-spring.xml index 966dbc796b2..b80ca79b071 100644 --- a/apps/dolly-frontend/src/main/resources/logback-spring.xml +++ b/apps/dolly-frontend/src/main/resources/logback-spring.xml @@ -3,17 +3,9 @@ - - true - 10280 - 20 - ^sun\.reflect\..*\.invoke - ^net\.sf\.cglib\.proxy\.MethodProxy\.invoke - java\.util\.concurrent\..* - org\.apache\.catalina\..* - org\.apache\.coyote\..* - org\.apache\.tomcat\..* - + -1 + true + - diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/altinn3/v1/OrganisasjonDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/altinn3/v1/OrganisasjonDTO.java new file mode 100644 index 00000000000..725ba98dfb4 --- /dev/null +++ b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/altinn3/v1/OrganisasjonDTO.java @@ -0,0 +1,17 @@ +package no.nav.testnav.libs.dto.altinn3.v1; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OrganisasjonDTO { + + private String navn; + private String organisasjonsnummer; + private String organisasjonsform; +} \ No newline at end of file diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/altinn3/v1/PersonDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/altinn3/v1/PersonDTO.java new file mode 100644 index 00000000000..c5a91530fda --- /dev/null +++ b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/altinn3/v1/PersonDTO.java @@ -0,0 +1,32 @@ +package no.nav.testnav.libs.dto.altinn3.v1; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PersonDTO { + + private String ident; + private List organisasjoner; + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class OrganisasjonDTO { + + private String navn; + private String organisasjonsnummer; + private String organisasjonsform; + private Boolean hasAltinnDollyTilgang; + private Boolean hasDollyOrganisasjonTilgang; + private String melding; + } +} diff --git a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedResourceServerType.java b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedResourceServerType.java index a3596f957d2..b6b72f5802d 100644 --- a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedResourceServerType.java +++ b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedResourceServerType.java @@ -2,6 +2,7 @@ import lombok.RequiredArgsConstructor; import no.nav.testnav.libs.securitycore.domain.ResourceServerType; +import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; import org.springframework.stereotype.Component; import reactor.core.publisher.Mono; @@ -30,11 +31,18 @@ private Optional getResourceTypeForm(JwtAuthenticationToken @Override public Mono call() { + return getJwtAuthenticationToken() .onErrorResume(JwtResolverException.class, throwable -> Mono.empty()) - .flatMap(token -> getResourceTypeForm(token) - .map(Mono::just) - .orElseGet(Mono::empty) - ); + .flatMap(authentication -> { + if (authentication instanceof JwtAuthenticationToken jwtAuthenticationTokentoken) { + return getResourceTypeForm(jwtAuthenticationTokentoken) + .map(Mono::just) + .orElseGet(Mono::empty); + } else if (authentication instanceof OAuth2AuthenticationToken) { + return Mono.just(ResourceServerType.TOKEN_X); + } + return Mono.empty(); + }); } } diff --git a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedToken.java b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedToken.java index bc5f09c71f3..0a5d4e957fd 100644 --- a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedToken.java +++ b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedToken.java @@ -1,11 +1,18 @@ package no.nav.testnav.libs.reactivesecurity.action; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.testnav.libs.securitycore.domain.Token; +import org.springframework.http.HttpStatus; +import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; +import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; import org.springframework.stereotype.Component; +import org.springframework.web.server.ResponseStatusException; import reactor.core.publisher.Mono; +import java.time.Instant; import java.util.concurrent.Callable; @Component @@ -21,13 +28,21 @@ public Mono call() { .call() .flatMap(serverType -> switch (serverType) { case TOKEN_X -> getJwtAuthenticationToken() - .map(jwt -> Token.builder() - .clientCredentials(false) - .userId(jwt.getTokenAttributes().get("pid").toString()) - .accessTokenValue(jwt.getToken().getTokenValue()) - .expiresAt(jwt.getToken().getExpiresAt()) - .build()); + .map(OAuth2AuthenticationToken.class::cast) + .handle((oauth2, sink) -> { + try { + sink.next(Token.builder() + .clientCredentials(false) + .userId(oauth2.getPrincipal().getAttributes().get("pid").toString()) + .accessTokenValue(new ObjectMapper().writeValueAsString(oauth2)) + .expiresAt((Instant) oauth2.getPrincipal().getAttributes().get("exp")) + .build()); + } catch (JsonProcessingException e) { + sink.error(new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "Feilet å konvertere token to string", e)); + } + }); case AZURE_AD -> getJwtAuthenticationToken() + .map(JwtAuthenticationToken.class::cast) .map(jwt -> Token.builder() .clientCredentials(jwt.getTokenAttributes().get("oid").equals(jwt.getTokenAttributes().get("sub"))) .userId(jwt.getTokenAttributes().get("oid").toString()) diff --git a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedUserId.java b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedUserId.java index 63193f44bcc..b0636ee9c7d 100644 --- a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedUserId.java +++ b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedUserId.java @@ -1,11 +1,15 @@ package no.nav.testnav.libs.reactivesecurity.action; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; +import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; import org.springframework.stereotype.Component; import reactor.core.publisher.Mono; import java.util.concurrent.Callable; +@Slf4j @Component @RequiredArgsConstructor public class GetAuthenticatedUserId extends JwtResolver implements Callable> { @@ -23,6 +27,20 @@ public Mono call() { } private Mono getTokenAttribute(String attribute) { - return getJwtAuthenticationToken().map(value -> value.getTokenAttributes().get(attribute).toString()); + + return getJwtAuthenticationToken() + .map(authentication -> + + switch (authentication) { + + case JwtAuthenticationToken jwtAuthenticationToken -> + jwtAuthenticationToken.getTokenAttributes().get(attribute).toString(); + + case OAuth2AuthenticationToken oauth2AuthenticationToken -> + oauth2AuthenticationToken.getPrincipal().getAttributes().get("pid").toString(); + + default -> ""; + } + ); } } diff --git a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/JwtResolver.java b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/JwtResolver.java index 6f360743c2f..5b19c554aa1 100644 --- a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/JwtResolver.java +++ b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/JwtResolver.java @@ -1,34 +1,19 @@ package no.nav.testnav.libs.reactivesecurity.action; import lombok.extern.slf4j.Slf4j; -import org.springframework.security.authentication.CredentialsExpiredException; +import org.springframework.security.core.Authentication; import org.springframework.security.core.context.ReactiveSecurityContextHolder; import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.oauth2.jwt.Jwt; -import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; import reactor.core.publisher.Mono; -import java.time.Instant; -import java.time.ZonedDateTime; - @Slf4j -@SuppressWarnings("java:S1610") abstract class JwtResolver { - Mono getJwtAuthenticationToken() { + Mono getJwtAuthenticationToken() { return ReactiveSecurityContextHolder .getContext() .switchIfEmpty(Mono.error(new JwtResolverException("ReactiveSecurityContext is empty"))) - .map(SecurityContext::getAuthentication) - .map(JwtAuthenticationToken.class::cast) - .doOnError(throwable -> log.warn("Klarte ikke hente Jwt Auth Token", throwable)) - .doOnSuccess(jwtAuthenticationToken -> { - Jwt credentials = (Jwt) jwtAuthenticationToken.getCredentials(); - Instant expiresAt = credentials.getExpiresAt(); - if (expiresAt == null || expiresAt.isBefore(ZonedDateTime.now().toInstant().plusSeconds(120))) { - throw new CredentialsExpiredException("Jwt er utløpt eller utløper innen kort tid"); - } - }); + .doOnNext(context -> log.info("JwtResolver context.authentication {} {}", context.getAuthentication().getClass().getCanonicalName(), context.getAuthentication())) + .map(SecurityContext::getAuthentication); } - } diff --git a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/Oauth2Resolver.java b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/Oauth2Resolver.java new file mode 100644 index 00000000000..68dac390a55 --- /dev/null +++ b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/Oauth2Resolver.java @@ -0,0 +1,35 @@ +package no.nav.testnav.libs.reactivesecurity.action; + +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.authentication.CredentialsExpiredException; +import org.springframework.security.core.context.ReactiveSecurityContextHolder; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; +import org.springframework.security.oauth2.jwt.Jwt; +import reactor.core.publisher.Mono; + +import java.time.Instant; +import java.time.ZonedDateTime; + +@Slf4j +@UtilityClass +public class Oauth2Resolver { + + public static Mono getOauth2AuthenticationToken() { + return ReactiveSecurityContextHolder + .getContext() + .switchIfEmpty(Mono.error(new JwtResolverException("ReactiveSecurityContext is empty"))) + .doOnNext(context -> log.info("Oauth2Resolver context.authentication {} {}", context.getAuthentication().getClass().getCanonicalName(), context.getAuthentication())) + .map(SecurityContext::getAuthentication) + .map(OAuth2AuthenticationToken.class::cast) + .doOnError(throwable -> log.warn("Klarte ikke hente Jwt Auth Token", throwable)) + .doOnSuccess(jwtAuthenticationToken -> { + Jwt credentials = (Jwt) jwtAuthenticationToken.getCredentials(); + Instant expiresAt = credentials.getExpiresAt(); + if (expiresAt == null || expiresAt.isBefore(ZonedDateTime.now().toInstant().plusSeconds(120))) { + throw new CredentialsExpiredException("Jwt er utløpt eller utløper innen kort tid"); + } + }); + } +} From 2df3958d4dec339d592f62effe7bbbf8387d89d6 Mon Sep 17 00:00:00 2001 From: "Kristen.Herum" Date: Fri, 20 Dec 2024 07:28:31 +0100 Subject: [PATCH 52/59] Revert "Bugfix/altinn3 tilgang (#3700)" This reverts commit 1ea2342517e8d663f29f804cfac36d5a51b00b56. --- .github/workflows/integration-tests.yml | 10 +- apps/altinn3-tilgang-service/README.md | 1 - apps/altinn3-tilgang-service/build.gradle | 1 - apps/altinn3-tilgang-service/config.dev.yml | 1 - apps/altinn3-tilgang-service/config.prod.yml | 1 - .../docker-compose.yml | 18 --- apps/altinn3-tilgang-service/settings.gradle | 2 +- .../consumer/altinn/AltinnConsumer.java | 45 +++---- .../CreateAccessListeMemberCommand.java | 10 +- .../DeleteAccessListMemberCommand.java | 8 +- .../command/GetAccessListMembersCommand.java | 8 +- .../command/GetAuthorizedPartiesCommand.java | 40 ------- .../consumer/altinn/dto/AccessToken.java | 0 .../AltinnAuthorizedPartiesRequestDTO.java | 18 --- ...esponseDTO.java => AltinnResponseDTO.java} | 2 +- .../altinn/dto/AuthorizedPartyDTO.java | 42 ------- .../domain/PersonRequest.java | 13 -- .../AltinnBrukerTilgangController.java | 33 ------ ...ller.java => AltinnTilgangController.java} | 6 +- .../service/AltinnBrukerTilgangService.java | 112 ------------------ ...Service.java => AltinnTilgangService.java} | 2 +- .../service/MiljoerOversiktService.java | 14 ++- .../src/main/resources/application-local.yml | 6 +- .../src/main/resources/application.yml | 3 +- apps/dolly-frontend/config.idporten.yml | 5 +- apps/dolly-frontend/config.test.yml | 2 + apps/dolly-frontend/config.unstable.yml | 2 + apps/dolly-frontend/config.yml | 2 + .../web/DollyFrontendApplicationStarter.java | 2 + .../no/nav/dolly/web/config/Consumers.java | 1 + ...inn3PersonOrganisasjonTilgangConsumer.java | 66 ----------- .../PersonOrganisasjonTilgangConsumer.java | 62 ++++++++++ ... GetPersonOrganisasjonTilgangCommand.java} | 24 ++-- .../consumers/dto/AltinnBrukerRequest.java | 11 -- .../web/consumers/dto/OrganisasjonDTO.java | 12 ++ .../provider/web/BrukerTilgangController.java | 29 ----- .../web/provider/web/SessionController.java | 7 +- .../main/js/playwright/mocks/BasicMocks.tsx | 3 +- .../main/js/playwright/tests/Bankid.spec.ts | 2 +- .../src/main/js/proxy-routes.json | 7 +- .../PersonOrganisasjonTilgangService.tsx | 5 +- .../utils/hooks/useOrganisasjonTilgang.tsx | 2 +- .../src/main/resources/application-local.yml | 3 + .../src/main/resources/application.yml | 5 + .../src/main/resources/logback-spring.xml | 14 ++- .../libs/dto/altinn3/v1/OrganisasjonDTO.java | 17 --- .../libs/dto/altinn3/v1/PersonDTO.java | 32 ----- .../GetAuthenticatedResourceServerType.java | 16 +-- .../action/GetAuthenticatedToken.java | 27 +---- .../action/GetAuthenticatedUserId.java | 20 +--- .../reactivesecurity/action/JwtResolver.java | 23 +++- .../action/Oauth2Resolver.java | 35 ------ 52 files changed, 214 insertions(+), 618 deletions(-) delete mode 100644 apps/altinn3-tilgang-service/docker-compose.yml delete mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAuthorizedPartiesCommand.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AccessToken.java delete mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnAuthorizedPartiesRequestDTO.java rename apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/{AltinnAccessListResponseDTO.java => AltinnResponseDTO.java} (95%) delete mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AuthorizedPartyDTO.java delete mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/domain/PersonRequest.java delete mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnBrukerTilgangController.java rename apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/{AltinnOrganisasjonTilgangController.java => AltinnTilgangController.java} (89%) delete mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnBrukerTilgangService.java rename apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/{AltinnOrganisasjonTilgangService.java => AltinnTilgangService.java} (98%) delete mode 100644 apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/Altinn3PersonOrganisasjonTilgangConsumer.java create mode 100644 apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/PersonOrganisasjonTilgangConsumer.java rename apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/command/{PostPersonOrganisasjonTilgangCommand.java => GetPersonOrganisasjonTilgangCommand.java} (59%) delete mode 100644 apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/dto/AltinnBrukerRequest.java create mode 100644 apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/dto/OrganisasjonDTO.java delete mode 100644 apps/dolly-frontend/src/main/java/no/nav/dolly/web/provider/web/BrukerTilgangController.java delete mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/altinn3/v1/OrganisasjonDTO.java delete mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/altinn3/v1/PersonDTO.java delete mode 100644 libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/Oauth2Resolver.java diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index 9351999c60b..16c25d9ff37 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -3,6 +3,7 @@ on: push: paths: - 'apps/bruker-service/**' + - 'apps/person-organisasjon-tilgang-service/**' workflow_dispatch: jobs: @@ -13,4 +14,11 @@ jobs: working-directory: 'apps/bruker-service/' healthcheck: 'http://localhost:8002/internal/isAlive' secrets: - NAV_TOKEN: ${{ secrets.NAV_TOKEN }} \ No newline at end of file + NAV_TOKEN: ${{ secrets.NAV_TOKEN }} + person-organisasjon-tilgang-service: + if: github.event.pull_request.draft == false + uses: ./.github/workflows/common.integration-test.yml + with: + working-directory: 'apps/person-organisasjon-tilgang-service/' + healthcheck: 'http://localhost:8001/internal/isAlive' + secrets: inherit \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/README.md b/apps/altinn3-tilgang-service/README.md index baad90dca7e..ad8b6f4dd72 100644 --- a/apps/altinn3-tilgang-service/README.md +++ b/apps/altinn3-tilgang-service/README.md @@ -10,4 +10,3 @@ Swagger finnes under [/swagger-ui.html](https://testnav-altinn3-tilgang-service. ## Lokal kjøring * [Generelt.](../../docs/local_general.md) * [Secret Manager.](../../docs/local_secretmanager.md) -* [Database i GCP.](../../docs/gcp_db.md) diff --git a/apps/altinn3-tilgang-service/build.gradle b/apps/altinn3-tilgang-service/build.gradle index cf1162f4ca0..1ea7ae40843 100644 --- a/apps/altinn3-tilgang-service/build.gradle +++ b/apps/altinn3-tilgang-service/build.gradle @@ -10,7 +10,6 @@ sonarqube { } dependencies { - implementation "no.nav.testnav.libs:data-transfer-objects" implementation "no.nav.testnav.libs:reactive-core" implementation "no.nav.testnav.libs:reactive-security" diff --git a/apps/altinn3-tilgang-service/config.dev.yml b/apps/altinn3-tilgang-service/config.dev.yml index 16511daa0a1..b9d45fba561 100644 --- a/apps/altinn3-tilgang-service/config.dev.yml +++ b/apps/altinn3-tilgang-service/config.dev.yml @@ -23,7 +23,6 @@ spec: consumes: - name: altinn:resourceregistry/accesslist.read - name: altinn:resourceregistry/accesslist.write - - name: altinn:accessmanagement/authorizedparties.resourceowner accessPolicy: inbound: rules: diff --git a/apps/altinn3-tilgang-service/config.prod.yml b/apps/altinn3-tilgang-service/config.prod.yml index 2ea338b1fb7..f24efb9735e 100644 --- a/apps/altinn3-tilgang-service/config.prod.yml +++ b/apps/altinn3-tilgang-service/config.prod.yml @@ -23,7 +23,6 @@ spec: consumes: - name: altinn:resourceregistry/accesslist.read - name: altinn:resourceregistry/accesslist.write - - name: altinn:accessmanagement/authorizedparties.resourceowner accessPolicy: inbound: rules: diff --git a/apps/altinn3-tilgang-service/docker-compose.yml b/apps/altinn3-tilgang-service/docker-compose.yml deleted file mode 100644 index b0eb57bd211..00000000000 --- a/apps/altinn3-tilgang-service/docker-compose.yml +++ /dev/null @@ -1,18 +0,0 @@ -services: - - cloud_sql_proxy: - image: gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.14.2 - network_mode: host - command: - - "dolly-dev-ff83:europe-north1:testnav-altinn3-tilgang-local" - - "--credentials-file=/application_default_credentials.json" - - "--run-connection-test" - volumes: - - type: bind - # Set a variable $DOLLY_APPLICATION_CREDENTIALS. We don't use - # GOOGLE_APPLICATION_CREDENTIALS, as this causes an extra step during login. - # - # - $HOME/.config/gcloud/application_default_credentials.json for Linux/macOS. - # - $APPDATA/gcloud/application_default_credentials.json for Windows. - source: $DOLLY_APPLICATION_CREDENTIALS - target: /application_default_credentials.json \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/settings.gradle b/apps/altinn3-tilgang-service/settings.gradle index d7e1b8e69d7..e7a413ca6d0 100644 --- a/apps/altinn3-tilgang-service/settings.gradle +++ b/apps/altinn3-tilgang-service/settings.gradle @@ -6,9 +6,9 @@ rootProject.name = 'altinn3-tilgang-service' includeBuild "../../plugins/java" -includeBuild '../../libs/data-transfer-objects' includeBuild '../../libs/reactive-core' includeBuild '../../libs/reactive-security' +includeBuild '../../libs/vault' develocity { buildScan { diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/AltinnConsumer.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/AltinnConsumer.java index cf62199a355..ae8f52b3b39 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/AltinnConsumer.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/AltinnConsumer.java @@ -10,11 +10,8 @@ import no.nav.testnav.altinn3tilgangservice.consumer.altinn.command.CreateAccessListeMemberCommand; import no.nav.testnav.altinn3tilgangservice.consumer.altinn.command.DeleteAccessListMemberCommand; import no.nav.testnav.altinn3tilgangservice.consumer.altinn.command.GetAccessListMembersCommand; -import no.nav.testnav.altinn3tilgangservice.consumer.altinn.command.GetAuthorizedPartiesCommand; import no.nav.testnav.altinn3tilgangservice.consumer.altinn.command.GetExchangeTokenCommand; -import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnAccessListResponseDTO; -import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnAuthorizedPartiesRequestDTO; -import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AuthorizedPartyDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnResponseDTO; import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.BrregResponseDTO; import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.OrganisasjonCreateDTO; import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.OrganisasjonDeleteDTO; @@ -28,7 +25,6 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import java.util.Arrays; import java.util.List; import java.util.Map; @@ -80,7 +76,7 @@ public Flux delete(String organisasjonsnummer) { return Flux.from(getAccessListMembers() .flatMapMany(value -> Flux.fromIterable(value.getData())) - .map(AltinnAccessListResponseDTO.AccessListMembershipDTO::getIdentifiers) + .map(AltinnResponseDTO.AccessListMembershipDTO::getIdentifiers) .collectList() .map(data -> getIdentifier(data, organisasjonsnummer)) .map(identifier -> @@ -110,16 +106,16 @@ public Flux create(String organisasjonsnummer) { new OrganisasjonCreateDTO(organisasjonsnummer), altinnConfig).call()) .flatMapMany(response -> - isBlank(response.getFeilmelding()) ? - Flux.fromIterable(response.getData()) - .map(this::getOrgnummer) - .filter(organisasjonsnummer::equals) - .flatMap(brregConsumer::getEnheter) : - Mono.just(BrregResponseDTO.builder() - .organisasjonsnummer(organisasjonsnummer) - .feilmelding(response.getFeilmelding()) - .status(response.getStatus()) - .build())) + isBlank(response.getFeilmelding()) ? + Flux.fromIterable(response.getData()) + .map(this::getOrgnummer) + .filter(organisasjonsnummer::equals) + .flatMap(brregConsumer::getEnheter) : + Mono.just(BrregResponseDTO.builder() + .organisasjonsnummer(organisasjonsnummer) + .feilmelding(response.getFeilmelding()) + .status(response.getStatus()) + .build())) .map(response -> mapperFacade.map(response, Organisasjon.class)); } @@ -129,18 +125,7 @@ public Flux getOrganisasjoner() { .flatMapMany(this::convertToOrganisasjon); } - public Flux getAuthorizedParties(String ident) { - - return maskinportenConsumer.getAccessToken() - .flatMap(this::exchangeToken) - .flatMap(exchangeToken -> new GetAuthorizedPartiesCommand(webClient, - new AltinnAuthorizedPartiesRequestDTO(ident), - exchangeToken).call()) - .map(Arrays::asList) - .flatMapIterable(list -> list); - } - - private Mono getAccessListMembers() { + private Mono getAccessListMembers() { return maskinportenConsumer.getAccessToken() .flatMap(this::exchangeToken) @@ -150,7 +135,7 @@ private Mono getAccessListMembers() { altinnConfig).call()); } - private Flux convertToOrganisasjon(AltinnAccessListResponseDTO altInnResponse) { + private Flux convertToOrganisasjon(AltinnResponseDTO altInnResponse) { return Flux.fromIterable(altInnResponse.getData()) .map(this::getOrgnummer) @@ -170,7 +155,7 @@ private OrganisasjonDeleteDTO getIdentifier(List data, String organisa } @SneakyThrows - private String getOrgnummer(AltinnAccessListResponseDTO.AccessListMembershipDTO data) { + private String getOrgnummer(AltinnResponseDTO.AccessListMembershipDTO data) { return data.getIdentifiers() .get(ORGANISASJON_ID) diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/CreateAccessListeMemberCommand.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/CreateAccessListeMemberCommand.java index d665fd9723d..997a7b65a70 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/CreateAccessListeMemberCommand.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/CreateAccessListeMemberCommand.java @@ -3,7 +3,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.testnav.altinn3tilgangservice.config.AltinnConfig; -import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnAccessListResponseDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnResponseDTO; import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.OrganisasjonCreateDTO; import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; @@ -16,7 +16,7 @@ @Slf4j @RequiredArgsConstructor -public class CreateAccessListeMemberCommand implements Callable> { +public class CreateAccessListeMemberCommand implements Callable> { private static final String ALTINN_URL = "/resourceregistry/api/v1/access-lists/{owner}/{identifier}/members"; @@ -27,7 +27,7 @@ public class CreateAccessListeMemberCommand implements Callable call() { + public Mono call() { return webClient .post() @@ -37,14 +37,14 @@ public Mono call() { .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .retrieve() - .bodyToMono(AltinnAccessListResponseDTO.class) + .bodyToMono(AltinnResponseDTO.class) .doOnError(WebClientFilter::logErrorMessage) .doOnSuccess(value -> log.info("Altinn organisasjontilgang opprettet for {}", organisasjon.getData().stream() .map(data -> data.split(":")) .map(data -> data[data.length-1]) .collect(Collectors.joining()))) - .onErrorResume(throwable -> Mono.just(AltinnAccessListResponseDTO.builder() + .onErrorResume(throwable -> Mono.just(AltinnResponseDTO.builder() .status(WebClientFilter.getStatus(throwable)) .feilmelding(WebClientFilter.getMessage(throwable)) .build())); diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/DeleteAccessListMemberCommand.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/DeleteAccessListMemberCommand.java index e685b681507..ddaac4a82da 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/DeleteAccessListMemberCommand.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/DeleteAccessListMemberCommand.java @@ -3,7 +3,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.testnav.altinn3tilgangservice.config.AltinnConfig; -import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnAccessListResponseDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnResponseDTO; import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.OrganisasjonDeleteDTO; import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; @@ -19,7 +19,7 @@ @Slf4j @RequiredArgsConstructor -public class DeleteAccessListMemberCommand implements Callable> { +public class DeleteAccessListMemberCommand implements Callable> { private static final String ALTINN_URL = "/resourceregistry/api/v1/access-lists/{owner}/{identifier}/members"; @@ -30,7 +30,7 @@ public class DeleteAccessListMemberCommand implements Callable call() { + public Mono call() { return webClient .method(HttpMethod.DELETE) @@ -41,7 +41,7 @@ public Mono call() { .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .bodyValue(identifiers) .retrieve() - .bodyToMono(AltinnAccessListResponseDTO.class) + .bodyToMono(AltinnResponseDTO.class) .doOnSuccess(value -> log.info("Altinn organisasjontilgang slettet for {}", identifiers.getData().stream() .filter(data -> data.contains(ORGANISASJON_ID)) diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAccessListMembersCommand.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAccessListMembersCommand.java index 19f63d2f8db..1c615118bf7 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAccessListMembersCommand.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAccessListMembersCommand.java @@ -3,7 +3,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.testnav.altinn3tilgangservice.config.AltinnConfig; -import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnAccessListResponseDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnResponseDTO; import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; @@ -14,7 +14,7 @@ @Slf4j @RequiredArgsConstructor -public class GetAccessListMembersCommand implements Callable> { +public class GetAccessListMembersCommand implements Callable> { private static final String ALTINN_URL = "/resourceregistry/api/v1/access-lists/{owner}/{identifier}/members"; @@ -23,7 +23,7 @@ public class GetAccessListMembersCommand implements Callable call() { + public Mono call() { return webClient .get() @@ -32,7 +32,7 @@ public Mono call() { .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .retrieve() - .bodyToMono(AltinnAccessListResponseDTO.class) + .bodyToMono(AltinnResponseDTO.class) .doOnError(WebClientFilter::logErrorMessage) .doOnSuccess(value -> log.info("Altinn-tilgang hentet")); } diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAuthorizedPartiesCommand.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAuthorizedPartiesCommand.java deleted file mode 100644 index d58693bacb2..00000000000 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAuthorizedPartiesCommand.java +++ /dev/null @@ -1,40 +0,0 @@ -package no.nav.testnav.altinn3tilgangservice.consumer.altinn.command; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnAuthorizedPartiesRequestDTO; -import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AuthorizedPartyDTO; -import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; - -import java.util.concurrent.Callable; - -@Slf4j -@RequiredArgsConstructor -public class GetAuthorizedPartiesCommand implements Callable> { - - private static final String ALTINN_URL = "/accessmanagement/api/v1/resourceowner/authorizedparties"; - - private final WebClient webClient; - private final AltinnAuthorizedPartiesRequestDTO request; - private final String token; - - @Override - public Mono call() { - - log.info("Spørring på bruker {}", request); - return webClient - .post() - .uri(builder -> builder.path(ALTINN_URL) - .build()) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .bodyValue(request) - .retrieve() - .bodyToMono(AuthorizedPartyDTO[].class) - .doOnError(WebClientFilter::logErrorMessage); - } -} \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AccessToken.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AccessToken.java new file mode 100644 index 00000000000..e69de29bb2d diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnAuthorizedPartiesRequestDTO.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnAuthorizedPartiesRequestDTO.java deleted file mode 100644 index 7e2eecded37..00000000000 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnAuthorizedPartiesRequestDTO.java +++ /dev/null @@ -1,18 +0,0 @@ -package no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto; - -import lombok.Data; - -@Data -public class AltinnAuthorizedPartiesRequestDTO { - - private static final String IDENT_IDENTIFIKATOR = "urn:altinn:person:identifier-no"; - - private String type; - private String value; - - public AltinnAuthorizedPartiesRequestDTO(String ident) { - - this.type = IDENT_IDENTIFIKATOR; - this.value = ident; - } -} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnAccessListResponseDTO.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnResponseDTO.java similarity index 95% rename from apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnAccessListResponseDTO.java rename to apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnResponseDTO.java index 6521fa55049..720fec9136f 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnAccessListResponseDTO.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnResponseDTO.java @@ -17,7 +17,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class AltinnAccessListResponseDTO { +public class AltinnResponseDTO { private List data; private String feilmelding; diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AuthorizedPartyDTO.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AuthorizedPartyDTO.java deleted file mode 100644 index 0fe03486d57..00000000000 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AuthorizedPartyDTO.java +++ /dev/null @@ -1,42 +0,0 @@ -package no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.ArrayList; -import java.util.List; - -import static java.util.Objects.isNull; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class AuthorizedPartyDTO { - - private String name; - private String organizationNumber; - private String unitType; - private Boolean isDeleted; - private List authorizedResources; - private List subunits; - - public List getAuthorizedResources() { - - if (isNull(authorizedResources)) { - authorizedResources = new ArrayList<>(); - } - return authorizedResources; - } - - public List getSubunits() { - - if (isNull(subunits)) { - subunits = new ArrayList<>(); - } - return subunits; - } -} - diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/domain/PersonRequest.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/domain/PersonRequest.java deleted file mode 100644 index 40f9ef759f0..00000000000 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/domain/PersonRequest.java +++ /dev/null @@ -1,13 +0,0 @@ -package no.nav.testnav.altinn3tilgangservice.domain; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class PersonRequest { - - private String ident; -} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnBrukerTilgangController.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnBrukerTilgangController.java deleted file mode 100644 index 55893774beb..00000000000 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnBrukerTilgangController.java +++ /dev/null @@ -1,33 +0,0 @@ -package no.nav.testnav.altinn3tilgangservice.provider; - -import lombok.RequiredArgsConstructor; -import no.nav.testnav.altinn3tilgangservice.domain.PersonRequest; -import no.nav.testnav.altinn3tilgangservice.service.AltinnBrukerTilgangService; -import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO; -import no.nav.testnav.libs.dto.altinn3.v1.PersonDTO; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -@RestController -@RequestMapping("/api/v1/brukertilgang") -@RequiredArgsConstructor -public class AltinnBrukerTilgangController { - - private final AltinnBrukerTilgangService brukerTilgangService; - - @PostMapping - public Flux getPersonOrganisasjonTilgang(@RequestBody PersonRequest request) { - - return brukerTilgangService.getPersonOrganisasjonTilgang(request.getIdent()); - } - - @PostMapping("/detaljert") - public Mono getPersonOrganisasjonDetaljertTilgang(@RequestBody PersonRequest request) { - - return brukerTilgangService.getPersonOrganisasjonDetaljertTilgang(request.getIdent()); - } -} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnOrganisasjonTilgangController.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnTilgangController.java similarity index 89% rename from apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnOrganisasjonTilgangController.java rename to apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnTilgangController.java index 484700ce2d9..140f414c701 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnOrganisasjonTilgangController.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnTilgangController.java @@ -4,7 +4,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.testnav.altinn3tilgangservice.domain.OrganisasjonResponse; -import no.nav.testnav.altinn3tilgangservice.service.AltinnOrganisasjonTilgangService; +import no.nav.testnav.altinn3tilgangservice.service.AltinnTilgangService; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -20,9 +20,9 @@ @RestController @RequestMapping("/api/v1/organisasjoner") @RequiredArgsConstructor -public class AltinnOrganisasjonTilgangController { +public class AltinnTilgangController { - private final AltinnOrganisasjonTilgangService altinnTilgangService; + private final AltinnTilgangService altinnTilgangService; @GetMapping @Operation(description = "Henter alle organisasjoner med Altinn-tilgang") diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnBrukerTilgangService.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnBrukerTilgangService.java deleted file mode 100644 index 581ba8f8ff5..00000000000 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnBrukerTilgangService.java +++ /dev/null @@ -1,112 +0,0 @@ -package no.nav.testnav.altinn3tilgangservice.service; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.altinn3tilgangservice.consumer.altinn.AltinnConsumer; -import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AuthorizedPartyDTO; -import no.nav.testnav.altinn3tilgangservice.domain.Organisasjon; -import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO; -import no.nav.testnav.libs.dto.altinn3.v1.PersonDTO; -import org.springframework.stereotype.Service; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; -import reactor.util.function.Tuple2; - -import java.util.List; - -import static org.apache.commons.lang3.BooleanUtils.isFalse; -import static org.apache.commons.lang3.StringUtils.isNotBlank; - -@Slf4j -@Service -@RequiredArgsConstructor -public class AltinnBrukerTilgangService { - - private static final String DOLLY_RESOURCE = "nav_dolly_tilgang-samarbeidspartnere"; - private final AltinnConsumer altinnConsumer; - - public Flux getPersonOrganisasjonTilgang(String ident) { - - return Flux.zip( - altinnConsumer.getAuthorizedParties(ident), - altinnConsumer.getOrganisasjoner().collectList()) - .flatMap(this::getOrganisasjon); - } - - private Mono getOrganisasjon(Tuple2> organisasjoner) { - - return Mono.just(organisasjoner.getT1()) - .filter(party -> party.getAuthorizedResources().contains(DOLLY_RESOURCE)) - .filter(party -> organisasjoner.getT2().stream() - .anyMatch(organisasjon -> organisasjon.getOrganisasjonsnummer().equals(party.getOrganizationNumber()))) - .map(part -> OrganisasjonDTO.builder() - .navn(part.getName()) - .organisasjonsnummer(part.getOrganizationNumber()) - .organisasjonsform(part.getUnitType()) - .build()); - } - - public Mono getPersonOrganisasjonDetaljertTilgang(String ident) { - - return Mono.zip( - altinnConsumer.getAuthorizedParties(ident).collectList(), - altinnConsumer.getOrganisasjoner().collectList()) - .flatMapMany(this::getTilpassetOrganisasjon) - .collectList() - .map(organisasjoner -> PersonDTO.builder() - .ident(ident) - .organisasjoner(organisasjoner) - .build()); - } - - private Flux getTilpassetOrganisasjon(Tuple2, List> organisasjoner) { - - return Flux.fromIterable(organisasjoner.getT1()) - .filter(party -> isNotBlank(party.getOrganizationNumber()) && isNotBlank(party.getName())) - .filter(party -> isFalse(party.getIsDeleted())) - .map(party -> PersonDTO.OrganisasjonDTO.builder() - .navn(party.getName()) - .organisasjonsnummer(party.getOrganizationNumber()) - .organisasjonsform(party.getUnitType()) - .hasAltinnDollyTilgang(hasAltinnDollyTilgang(party)) - .hasDollyOrganisasjonTilgang(hasDollyOrganisasjonTilgang(organisasjoner.getT2(), party)) - .melding(getMelding(party.getName(), party.getOrganizationNumber(), - hasAltinnDollyTilgang(party), hasDollyOrganisasjonTilgang(organisasjoner.getT2(), party))) - .build()); - } - - private static boolean hasAltinnDollyTilgang(AuthorizedPartyDTO authorizedParty) { - - return authorizedParty.getAuthorizedResources().contains(DOLLY_RESOURCE); - } - - private static boolean hasDollyOrganisasjonTilgang(List organisasjoner, AuthorizedPartyDTO party) { - - return organisasjoner.stream() - .anyMatch(organisasjon -> organisasjon.getOrganisasjonsnummer().equals(party.getOrganizationNumber())); - } - - private static String getMelding(String orgnavn, String orgnummer, boolean hasAltinnDollyTilgang, boolean hasDollyOrganisasjonTilgang) { - - return new StringBuilder() - .append(!hasAltinnDollyTilgang ? - "Du mangler tilgang i Altinn på følgende tjenste: " + - "\"Tilgang til NAVs Dolly for samarbeidspartnere\" " + - "for organisasjon %s (med orgnummer %s)%n".formatted(orgnavn, orgnummer) : "") - .append(!hasAltinnDollyTilgang && !hasDollyOrganisasjonTilgang ? - " og %n" : "") - .append(!hasDollyOrganisasjonTilgang ? - "Organisasjon %s (med orgnummer %s) " .formatted(orgnavn, orgnummer) + - "mangler tilgang på Dolly syntetiske testdata selvbetjening%n" : "") - .append(!hasAltinnDollyTilgang || !hasDollyOrganisasjonTilgang ? - "Hvis du har til hensikt å bruke Dolly til å generere testdata, gjør følgende:%n" : "") - .append(!hasAltinnDollyTilgang ? - "- Ta kontakt med Altinn-ansvarlig i %s (med orgnummer %s) ".formatted(orgnavn, orgnummer) + - "og spør om vedkommene kan gi deg tilgang til tjenesten: " + - "\"Tilgang til NAVs Dolly for samarbeidspartnere\"%n" : "") - .append(!hasDollyOrganisasjonTilgang ? - "- Ta kontakt med NAV ved Anders Marstrander epost: anders.marstrander@nav.no, og spør om " + - "organisasjon med orgnr %s kan gis tilgang til Dolly syntetiske testdata selvbetjening%n".formatted(orgnummer) : "") - .toString(); - } -} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnOrganisasjonTilgangService.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnTilgangService.java similarity index 98% rename from apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnOrganisasjonTilgangService.java rename to apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnTilgangService.java index 6dc40eb83fd..d4151a28ecf 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnOrganisasjonTilgangService.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnTilgangService.java @@ -17,7 +17,7 @@ @Service @RequiredArgsConstructor -public class AltinnOrganisasjonTilgangService { +public class AltinnTilgangService { private static final String ORGANISASJON_TILGANG = "tilgang"; private final AltinnConsumer altinnConsumer; diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/MiljoerOversiktService.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/MiljoerOversiktService.java index 3774737e83f..81202173881 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/MiljoerOversiktService.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/MiljoerOversiktService.java @@ -4,9 +4,7 @@ import no.nav.testnav.altinn3tilgangservice.consumer.altinn.AltinnConsumer; import no.nav.testnav.altinn3tilgangservice.database.entity.OrganisasjonTilgang; import no.nav.testnav.altinn3tilgangservice.database.repository.OrganisasjonTilgangRepository; -import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; -import org.springframework.web.server.ResponseStatusException; import reactor.core.publisher.Mono; import static org.apache.commons.lang3.BooleanUtils.isTrue; @@ -49,13 +47,17 @@ public Mono updateMiljoe(String orgnummer, String miljoe) { organisasjon.setMiljoe(miljoe); return organisasjonTilgangRepository.save(organisasjon); }) : - - throwError(orgnummer)); + organisasjonTilgangRepository.save(OrganisasjonTilgang.builder() + .organisasjonNummer(orgnummer) + .miljoe(miljoe) + .build())); } private static Mono throwError(String orgnummer) { - throw new ResponseStatusException(HttpStatus.NOT_FOUND, - "Organisasjonsnummer %s ble ikke funnet".formatted(orgnummer)); + return Mono.just(OrganisasjonTilgang.builder() + .organisasjonNummer(orgnummer) + .feilmelding("404 Not found: Organisasjonsnummer %s ble ikke funnet".formatted(orgnummer)) + .build()); } } diff --git a/apps/altinn3-tilgang-service/src/main/resources/application-local.yml b/apps/altinn3-tilgang-service/src/main/resources/application-local.yml index b53b18bab13..7916eb7f7fa 100644 --- a/apps/altinn3-tilgang-service/src/main/resources/application-local.yml +++ b/apps/altinn3-tilgang-service/src/main/resources/application-local.yml @@ -1,9 +1,9 @@ -ALTINN_URL: https://platform.tt02.altinn.no +ALTINN_URL: https://tt02.altinn.no AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} -MASKINPORTEN_CLIENT_ID: ef2960de-7fa6-4396-80a5-2eca00e4af28 +MASKINPORTEN_CLIENT_ID: dummy MASKINPORTEN_CLIENT_JWK: dummy -MASKINPORTEN_SCOPES: altinn:resourceregistry/accesslist.read altinn:resourceregistry/accesslist.write altinn:accessmanagement/authorizedparties.resourceowner +MASKINPORTEN_SCOPES: dummy MASKINPORTEN_WELL_KNOWN_URL: https://test.maskinporten.no/.well-known/oauth-authorization-server TOKEN_X_ISSUER: dummy diff --git a/apps/altinn3-tilgang-service/src/main/resources/application.yml b/apps/altinn3-tilgang-service/src/main/resources/application.yml index 16f513682d3..70a799743f3 100644 --- a/apps/altinn3-tilgang-service/src/main/resources/application.yml +++ b/apps/altinn3-tilgang-service/src/main/resources/application.yml @@ -52,5 +52,4 @@ server: encoding: charset: UTF-8 error: - include-message: always - include-stacktrace: never \ No newline at end of file + include-message: always \ No newline at end of file diff --git a/apps/dolly-frontend/config.idporten.yml b/apps/dolly-frontend/config.idporten.yml index 64f2ba53138..aed20782252 100644 --- a/apps/dolly-frontend/config.idporten.yml +++ b/apps/dolly-frontend/config.idporten.yml @@ -17,7 +17,7 @@ spec: tenant: nav.no replicas: min: 1 - max: 1 + max: 2 port: 8080 ingresses: - "https://dolly-idporten.ekstern.dev.nav.no" @@ -42,8 +42,11 @@ spec: - application: testnav-organisasjon-faste-data-service - application: testnav-organisasjon-forvalter - application: testnav-organisasjon-service + - application: testnav-organisasjon-tilgang-service - application: testnav-pdl-forvalter - application: testnav-person-faste-data-service + - application: testnav-person-organisasjon-tilgang-service + - application: testnav-person-organisasjon-tilgang-service-dev - application: testnav-person-search-service - application: testnav-person-service - application: testnav-skattekort-service diff --git a/apps/dolly-frontend/config.test.yml b/apps/dolly-frontend/config.test.yml index 9494c59a1f0..260eafa9a3e 100644 --- a/apps/dolly-frontend/config.test.yml +++ b/apps/dolly-frontend/config.test.yml @@ -46,8 +46,10 @@ spec: - application: testnav-organisasjon-faste-data-service - application: testnav-organisasjon-forvalter - application: testnav-organisasjon-service + - application: testnav-organisasjon-tilgang-service - application: testnav-pdl-forvalter-dev - application: testnav-person-faste-data-service + - application: testnav-person-organisasjon-tilgang-service-dev - application: testnav-person-search-service - application: testnav-person-service - application: testnav-sykemelding-api-dev diff --git a/apps/dolly-frontend/config.unstable.yml b/apps/dolly-frontend/config.unstable.yml index 19b2a8aa5cc..7a6b3df1dba 100644 --- a/apps/dolly-frontend/config.unstable.yml +++ b/apps/dolly-frontend/config.unstable.yml @@ -44,7 +44,9 @@ spec: - application: testnav-organisasjon-faste-data-service - application: testnav-organisasjon-forvalter - application: testnav-organisasjon-service + - application: testnav-organisasjon-tilgang-service - application: testnav-pdl-forvalter-dev + - application: testnav-person-organisasjon-tilgang-service-dev - application: testnav-person-search-service - application: testnav-person-service - application: testnav-tenor-search-service diff --git a/apps/dolly-frontend/config.yml b/apps/dolly-frontend/config.yml index 2faeb17bc3a..f0429be6a19 100644 --- a/apps/dolly-frontend/config.yml +++ b/apps/dolly-frontend/config.yml @@ -51,8 +51,10 @@ spec: - application: testnav-organisasjon-faste-data-service - application: testnav-organisasjon-forvalter - application: testnav-organisasjon-service + - application: testnav-organisasjon-tilgang-service - application: testnav-pdl-forvalter - application: testnav-person-faste-data-service + - application: testnav-person-organisasjon-tilgang-service - application: testnav-person-search-service - application: testnav-person-service - application: testnav-skattekort-service diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java index d6bcdebdc7b..2df2a6e90d0 100644 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java @@ -53,6 +53,7 @@ public class DollyFrontendApplicationStarter { @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { + return builder .routes() .route(createRoute(consumers.getTestnavKontoregisterPersonProxy())) @@ -84,6 +85,7 @@ public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { .route(createRoute(consumers.getTestnavSigrunstubProxy())) .route(createRoute(consumers.getTestnavPdlForvalter(), "testnav-pdl-forvalter")) .route(createRoute(consumers.getTestnavPersonSearchService())) + .route(createRoute(consumers.getTestnavPersonOrganisasjonTilgangService(), "testnav-person-organisasjon-tilgang-service")) .route(createRoute(consumers.getTestnavSkjermingsregisterProxy())) .route(createRoute(consumers.getTestnavDokarkivProxy())) .route(createRoute(consumers.getTestnavArbeidsplassenCVProxy())) diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java index 86a118efec9..c29e9a91726 100644 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java @@ -51,6 +51,7 @@ public class Consumers { private ServerProperties testnavOrganisasjonService; private ServerProperties testnavPdlForvalter; private ServerProperties testnavPensjonTestdataFacadeProxy; + private ServerProperties testnavPersonOrganisasjonTilgangService; private ServerProperties testnavPersonSearchService; private ServerProperties testnavPersonService; private ServerProperties testnavSigrunstubProxy; diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/Altinn3PersonOrganisasjonTilgangConsumer.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/Altinn3PersonOrganisasjonTilgangConsumer.java deleted file mode 100644 index 50a38ef30f7..00000000000 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/Altinn3PersonOrganisasjonTilgangConsumer.java +++ /dev/null @@ -1,66 +0,0 @@ -package no.nav.dolly.web.consumers; - -import lombok.extern.slf4j.Slf4j; -import no.nav.dolly.web.config.Consumers; -import no.nav.dolly.web.consumers.command.PostPersonOrganisasjonTilgangCommand; -import no.nav.dolly.web.service.AccessService; -import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO; -import no.nav.testnav.libs.reactivesecurity.action.GetAuthenticatedUserId; -import no.nav.testnav.libs.securitycore.domain.ServerProperties; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.reactive.function.client.WebClientResponseException; -import org.springframework.web.server.ServerWebExchange; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -@Slf4j -@Component -public class Altinn3PersonOrganisasjonTilgangConsumer { - - private final WebClient webClient; - private final ServerProperties serverProperties; - private final AccessService accessService; - private final GetAuthenticatedUserId getAuthenticatedUserId; - - public Altinn3PersonOrganisasjonTilgangConsumer( - Consumers consumers, - AccessService accessService, - WebClient.Builder webClientBuilder, - GetAuthenticatedUserId getAuthenticatedUserId) { - - this.accessService = accessService; - serverProperties = consumers.getTestnavAltinn3TilgangService(); - - this.webClient = webClientBuilder - .baseUrl(serverProperties.getUrl()) - .build(); - this.getAuthenticatedUserId = getAuthenticatedUserId; - } - - public Mono hasAccess(String organisasjonsnummer, ServerWebExchange exchange) { - - return getAuthenticatedUserId - .call() - .flatMap(userId -> accessService.getAccessToken(serverProperties, exchange) - .flatMapMany(accessToken -> new PostPersonOrganisasjonTilgangCommand(webClient, userId, accessToken).call()) - .filter(organisasjonDTO -> organisasjonDTO.getOrganisasjonsnummer().equals(organisasjonsnummer)) - .onErrorResume( - WebClientResponseException.class::isInstance, - throwable -> { - log.warn("Person har ikke tilgang til organisasjon {}.", organisasjonsnummer); - return Mono.empty(); - }) - .reduce(Boolean.FALSE, (acc, value) -> Boolean.TRUE)); - } - - public Flux getOrganisasjoner(ServerWebExchange exchange) { - - return getAuthenticatedUserId - .call() - .flatMapMany(userId -> - accessService.getAccessToken(serverProperties, exchange) - .flatMapMany(accessToken -> new PostPersonOrganisasjonTilgangCommand(webClient, userId, accessToken).call())); - } -} - diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/PersonOrganisasjonTilgangConsumer.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/PersonOrganisasjonTilgangConsumer.java new file mode 100644 index 00000000000..cec7481322b --- /dev/null +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/PersonOrganisasjonTilgangConsumer.java @@ -0,0 +1,62 @@ +package no.nav.dolly.web.consumers; + +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import no.nav.dolly.web.config.Consumers; +import no.nav.dolly.web.consumers.command.GetPersonOrganisasjonTilgangCommand; +import no.nav.dolly.web.service.AccessService; +import no.nav.testnav.libs.securitycore.domain.ServerProperties; +import org.springframework.http.MediaType; +import org.springframework.http.codec.json.Jackson2JsonDecoder; +import org.springframework.http.codec.json.Jackson2JsonEncoder; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.ExchangeStrategies; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.reactive.function.client.WebClientResponseException; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +@Slf4j +@Component +public class PersonOrganisasjonTilgangConsumer { + private final WebClient webClient; + private final ServerProperties serverProperties; + + private final AccessService accessService; + + public PersonOrganisasjonTilgangConsumer( + Consumers consumers, + AccessService accessService, + ObjectMapper objectMapper, + WebClient.Builder webClientBuilder) { + + this.accessService = accessService; + serverProperties = consumers.getTestnavPersonOrganisasjonTilgangService(); + ExchangeStrategies jacksonStrategy = ExchangeStrategies.builder() + .codecs(config -> { + config.defaultCodecs() + .jackson2JsonEncoder(new Jackson2JsonEncoder(objectMapper, MediaType.APPLICATION_JSON)); + config.defaultCodecs() + .jackson2JsonDecoder(new Jackson2JsonDecoder(objectMapper, MediaType.APPLICATION_JSON)); + }).build(); + + this.webClient = webClientBuilder + .exchangeStrategies(jacksonStrategy) + .baseUrl(serverProperties.getUrl()) + .build(); + } + + public Mono hasAccess(String organisasjonsnummer, ServerWebExchange exchange) { + return accessService.getAccessToken(serverProperties, exchange) + .flatMap(accessToken -> new GetPersonOrganisasjonTilgangCommand(webClient, accessToken, organisasjonsnummer).call()) + .onErrorResume( + WebClientResponseException.class::isInstance, + throwable -> { + log.warn("Person har ikke tilgang til organisasjon {}.", organisasjonsnummer); + return Mono.empty(); + }) + .flatMap(value -> Mono.just(true)) + .switchIfEmpty(Mono.just(false)); + } +} + diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/command/PostPersonOrganisasjonTilgangCommand.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/command/GetPersonOrganisasjonTilgangCommand.java similarity index 59% rename from apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/command/PostPersonOrganisasjonTilgangCommand.java rename to apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/command/GetPersonOrganisasjonTilgangCommand.java index 7b7e5ece269..3bdfb86c837 100644 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/command/PostPersonOrganisasjonTilgangCommand.java +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/command/GetPersonOrganisasjonTilgangCommand.java @@ -2,12 +2,11 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import no.nav.dolly.web.consumers.dto.AltinnBrukerRequest; -import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO; +import no.nav.dolly.web.consumers.dto.OrganisasjonDTO; import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; import reactor.util.retry.Retry; import java.time.Duration; @@ -15,24 +14,21 @@ @Slf4j @RequiredArgsConstructor -public class PostPersonOrganisasjonTilgangCommand implements Callable> { - +public class GetPersonOrganisasjonTilgangCommand implements Callable> { private final WebClient webClient; - private final String ident; private final String token; + private final String organisasjonsnummer; @Override - public Flux call() { - + public Mono call() { return webClient - .post() - .uri(builder -> builder.path("/api/v1/brukertilgang").build()) + .get() + .uri(builder -> builder.path("/api/v1/person/organisasjoner/{organisasjonsnummer}").build(organisasjonsnummer)) .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) - .bodyValue(new AltinnBrukerRequest(ident)) .retrieve() - .bodyToFlux(OrganisasjonDTO.class) - .doOnError(error -> log.error("Feilet å hente organisasjon, status: {}, feilmelding: {}", - WebClientFilter.getStatus(error), + .bodyToMono(OrganisasjonDTO.class) + .doOnError(error -> log.error("Feilet å hente organisasjon, status: {}, feilmelding: ", + WebClientFilter.getMessage(error), WebClientFilter.getMessage(error), error)) .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/dto/AltinnBrukerRequest.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/dto/AltinnBrukerRequest.java deleted file mode 100644 index 91dbb8b2a03..00000000000 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/dto/AltinnBrukerRequest.java +++ /dev/null @@ -1,11 +0,0 @@ -package no.nav.dolly.web.consumers.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class AltinnBrukerRequest { - - private String ident; -} diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/dto/OrganisasjonDTO.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/dto/OrganisasjonDTO.java new file mode 100644 index 00000000000..fdd85cd2839 --- /dev/null +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/dto/OrganisasjonDTO.java @@ -0,0 +1,12 @@ +package no.nav.dolly.web.consumers.dto; + +import java.time.LocalDateTime; + +public record OrganisasjonDTO( + String navn, + String orgnisasjonsnummer, + String orgnisasjonsfrom, + LocalDateTime gyldigTil +) { +} + diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/provider/web/BrukerTilgangController.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/provider/web/BrukerTilgangController.java deleted file mode 100644 index 829b41b4fab..00000000000 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/provider/web/BrukerTilgangController.java +++ /dev/null @@ -1,29 +0,0 @@ -package no.nav.dolly.web.provider.web; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.dolly.web.consumers.Altinn3PersonOrganisasjonTilgangConsumer; -import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.server.ServerWebExchange; -import reactor.core.publisher.Mono; - -import java.util.List; - -@Slf4j -@RestController -@RequestMapping("/altinn") -@RequiredArgsConstructor -public class BrukerTilgangController { - - private final Altinn3PersonOrganisasjonTilgangConsumer altinn3PersonOrganisasjonTilgangConsumer; - - @GetMapping("/organisasjoner") - public Mono> getOrganisasjoner(ServerWebExchange exchange) { - - return altinn3PersonOrganisasjonTilgangConsumer.getOrganisasjoner(exchange) - .collectList(); - } -} diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/provider/web/SessionController.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/provider/web/SessionController.java index f6222576b25..0652790796c 100644 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/provider/web/SessionController.java +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/provider/web/SessionController.java @@ -2,7 +2,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import no.nav.dolly.web.consumers.Altinn3PersonOrganisasjonTilgangConsumer; +import no.nav.dolly.web.consumers.PersonOrganisasjonTilgangConsumer; import no.nav.dolly.web.service.BrukerService; import no.nav.testnav.libs.securitycore.config.UserSessionConstant; import org.springframework.http.HttpStatus; @@ -24,7 +24,7 @@ public class SessionController { private final BrukerService brukerService; - private final Altinn3PersonOrganisasjonTilgangConsumer altinn3PersonOrganisasjonTilgangConsumer; + private final PersonOrganisasjonTilgangConsumer personOrganisasjonTilgangConsumer; /** * Ping endepunkt for aa holde sessionen aapen. @@ -44,8 +44,7 @@ public Mono> delete(ServerWebExchange exchange) { @PutMapping("/user") public Mono> addUserToSession(@RequestParam String organisasjonsnummer, ServerWebExchange exchange) { - - return altinn3PersonOrganisasjonTilgangConsumer + return personOrganisasjonTilgangConsumer .hasAccess(organisasjonsnummer, exchange) .doOnError(e -> log.error("Feil ved sjekk av tilgang til org {}", organisasjonsnummer, e)) .flatMap(hasAccess -> { diff --git a/apps/dolly-frontend/src/main/js/playwright/mocks/BasicMocks.tsx b/apps/dolly-frontend/src/main/js/playwright/mocks/BasicMocks.tsx index ce86904ffba..7518f066e45 100644 --- a/apps/dolly-frontend/src/main/js/playwright/mocks/BasicMocks.tsx +++ b/apps/dolly-frontend/src/main/js/playwright/mocks/BasicMocks.tsx @@ -23,7 +23,8 @@ export const personOrgTilgangMock = [ { navn: 'testytest', organisasjonsnummer: '12345678', - organisasjonsform: 'BEDR', + organisasjonsfrom: 'BEDR', + gyldigTil: '2100-10-10T10:10:10.100Z', }, ] diff --git a/apps/dolly-frontend/src/main/js/playwright/tests/Bankid.spec.ts b/apps/dolly-frontend/src/main/js/playwright/tests/Bankid.spec.ts index f832c6a7883..10d86341dca 100644 --- a/apps/dolly-frontend/src/main/js/playwright/tests/Bankid.spec.ts +++ b/apps/dolly-frontend/src/main/js/playwright/tests/Bankid.spec.ts @@ -11,7 +11,7 @@ test.describe('Bankid testing', () => { headers: { 'content-type': 'application/json' }, }) }) - await page.route(new RegExp(/altinn\/organisasjoner/), async (route) => { + await page.route(new RegExp(/testnav-person-organisasjon-tilgang-service/), async (route) => { await route.fulfill({ status: 200, body: JSON.stringify(personOrgTilgangMock), diff --git a/apps/dolly-frontend/src/main/js/proxy-routes.json b/apps/dolly-frontend/src/main/js/proxy-routes.json index ea55ec091c7..2b7e1cf21bb 100644 --- a/apps/dolly-frontend/src/main/js/proxy-routes.json +++ b/apps/dolly-frontend/src/main/js/proxy-routes.json @@ -29,10 +29,6 @@ "/session/user": { "changeOrigin": false }, - "/altinn/organisasjoner": { - "target": "http://localhost:8020", - "secure": false - }, "/testnav-organisasjon-faste-data-service/api": { "changeOrigin": true }, @@ -117,6 +113,9 @@ "/testnav-person-search-service/api": { "changeOrigin": true }, + "/testnav-person-organisasjon-tilgang-service/api": { + "changeOrigin": true + }, "/testnav-pdl-forvalter/api": { "changeOrigin": true }, diff --git a/apps/dolly-frontend/src/main/js/src/service/services/personOrganisasjonTilgang/PersonOrganisasjonTilgangService.tsx b/apps/dolly-frontend/src/main/js/src/service/services/personOrganisasjonTilgang/PersonOrganisasjonTilgangService.tsx index e079958b6b3..c67a1f009c7 100644 --- a/apps/dolly-frontend/src/main/js/src/service/services/personOrganisasjonTilgang/PersonOrganisasjonTilgangService.tsx +++ b/apps/dolly-frontend/src/main/js/src/service/services/personOrganisasjonTilgang/PersonOrganisasjonTilgangService.tsx @@ -1,7 +1,8 @@ import Request from '@/service/services/Request' import logoutBruker from '@/components/utlogging/logoutBruker' -const personOrgTilgangServiceUrl = '/altinn/organisasjoner' +const personOrgTilgangServiceUrl = + '/testnav-person-organisasjon-tilgang-service/api/v1/person/organisasjoner' export default { getOrganisasjoner() { @@ -14,5 +15,5 @@ export default { .then((response) => { return response }) - } + }, } diff --git a/apps/dolly-frontend/src/main/js/src/utils/hooks/useOrganisasjonTilgang.tsx b/apps/dolly-frontend/src/main/js/src/utils/hooks/useOrganisasjonTilgang.tsx index 47969f3c8eb..98f8d78bfb6 100644 --- a/apps/dolly-frontend/src/main/js/src/utils/hooks/useOrganisasjonTilgang.tsx +++ b/apps/dolly-frontend/src/main/js/src/utils/hooks/useOrganisasjonTilgang.tsx @@ -3,7 +3,7 @@ import { fetcher } from '@/api' import { useBrukerProfil } from '@/utils/hooks/useBruker' const getOrganisasjonMiljoeUrl = (orgnummer: string) => - `/testnav-altinn3-tilgang-service/api/v1/miljoer/organisasjon/${orgnummer}` + `/testnav-altinn3-tilgang-service/api/v1/miljoer/organisasjon/orgnummer?orgnummer=${orgnummer}` const organisasjonTilgangUrl = `/testnav-altinn3-tilgang-service/api/v1/organisasjoner` diff --git a/apps/dolly-frontend/src/main/resources/application-local.yml b/apps/dolly-frontend/src/main/resources/application-local.yml index 48b781833ba..be0739b2cf1 100644 --- a/apps/dolly-frontend/src/main/resources/application-local.yml +++ b/apps/dolly-frontend/src/main/resources/application-local.yml @@ -41,6 +41,9 @@ consumers: testnav-varslinger-service: name: testnav-varslinger-service-dev url: http://testnav-varslinger-service-dev.intern.dev.nav.no + testnav-person-organisasjon-tilgang-service: + name: testnav-person-organisasjon-tilgang-service-dev + url: https://testnav-person-organisasjon-tilgang-service.intern.dev.nav.no oppsummeringsdokument-service: url: https://testnav-oppsummeringsdokument-service.intern.dev.nav.no testnav-bruker-service: diff --git a/apps/dolly-frontend/src/main/resources/application.yml b/apps/dolly-frontend/src/main/resources/application.yml index 1731e1a42b7..9653c61db58 100644 --- a/apps/dolly-frontend/src/main/resources/application.yml +++ b/apps/dolly-frontend/src/main/resources/application.yml @@ -155,6 +155,11 @@ consumers: namespace: dolly name: testnorge-tilbakemelding-api url: http://testnorge-tilbakemelding-api.dolly.svc.cluster.local + testnav-person-organisasjon-tilgang-service: + cluster: dev-gcp + namespace: dolly + name: testnav-person-organisasjon-tilgang-service + url: http://testnav-person-organisasjon-tilgang-service.dolly.svc.cluster.local testnav-bruker-service: cluster: dev-gcp namespace: dolly diff --git a/apps/dolly-frontend/src/main/resources/logback-spring.xml b/apps/dolly-frontend/src/main/resources/logback-spring.xml index b80ca79b071..966dbc796b2 100644 --- a/apps/dolly-frontend/src/main/resources/logback-spring.xml +++ b/apps/dolly-frontend/src/main/resources/logback-spring.xml @@ -3,9 +3,17 @@ - -1 - true - - + + true + 10280 + 20 + ^sun\.reflect\..*\.invoke + ^net\.sf\.cglib\.proxy\.MethodProxy\.invoke + java\.util\.concurrent\..* + org\.apache\.catalina\..* + org\.apache\.coyote\..* + org\.apache\.tomcat\..* + diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/altinn3/v1/OrganisasjonDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/altinn3/v1/OrganisasjonDTO.java deleted file mode 100644 index 725ba98dfb4..00000000000 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/altinn3/v1/OrganisasjonDTO.java +++ /dev/null @@ -1,17 +0,0 @@ -package no.nav.testnav.libs.dto.altinn3.v1; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class OrganisasjonDTO { - - private String navn; - private String organisasjonsnummer; - private String organisasjonsform; -} \ No newline at end of file diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/altinn3/v1/PersonDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/altinn3/v1/PersonDTO.java deleted file mode 100644 index c5a91530fda..00000000000 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/altinn3/v1/PersonDTO.java +++ /dev/null @@ -1,32 +0,0 @@ -package no.nav.testnav.libs.dto.altinn3.v1; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class PersonDTO { - - private String ident; - private List organisasjoner; - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - public static class OrganisasjonDTO { - - private String navn; - private String organisasjonsnummer; - private String organisasjonsform; - private Boolean hasAltinnDollyTilgang; - private Boolean hasDollyOrganisasjonTilgang; - private String melding; - } -} diff --git a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedResourceServerType.java b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedResourceServerType.java index b6b72f5802d..a3596f957d2 100644 --- a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedResourceServerType.java +++ b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedResourceServerType.java @@ -2,7 +2,6 @@ import lombok.RequiredArgsConstructor; import no.nav.testnav.libs.securitycore.domain.ResourceServerType; -import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; import org.springframework.stereotype.Component; import reactor.core.publisher.Mono; @@ -31,18 +30,11 @@ private Optional getResourceTypeForm(JwtAuthenticationToken @Override public Mono call() { - return getJwtAuthenticationToken() .onErrorResume(JwtResolverException.class, throwable -> Mono.empty()) - .flatMap(authentication -> { - if (authentication instanceof JwtAuthenticationToken jwtAuthenticationTokentoken) { - return getResourceTypeForm(jwtAuthenticationTokentoken) - .map(Mono::just) - .orElseGet(Mono::empty); - } else if (authentication instanceof OAuth2AuthenticationToken) { - return Mono.just(ResourceServerType.TOKEN_X); - } - return Mono.empty(); - }); + .flatMap(token -> getResourceTypeForm(token) + .map(Mono::just) + .orElseGet(Mono::empty) + ); } } diff --git a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedToken.java b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedToken.java index 0a5d4e957fd..bc5f09c71f3 100644 --- a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedToken.java +++ b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedToken.java @@ -1,18 +1,11 @@ package no.nav.testnav.libs.reactivesecurity.action; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.testnav.libs.securitycore.domain.Token; -import org.springframework.http.HttpStatus; -import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; -import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; import org.springframework.stereotype.Component; -import org.springframework.web.server.ResponseStatusException; import reactor.core.publisher.Mono; -import java.time.Instant; import java.util.concurrent.Callable; @Component @@ -28,21 +21,13 @@ public Mono call() { .call() .flatMap(serverType -> switch (serverType) { case TOKEN_X -> getJwtAuthenticationToken() - .map(OAuth2AuthenticationToken.class::cast) - .handle((oauth2, sink) -> { - try { - sink.next(Token.builder() - .clientCredentials(false) - .userId(oauth2.getPrincipal().getAttributes().get("pid").toString()) - .accessTokenValue(new ObjectMapper().writeValueAsString(oauth2)) - .expiresAt((Instant) oauth2.getPrincipal().getAttributes().get("exp")) - .build()); - } catch (JsonProcessingException e) { - sink.error(new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "Feilet å konvertere token to string", e)); - } - }); + .map(jwt -> Token.builder() + .clientCredentials(false) + .userId(jwt.getTokenAttributes().get("pid").toString()) + .accessTokenValue(jwt.getToken().getTokenValue()) + .expiresAt(jwt.getToken().getExpiresAt()) + .build()); case AZURE_AD -> getJwtAuthenticationToken() - .map(JwtAuthenticationToken.class::cast) .map(jwt -> Token.builder() .clientCredentials(jwt.getTokenAttributes().get("oid").equals(jwt.getTokenAttributes().get("sub"))) .userId(jwt.getTokenAttributes().get("oid").toString()) diff --git a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedUserId.java b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedUserId.java index b0636ee9c7d..63193f44bcc 100644 --- a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedUserId.java +++ b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedUserId.java @@ -1,15 +1,11 @@ package no.nav.testnav.libs.reactivesecurity.action; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; -import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; import org.springframework.stereotype.Component; import reactor.core.publisher.Mono; import java.util.concurrent.Callable; -@Slf4j @Component @RequiredArgsConstructor public class GetAuthenticatedUserId extends JwtResolver implements Callable> { @@ -27,20 +23,6 @@ public Mono call() { } private Mono getTokenAttribute(String attribute) { - - return getJwtAuthenticationToken() - .map(authentication -> - - switch (authentication) { - - case JwtAuthenticationToken jwtAuthenticationToken -> - jwtAuthenticationToken.getTokenAttributes().get(attribute).toString(); - - case OAuth2AuthenticationToken oauth2AuthenticationToken -> - oauth2AuthenticationToken.getPrincipal().getAttributes().get("pid").toString(); - - default -> ""; - } - ); + return getJwtAuthenticationToken().map(value -> value.getTokenAttributes().get(attribute).toString()); } } diff --git a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/JwtResolver.java b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/JwtResolver.java index 5b19c554aa1..6f360743c2f 100644 --- a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/JwtResolver.java +++ b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/JwtResolver.java @@ -1,19 +1,34 @@ package no.nav.testnav.libs.reactivesecurity.action; import lombok.extern.slf4j.Slf4j; -import org.springframework.security.core.Authentication; +import org.springframework.security.authentication.CredentialsExpiredException; import org.springframework.security.core.context.ReactiveSecurityContextHolder; import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.oauth2.jwt.Jwt; +import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; import reactor.core.publisher.Mono; +import java.time.Instant; +import java.time.ZonedDateTime; + @Slf4j +@SuppressWarnings("java:S1610") abstract class JwtResolver { - Mono getJwtAuthenticationToken() { + Mono getJwtAuthenticationToken() { return ReactiveSecurityContextHolder .getContext() .switchIfEmpty(Mono.error(new JwtResolverException("ReactiveSecurityContext is empty"))) - .doOnNext(context -> log.info("JwtResolver context.authentication {} {}", context.getAuthentication().getClass().getCanonicalName(), context.getAuthentication())) - .map(SecurityContext::getAuthentication); + .map(SecurityContext::getAuthentication) + .map(JwtAuthenticationToken.class::cast) + .doOnError(throwable -> log.warn("Klarte ikke hente Jwt Auth Token", throwable)) + .doOnSuccess(jwtAuthenticationToken -> { + Jwt credentials = (Jwt) jwtAuthenticationToken.getCredentials(); + Instant expiresAt = credentials.getExpiresAt(); + if (expiresAt == null || expiresAt.isBefore(ZonedDateTime.now().toInstant().plusSeconds(120))) { + throw new CredentialsExpiredException("Jwt er utløpt eller utløper innen kort tid"); + } + }); } + } diff --git a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/Oauth2Resolver.java b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/Oauth2Resolver.java deleted file mode 100644 index 68dac390a55..00000000000 --- a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/Oauth2Resolver.java +++ /dev/null @@ -1,35 +0,0 @@ -package no.nav.testnav.libs.reactivesecurity.action; - -import lombok.experimental.UtilityClass; -import lombok.extern.slf4j.Slf4j; -import org.springframework.security.authentication.CredentialsExpiredException; -import org.springframework.security.core.context.ReactiveSecurityContextHolder; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; -import org.springframework.security.oauth2.jwt.Jwt; -import reactor.core.publisher.Mono; - -import java.time.Instant; -import java.time.ZonedDateTime; - -@Slf4j -@UtilityClass -public class Oauth2Resolver { - - public static Mono getOauth2AuthenticationToken() { - return ReactiveSecurityContextHolder - .getContext() - .switchIfEmpty(Mono.error(new JwtResolverException("ReactiveSecurityContext is empty"))) - .doOnNext(context -> log.info("Oauth2Resolver context.authentication {} {}", context.getAuthentication().getClass().getCanonicalName(), context.getAuthentication())) - .map(SecurityContext::getAuthentication) - .map(OAuth2AuthenticationToken.class::cast) - .doOnError(throwable -> log.warn("Klarte ikke hente Jwt Auth Token", throwable)) - .doOnSuccess(jwtAuthenticationToken -> { - Jwt credentials = (Jwt) jwtAuthenticationToken.getCredentials(); - Instant expiresAt = credentials.getExpiresAt(); - if (expiresAt == null || expiresAt.isBefore(ZonedDateTime.now().toInstant().plusSeconds(120))) { - throw new CredentialsExpiredException("Jwt er utløpt eller utløper innen kort tid"); - } - }); - } -} From d2cc3246aedbc5f1ee022cc336be862e111826d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristen=20H=C3=A6rum?= Date: Fri, 20 Dec 2024 12:02:37 +0100 Subject: [PATCH 53/59] Feature/landingsside for bankid palogging som feiler (#3706) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rettet flere bugs ved bankID pålogging --- .github/workflows/integration-tests.yml | 10 +- apps/altinn3-tilgang-service/README.md | 1 + apps/altinn3-tilgang-service/build.gradle | 1 + apps/altinn3-tilgang-service/config.dev.yml | 4 +- apps/altinn3-tilgang-service/config.prod.yml | 5 +- .../docker-compose.yml | 18 +++ apps/altinn3-tilgang-service/settings.gradle | 2 +- ...tinn3TilgangServiceApplicationStarter.java | 2 +- .../consumer/altinn/AltinnConsumer.java | 53 ++++++--- .../CreateAccessListeMemberCommand.java | 10 +- .../DeleteAccessListMemberCommand.java | 8 +- .../command/GetAccessListMembersCommand.java | 8 +- .../command/GetAuthorizedPartiesCommand.java | 40 +++++++ .../consumer/altinn/dto/AccessToken.java | 0 ....java => AltinnAccessListResponseDTO.java} | 2 +- .../AltinnAuthorizedPartiesRequestDTO.java | 18 +++ .../altinn/dto/AuthorizedPartyDTO.java | 42 +++++++ .../consumer/brreg/BrregConsumer.java | 2 +- .../domain/PersonRequest.java | 13 +++ .../AltinnBrukerTilgangController.java | 33 ++++++ ... AltinnOrganisasjonTilgangController.java} | 9 +- .../service/AltinnBrukerTilgangService.java | 108 ++++++++++++++++++ ... => AltinnOrganisasjonTilgangService.java} | 4 +- .../service/MiljoerOversiktService.java | 14 +-- .../src/main/resources/application-local.yml | 6 +- .../src/main/resources/application.yml | 3 +- apps/bruker-service/config.test.yml | 3 +- apps/bruker-service/config.yml | 5 +- .../apps/brukerservice/config/Consumers.java | 10 +- .../brukerservice/config/OpenApiConfig.java | 19 ++- .../PersonOrganisasjonTilgangConsumer.java | 39 +++---- ...mand.java => GetBrukertilgangCommand.java} | 22 ++-- .../consumer/dto/AltinnBrukerRequest.java | 11 ++ .../consumer/dto/OrganisasjonDTO.java | 4 - .../brukerservice/domain/Organisasjon.java | 34 +++--- .../src/main/resources/application-dev.yml | 13 ++- .../src/main/resources/application-local.yml | 9 +- .../src/main/resources/application-prod.yml | 7 ++ .../src/main/resources/application.yml | 16 +-- apps/dolly-frontend/config.idporten.yml | 5 +- apps/dolly-frontend/config.test.yml | 2 - apps/dolly-frontend/config.unstable.yml | 2 - apps/dolly-frontend/config.yml | 2 - .../web/DollyFrontendApplicationStarter.java | 4 +- .../no/nav/dolly/web/config/Consumers.java | 1 - ...inn3PersonOrganisasjonTilgangConsumer.java | 66 +++++++++++ .../PersonOrganisasjonTilgangConsumer.java | 62 ---------- ...PostPersonOrganisasjonTilgangCommand.java} | 24 ++-- .../consumers/dto/AltinnBrukerRequest.java | 11 ++ .../web/consumers/dto/OrganisasjonDTO.java | 12 -- .../provider/web/BrukerTilgangController.java | 29 +++++ .../web/provider/web/SessionController.java | 7 +- .../main/js/playwright/mocks/BasicMocks.tsx | 3 +- .../main/js/playwright/tests/Bankid.spec.ts | 2 +- .../src/main/js/proxy-routes.json | 7 +- .../PersonOrganisasjonTilgangService.tsx | 5 +- .../utils/hooks/useOrganisasjonTilgang.tsx | 2 +- .../src/main/resources/application-local.yml | 3 - .../src/main/resources/application.yml | 5 - .../src/main/resources/logback-spring.xml | 14 +-- .../libs/dto/altinn3/v1/OrganisasjonDTO.java | 17 +++ .../libs/dto/altinn3/v1/PersonDTO.java | 32 ++++++ .../GetAuthenticatedResourceServerType.java | 19 ++- .../action/GetAuthenticatedToken.java | 9 ++ .../action/GetAuthenticatedUserId.java | 20 +++- .../reactivesecurity/action/JwtResolver.java | 23 +--- .../action/Oauth2Resolver.java | 35 ++++++ proxies/altinn3-tilgang-proxy/config.yml | 3 +- 68 files changed, 722 insertions(+), 312 deletions(-) create mode 100644 apps/altinn3-tilgang-service/docker-compose.yml create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAuthorizedPartiesCommand.java delete mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AccessToken.java rename apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/{AltinnResponseDTO.java => AltinnAccessListResponseDTO.java} (95%) create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnAuthorizedPartiesRequestDTO.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AuthorizedPartyDTO.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/domain/PersonRequest.java create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnBrukerTilgangController.java rename apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/{AltinnTilgangController.java => AltinnOrganisasjonTilgangController.java} (84%) create mode 100644 apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnBrukerTilgangService.java rename apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/{AltinnTilgangService.java => AltinnOrganisasjonTilgangService.java} (97%) rename apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/command/{GetOrganisasjonCommand.java => GetBrukertilgangCommand.java} (53%) create mode 100644 apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/dto/AltinnBrukerRequest.java delete mode 100644 apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/dto/OrganisasjonDTO.java create mode 100644 apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/Altinn3PersonOrganisasjonTilgangConsumer.java delete mode 100644 apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/PersonOrganisasjonTilgangConsumer.java rename apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/command/{GetPersonOrganisasjonTilgangCommand.java => PostPersonOrganisasjonTilgangCommand.java} (59%) create mode 100644 apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/dto/AltinnBrukerRequest.java delete mode 100644 apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/dto/OrganisasjonDTO.java create mode 100644 apps/dolly-frontend/src/main/java/no/nav/dolly/web/provider/web/BrukerTilgangController.java create mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/altinn3/v1/OrganisasjonDTO.java create mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/altinn3/v1/PersonDTO.java create mode 100644 libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/Oauth2Resolver.java diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index 16c25d9ff37..9351999c60b 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -3,7 +3,6 @@ on: push: paths: - 'apps/bruker-service/**' - - 'apps/person-organisasjon-tilgang-service/**' workflow_dispatch: jobs: @@ -14,11 +13,4 @@ jobs: working-directory: 'apps/bruker-service/' healthcheck: 'http://localhost:8002/internal/isAlive' secrets: - NAV_TOKEN: ${{ secrets.NAV_TOKEN }} - person-organisasjon-tilgang-service: - if: github.event.pull_request.draft == false - uses: ./.github/workflows/common.integration-test.yml - with: - working-directory: 'apps/person-organisasjon-tilgang-service/' - healthcheck: 'http://localhost:8001/internal/isAlive' - secrets: inherit \ No newline at end of file + NAV_TOKEN: ${{ secrets.NAV_TOKEN }} \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/README.md b/apps/altinn3-tilgang-service/README.md index ad8b6f4dd72..baad90dca7e 100644 --- a/apps/altinn3-tilgang-service/README.md +++ b/apps/altinn3-tilgang-service/README.md @@ -10,3 +10,4 @@ Swagger finnes under [/swagger-ui.html](https://testnav-altinn3-tilgang-service. ## Lokal kjøring * [Generelt.](../../docs/local_general.md) * [Secret Manager.](../../docs/local_secretmanager.md) +* [Database i GCP.](../../docs/gcp_db.md) diff --git a/apps/altinn3-tilgang-service/build.gradle b/apps/altinn3-tilgang-service/build.gradle index 1ea7ae40843..cf1162f4ca0 100644 --- a/apps/altinn3-tilgang-service/build.gradle +++ b/apps/altinn3-tilgang-service/build.gradle @@ -10,6 +10,7 @@ sonarqube { } dependencies { + implementation "no.nav.testnav.libs:data-transfer-objects" implementation "no.nav.testnav.libs:reactive-core" implementation "no.nav.testnav.libs:reactive-security" diff --git a/apps/altinn3-tilgang-service/config.dev.yml b/apps/altinn3-tilgang-service/config.dev.yml index b9d45fba561..2c820f19977 100644 --- a/apps/altinn3-tilgang-service/config.dev.yml +++ b/apps/altinn3-tilgang-service/config.dev.yml @@ -23,15 +23,15 @@ spec: consumes: - name: altinn:resourceregistry/accesslist.read - name: altinn:resourceregistry/accesslist.write + - name: altinn:accessmanagement/authorizedparties.resourceowner accessPolicy: inbound: rules: - - application: dolly-frontend - application: dolly-frontend-dev - application: dolly-frontend-dev-unstable - - application: dolly-idporten - application: team-dolly-lokal-app - application: testnav-oversikt-frontend + - application: testnav-bruker-service-dev outbound: external: - host: platform.tt02.altinn.no diff --git a/apps/altinn3-tilgang-service/config.prod.yml b/apps/altinn3-tilgang-service/config.prod.yml index f24efb9735e..ed0e4aff1d6 100644 --- a/apps/altinn3-tilgang-service/config.prod.yml +++ b/apps/altinn3-tilgang-service/config.prod.yml @@ -23,15 +23,12 @@ spec: consumes: - name: altinn:resourceregistry/accesslist.read - name: altinn:resourceregistry/accesslist.write + - name: altinn:accessmanagement/authorizedparties.resourceowner accessPolicy: inbound: rules: - application: dolly-frontend cluster: dev-gcp - - application: dolly-frontend-dev - cluster: dev-gcp - - application: dolly-frontend-dev-unstable - cluster: dev-gcp - application: dolly-idporten cluster: dev-gcp - application: team-dolly-lokal-app diff --git a/apps/altinn3-tilgang-service/docker-compose.yml b/apps/altinn3-tilgang-service/docker-compose.yml new file mode 100644 index 00000000000..b0eb57bd211 --- /dev/null +++ b/apps/altinn3-tilgang-service/docker-compose.yml @@ -0,0 +1,18 @@ +services: + + cloud_sql_proxy: + image: gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.14.2 + network_mode: host + command: + - "dolly-dev-ff83:europe-north1:testnav-altinn3-tilgang-local" + - "--credentials-file=/application_default_credentials.json" + - "--run-connection-test" + volumes: + - type: bind + # Set a variable $DOLLY_APPLICATION_CREDENTIALS. We don't use + # GOOGLE_APPLICATION_CREDENTIALS, as this causes an extra step during login. + # + # - $HOME/.config/gcloud/application_default_credentials.json for Linux/macOS. + # - $APPDATA/gcloud/application_default_credentials.json for Windows. + source: $DOLLY_APPLICATION_CREDENTIALS + target: /application_default_credentials.json \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/settings.gradle b/apps/altinn3-tilgang-service/settings.gradle index e7a413ca6d0..d7e1b8e69d7 100644 --- a/apps/altinn3-tilgang-service/settings.gradle +++ b/apps/altinn3-tilgang-service/settings.gradle @@ -6,9 +6,9 @@ rootProject.name = 'altinn3-tilgang-service' includeBuild "../../plugins/java" +includeBuild '../../libs/data-transfer-objects' includeBuild '../../libs/reactive-core' includeBuild '../../libs/reactive-security' -includeBuild '../../libs/vault' develocity { buildScan { diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/Altinn3TilgangServiceApplicationStarter.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/Altinn3TilgangServiceApplicationStarter.java index 15e9ab89905..1f674d70b88 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/Altinn3TilgangServiceApplicationStarter.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/Altinn3TilgangServiceApplicationStarter.java @@ -22,4 +22,4 @@ public class Altinn3TilgangServiceApplicationStarter { public static void main(String[] args) { SpringApplication.run(Altinn3TilgangServiceApplicationStarter.class, args); } -} \ No newline at end of file +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/AltinnConsumer.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/AltinnConsumer.java index ae8f52b3b39..4a6f5de6b53 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/AltinnConsumer.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/AltinnConsumer.java @@ -10,8 +10,11 @@ import no.nav.testnav.altinn3tilgangservice.consumer.altinn.command.CreateAccessListeMemberCommand; import no.nav.testnav.altinn3tilgangservice.consumer.altinn.command.DeleteAccessListMemberCommand; import no.nav.testnav.altinn3tilgangservice.consumer.altinn.command.GetAccessListMembersCommand; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.command.GetAuthorizedPartiesCommand; import no.nav.testnav.altinn3tilgangservice.consumer.altinn.command.GetExchangeTokenCommand; -import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnResponseDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnAccessListResponseDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnAuthorizedPartiesRequestDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AuthorizedPartyDTO; import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.BrregResponseDTO; import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.OrganisasjonCreateDTO; import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.OrganisasjonDeleteDTO; @@ -25,6 +28,7 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -76,7 +80,7 @@ public Flux delete(String organisasjonsnummer) { return Flux.from(getAccessListMembers() .flatMapMany(value -> Flux.fromIterable(value.getData())) - .map(AltinnResponseDTO.AccessListMembershipDTO::getIdentifiers) + .map(AltinnAccessListResponseDTO.AccessListMembershipDTO::getIdentifiers) .collectList() .map(data -> getIdentifier(data, organisasjonsnummer)) .map(identifier -> @@ -96,9 +100,9 @@ public Flux delete(String organisasjonsnummer) { .flatMap(Flux::from); } - public Flux create(String organisasjonsnummer) { + public Mono create(String organisasjonsnummer) { - return maskinportenConsumer.getAccessToken() + return Mono.from(maskinportenConsumer.getAccessToken() .flatMap(this::exchangeToken) .flatMap(exchangeToken -> new CreateAccessListeMemberCommand( webClient, @@ -106,17 +110,17 @@ public Flux create(String organisasjonsnummer) { new OrganisasjonCreateDTO(organisasjonsnummer), altinnConfig).call()) .flatMapMany(response -> - isBlank(response.getFeilmelding()) ? - Flux.fromIterable(response.getData()) - .map(this::getOrgnummer) - .filter(organisasjonsnummer::equals) - .flatMap(brregConsumer::getEnheter) : - Mono.just(BrregResponseDTO.builder() - .organisasjonsnummer(organisasjonsnummer) - .feilmelding(response.getFeilmelding()) - .status(response.getStatus()) - .build())) - .map(response -> mapperFacade.map(response, Organisasjon.class)); + isBlank(response.getFeilmelding()) ? + Flux.fromIterable(response.getData()) + .map(this::getOrgnummer) + .filter(organisasjonsnummer::equals) + .flatMap(brregConsumer::getEnhet) : + Mono.just(BrregResponseDTO.builder() + .organisasjonsnummer(organisasjonsnummer) + .feilmelding(response.getFeilmelding()) + .status(response.getStatus()) + .build())) + .map(response -> mapperFacade.map(response, Organisasjon.class))); } public Flux getOrganisasjoner() { @@ -125,7 +129,18 @@ public Flux getOrganisasjoner() { .flatMapMany(this::convertToOrganisasjon); } - private Mono getAccessListMembers() { + public Flux getAuthorizedParties(String ident) { + + return maskinportenConsumer.getAccessToken() + .flatMap(this::exchangeToken) + .flatMap(exchangeToken -> new GetAuthorizedPartiesCommand(webClient, + new AltinnAuthorizedPartiesRequestDTO(ident), + exchangeToken).call()) + .map(Arrays::asList) + .flatMapIterable(list -> list); + } + + private Mono getAccessListMembers() { return maskinportenConsumer.getAccessToken() .flatMap(this::exchangeToken) @@ -135,11 +150,11 @@ private Mono getAccessListMembers() { altinnConfig).call()); } - private Flux convertToOrganisasjon(AltinnResponseDTO altInnResponse) { + private Flux convertToOrganisasjon(AltinnAccessListResponseDTO altInnResponse) { return Flux.fromIterable(altInnResponse.getData()) .map(this::getOrgnummer) - .flatMap(brregConsumer::getEnheter) + .flatMap(brregConsumer::getEnhet) .map(response -> mapperFacade.map(response, Organisasjon.class)); } @@ -155,7 +170,7 @@ private OrganisasjonDeleteDTO getIdentifier(List data, String organisa } @SneakyThrows - private String getOrgnummer(AltinnResponseDTO.AccessListMembershipDTO data) { + private String getOrgnummer(AltinnAccessListResponseDTO.AccessListMembershipDTO data) { return data.getIdentifiers() .get(ORGANISASJON_ID) diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/CreateAccessListeMemberCommand.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/CreateAccessListeMemberCommand.java index 997a7b65a70..d665fd9723d 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/CreateAccessListeMemberCommand.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/CreateAccessListeMemberCommand.java @@ -3,7 +3,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.testnav.altinn3tilgangservice.config.AltinnConfig; -import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnResponseDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnAccessListResponseDTO; import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.OrganisasjonCreateDTO; import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; @@ -16,7 +16,7 @@ @Slf4j @RequiredArgsConstructor -public class CreateAccessListeMemberCommand implements Callable> { +public class CreateAccessListeMemberCommand implements Callable> { private static final String ALTINN_URL = "/resourceregistry/api/v1/access-lists/{owner}/{identifier}/members"; @@ -27,7 +27,7 @@ public class CreateAccessListeMemberCommand implements Callable call() { + public Mono call() { return webClient .post() @@ -37,14 +37,14 @@ public Mono call() { .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .retrieve() - .bodyToMono(AltinnResponseDTO.class) + .bodyToMono(AltinnAccessListResponseDTO.class) .doOnError(WebClientFilter::logErrorMessage) .doOnSuccess(value -> log.info("Altinn organisasjontilgang opprettet for {}", organisasjon.getData().stream() .map(data -> data.split(":")) .map(data -> data[data.length-1]) .collect(Collectors.joining()))) - .onErrorResume(throwable -> Mono.just(AltinnResponseDTO.builder() + .onErrorResume(throwable -> Mono.just(AltinnAccessListResponseDTO.builder() .status(WebClientFilter.getStatus(throwable)) .feilmelding(WebClientFilter.getMessage(throwable)) .build())); diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/DeleteAccessListMemberCommand.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/DeleteAccessListMemberCommand.java index ddaac4a82da..e685b681507 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/DeleteAccessListMemberCommand.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/DeleteAccessListMemberCommand.java @@ -3,7 +3,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.testnav.altinn3tilgangservice.config.AltinnConfig; -import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnResponseDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnAccessListResponseDTO; import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.OrganisasjonDeleteDTO; import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; @@ -19,7 +19,7 @@ @Slf4j @RequiredArgsConstructor -public class DeleteAccessListMemberCommand implements Callable> { +public class DeleteAccessListMemberCommand implements Callable> { private static final String ALTINN_URL = "/resourceregistry/api/v1/access-lists/{owner}/{identifier}/members"; @@ -30,7 +30,7 @@ public class DeleteAccessListMemberCommand implements Callable call() { + public Mono call() { return webClient .method(HttpMethod.DELETE) @@ -41,7 +41,7 @@ public Mono call() { .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .bodyValue(identifiers) .retrieve() - .bodyToMono(AltinnResponseDTO.class) + .bodyToMono(AltinnAccessListResponseDTO.class) .doOnSuccess(value -> log.info("Altinn organisasjontilgang slettet for {}", identifiers.getData().stream() .filter(data -> data.contains(ORGANISASJON_ID)) diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAccessListMembersCommand.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAccessListMembersCommand.java index 1c615118bf7..19f63d2f8db 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAccessListMembersCommand.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAccessListMembersCommand.java @@ -3,7 +3,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.testnav.altinn3tilgangservice.config.AltinnConfig; -import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnResponseDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnAccessListResponseDTO; import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; @@ -14,7 +14,7 @@ @Slf4j @RequiredArgsConstructor -public class GetAccessListMembersCommand implements Callable> { +public class GetAccessListMembersCommand implements Callable> { private static final String ALTINN_URL = "/resourceregistry/api/v1/access-lists/{owner}/{identifier}/members"; @@ -23,7 +23,7 @@ public class GetAccessListMembersCommand implements Callable call() { + public Mono call() { return webClient .get() @@ -32,7 +32,7 @@ public Mono call() { .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .retrieve() - .bodyToMono(AltinnResponseDTO.class) + .bodyToMono(AltinnAccessListResponseDTO.class) .doOnError(WebClientFilter::logErrorMessage) .doOnSuccess(value -> log.info("Altinn-tilgang hentet")); } diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAuthorizedPartiesCommand.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAuthorizedPartiesCommand.java new file mode 100644 index 00000000000..d58693bacb2 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAuthorizedPartiesCommand.java @@ -0,0 +1,40 @@ +package no.nav.testnav.altinn3tilgangservice.consumer.altinn.command; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AltinnAuthorizedPartiesRequestDTO; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AuthorizedPartyDTO; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.util.concurrent.Callable; + +@Slf4j +@RequiredArgsConstructor +public class GetAuthorizedPartiesCommand implements Callable> { + + private static final String ALTINN_URL = "/accessmanagement/api/v1/resourceowner/authorizedparties"; + + private final WebClient webClient; + private final AltinnAuthorizedPartiesRequestDTO request; + private final String token; + + @Override + public Mono call() { + + log.info("Spørring på bruker {}", request); + return webClient + .post() + .uri(builder -> builder.path(ALTINN_URL) + .build()) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .bodyValue(request) + .retrieve() + .bodyToMono(AuthorizedPartyDTO[].class) + .doOnError(WebClientFilter::logErrorMessage); + } +} \ No newline at end of file diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AccessToken.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AccessToken.java deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnResponseDTO.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnAccessListResponseDTO.java similarity index 95% rename from apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnResponseDTO.java rename to apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnAccessListResponseDTO.java index 720fec9136f..6521fa55049 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnResponseDTO.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnAccessListResponseDTO.java @@ -17,7 +17,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class AltinnResponseDTO { +public class AltinnAccessListResponseDTO { private List data; private String feilmelding; diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnAuthorizedPartiesRequestDTO.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnAuthorizedPartiesRequestDTO.java new file mode 100644 index 00000000000..7e2eecded37 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AltinnAuthorizedPartiesRequestDTO.java @@ -0,0 +1,18 @@ +package no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto; + +import lombok.Data; + +@Data +public class AltinnAuthorizedPartiesRequestDTO { + + private static final String IDENT_IDENTIFIKATOR = "urn:altinn:person:identifier-no"; + + private String type; + private String value; + + public AltinnAuthorizedPartiesRequestDTO(String ident) { + + this.type = IDENT_IDENTIFIKATOR; + this.value = ident; + } +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AuthorizedPartyDTO.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AuthorizedPartyDTO.java new file mode 100644 index 00000000000..0fe03486d57 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AuthorizedPartyDTO.java @@ -0,0 +1,42 @@ +package no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.List; + +import static java.util.Objects.isNull; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AuthorizedPartyDTO { + + private String name; + private String organizationNumber; + private String unitType; + private Boolean isDeleted; + private List authorizedResources; + private List subunits; + + public List getAuthorizedResources() { + + if (isNull(authorizedResources)) { + authorizedResources = new ArrayList<>(); + } + return authorizedResources; + } + + public List getSubunits() { + + if (isNull(subunits)) { + subunits = new ArrayList<>(); + } + return subunits; + } +} + diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/brreg/BrregConsumer.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/brreg/BrregConsumer.java index 65c7c90466c..bb536729142 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/brreg/BrregConsumer.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/brreg/BrregConsumer.java @@ -19,7 +19,7 @@ public BrregConsumer(WebClient.Builder webClientBuilder) { .build(); } - public Mono getEnheter(String orgnummer) { + public Mono getEnhet(String orgnummer) { return new GetBrregEnheterCommand(webClient, orgnummer).call(); } diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/domain/PersonRequest.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/domain/PersonRequest.java new file mode 100644 index 00000000000..40f9ef759f0 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/domain/PersonRequest.java @@ -0,0 +1,13 @@ +package no.nav.testnav.altinn3tilgangservice.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class PersonRequest { + + private String ident; +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnBrukerTilgangController.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnBrukerTilgangController.java new file mode 100644 index 00000000000..55893774beb --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnBrukerTilgangController.java @@ -0,0 +1,33 @@ +package no.nav.testnav.altinn3tilgangservice.provider; + +import lombok.RequiredArgsConstructor; +import no.nav.testnav.altinn3tilgangservice.domain.PersonRequest; +import no.nav.testnav.altinn3tilgangservice.service.AltinnBrukerTilgangService; +import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO; +import no.nav.testnav.libs.dto.altinn3.v1.PersonDTO; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@RestController +@RequestMapping("/api/v1/brukertilgang") +@RequiredArgsConstructor +public class AltinnBrukerTilgangController { + + private final AltinnBrukerTilgangService brukerTilgangService; + + @PostMapping + public Flux getPersonOrganisasjonTilgang(@RequestBody PersonRequest request) { + + return brukerTilgangService.getPersonOrganisasjonTilgang(request.getIdent()); + } + + @PostMapping("/detaljert") + public Mono getPersonOrganisasjonDetaljertTilgang(@RequestBody PersonRequest request) { + + return brukerTilgangService.getPersonOrganisasjonDetaljertTilgang(request.getIdent()); + } +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnTilgangController.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnOrganisasjonTilgangController.java similarity index 84% rename from apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnTilgangController.java rename to apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnOrganisasjonTilgangController.java index 140f414c701..5c83bf67abd 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnTilgangController.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnOrganisasjonTilgangController.java @@ -4,7 +4,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.testnav.altinn3tilgangservice.domain.OrganisasjonResponse; -import no.nav.testnav.altinn3tilgangservice.service.AltinnTilgangService; +import no.nav.testnav.altinn3tilgangservice.service.AltinnOrganisasjonTilgangService; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -13,6 +13,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; import java.util.Comparator; @@ -20,9 +21,9 @@ @RestController @RequestMapping("/api/v1/organisasjoner") @RequiredArgsConstructor -public class AltinnTilgangController { +public class AltinnOrganisasjonTilgangController { - private final AltinnTilgangService altinnTilgangService; + private final AltinnOrganisasjonTilgangService altinnTilgangService; @GetMapping @Operation(description = "Henter alle organisasjoner med Altinn-tilgang") @@ -34,7 +35,7 @@ public Flux getAll() { @PostMapping("/{organisasjonsnummer}") @Operation(description = "Oppretter Altinn-tilgang for organisasjon") - public Flux create(@PathVariable String organisasjonsnummer, + public Mono create(@PathVariable String organisasjonsnummer, @RequestParam String miljoe) { return altinnTilgangService diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnBrukerTilgangService.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnBrukerTilgangService.java new file mode 100644 index 00000000000..ba468bb4273 --- /dev/null +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnBrukerTilgangService.java @@ -0,0 +1,108 @@ +package no.nav.testnav.altinn3tilgangservice.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.AltinnConsumer; +import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AuthorizedPartyDTO; +import no.nav.testnav.altinn3tilgangservice.domain.Organisasjon; +import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO; +import no.nav.testnav.libs.dto.altinn3.v1.PersonDTO; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.util.function.Tuple2; + +import java.util.List; + +@Slf4j +@Service +@RequiredArgsConstructor +public class AltinnBrukerTilgangService { + + private static final String DOLLY_RESOURCE = "nav_dolly_tilgang-samarbeidspartnere"; + private final AltinnConsumer altinnConsumer; + + public Flux getPersonOrganisasjonTilgang(String ident) { + + return Flux.zip( + altinnConsumer.getAuthorizedParties(ident).collectList(), + altinnConsumer.getOrganisasjoner().collectList()) + .flatMap(this::getOrganisasjon); + } + + private Flux getOrganisasjon(Tuple2, List> organisasjoner) { + + return Flux.fromIterable(organisasjoner.getT1()) + .doOnNext(org -> log.info("Organisasjon {}", org)) + .filter(party -> party.getAuthorizedResources().contains(DOLLY_RESOURCE)) + .filter(party -> organisasjoner.getT2().stream() + .anyMatch(organisasjon -> organisasjon.getOrganisasjonsnummer().equals(party.getOrganizationNumber()))) + .map(part -> OrganisasjonDTO.builder() + .navn(part.getName()) + .organisasjonsnummer(part.getOrganizationNumber()) + .organisasjonsform(part.getUnitType()) + .build()); + } + + public Mono getPersonOrganisasjonDetaljertTilgang(String ident) { + + return Mono.zip( + altinnConsumer.getAuthorizedParties(ident).collectList(), + altinnConsumer.getOrganisasjoner().collectList()) + .flatMapMany(this::getTilpassetOrganisasjon) + .collectList() + .map(organisasjoner -> PersonDTO.builder() + .ident(ident) + .organisasjoner(organisasjoner) + .build()); + } + + private Flux getTilpassetOrganisasjon(Tuple2, List> organisasjoner) { + + return Flux.fromIterable(organisasjoner.getT1()) + .map(party -> PersonDTO.OrganisasjonDTO.builder() + .navn(party.getName()) + .organisasjonsnummer(party.getOrganizationNumber()) + .organisasjonsform(party.getUnitType()) + .hasAltinnDollyTilgang(hasAltinnDollyTilgang(party)) + .hasDollyOrganisasjonTilgang(hasDollyOrganisasjonTilgang(organisasjoner.getT2(), party)) + .melding(getMelding(party.getName(), party.getOrganizationNumber(), + hasAltinnDollyTilgang(party), hasDollyOrganisasjonTilgang(organisasjoner.getT2(), party))) + .build()); + } + + private static boolean hasAltinnDollyTilgang(AuthorizedPartyDTO authorizedParty) { + + return authorizedParty.getAuthorizedResources().contains(DOLLY_RESOURCE); + } + + private static boolean hasDollyOrganisasjonTilgang(List organisasjoner, AuthorizedPartyDTO party) { + + return organisasjoner.stream() + .anyMatch(organisasjon -> organisasjon.getOrganisasjonsnummer().equals(party.getOrganizationNumber())); + } + + private static String getMelding(String orgnavn, String orgnummer, boolean hasAltinnDollyTilgang, boolean hasDollyOrganisasjonTilgang) { + + return new StringBuilder() + .append(!hasAltinnDollyTilgang ? + "Du mangler tilgang i Altinn på følgende tjenste: " + + "\"Tilgang til NAVs Dolly for samarbeidspartnere\" " + + "for organisasjon %s (med orgnummer %s)%n".formatted(orgnavn, orgnummer) : "") + .append(!hasAltinnDollyTilgang && !hasDollyOrganisasjonTilgang ? + " og %n" : "") + .append(!hasDollyOrganisasjonTilgang ? + "Organisasjon %s (med orgnummer %s) " .formatted(orgnavn, orgnummer) + + "mangler tilgang på Dolly syntetiske testdata selvbetjening%n" : "") + .append(!hasAltinnDollyTilgang || !hasDollyOrganisasjonTilgang ? + "Hvis du har til hensikt å bruke Dolly til å generere testdata, gjør følgende:%n" : "") + .append(!hasAltinnDollyTilgang ? + "- Ta kontakt med Altinn-ansvarlig i %s (med orgnummer %s) ".formatted(orgnavn, orgnummer) + + "og spør om vedkommene kan gi deg tilgang til tjenesten: " + + "\"Tilgang til NAVs Dolly for samarbeidspartnere\"%n" : "") + .append(!hasDollyOrganisasjonTilgang ? + "- Ta kontakt med NAV ved Anders Marstrander epost: anders.marstrander@nav.no, og spør om " + + "organisasjon med orgnr %s kan gis tilgang til Dolly syntetiske testdata selvbetjening%n".formatted(orgnummer) : "") + .toString(); + } +} diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnTilgangService.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnOrganisasjonTilgangService.java similarity index 97% rename from apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnTilgangService.java rename to apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnOrganisasjonTilgangService.java index d4151a28ecf..45b9067b46b 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnTilgangService.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnOrganisasjonTilgangService.java @@ -17,7 +17,7 @@ @Service @RequiredArgsConstructor -public class AltinnTilgangService { +public class AltinnOrganisasjonTilgangService { private static final String ORGANISASJON_TILGANG = "tilgang"; private final AltinnConsumer altinnConsumer; @@ -30,7 +30,7 @@ public Flux getAll() { .flatMap(this::convertResponse); } - public Flux create(String orgnummer, String miljoe) { + public Mono create(String orgnummer, String miljoe) { return altinnConsumer.create(orgnummer) .flatMap(altinnOrg -> { diff --git a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/MiljoerOversiktService.java b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/MiljoerOversiktService.java index 81202173881..3774737e83f 100644 --- a/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/MiljoerOversiktService.java +++ b/apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/MiljoerOversiktService.java @@ -4,7 +4,9 @@ import no.nav.testnav.altinn3tilgangservice.consumer.altinn.AltinnConsumer; import no.nav.testnav.altinn3tilgangservice.database.entity.OrganisasjonTilgang; import no.nav.testnav.altinn3tilgangservice.database.repository.OrganisasjonTilgangRepository; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; +import org.springframework.web.server.ResponseStatusException; import reactor.core.publisher.Mono; import static org.apache.commons.lang3.BooleanUtils.isTrue; @@ -47,17 +49,13 @@ public Mono updateMiljoe(String orgnummer, String miljoe) { organisasjon.setMiljoe(miljoe); return organisasjonTilgangRepository.save(organisasjon); }) : - organisasjonTilgangRepository.save(OrganisasjonTilgang.builder() - .organisasjonNummer(orgnummer) - .miljoe(miljoe) - .build())); + + throwError(orgnummer)); } private static Mono throwError(String orgnummer) { - return Mono.just(OrganisasjonTilgang.builder() - .organisasjonNummer(orgnummer) - .feilmelding("404 Not found: Organisasjonsnummer %s ble ikke funnet".formatted(orgnummer)) - .build()); + throw new ResponseStatusException(HttpStatus.NOT_FOUND, + "Organisasjonsnummer %s ble ikke funnet".formatted(orgnummer)); } } diff --git a/apps/altinn3-tilgang-service/src/main/resources/application-local.yml b/apps/altinn3-tilgang-service/src/main/resources/application-local.yml index 7916eb7f7fa..b53b18bab13 100644 --- a/apps/altinn3-tilgang-service/src/main/resources/application-local.yml +++ b/apps/altinn3-tilgang-service/src/main/resources/application-local.yml @@ -1,9 +1,9 @@ -ALTINN_URL: https://tt02.altinn.no +ALTINN_URL: https://platform.tt02.altinn.no AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} -MASKINPORTEN_CLIENT_ID: dummy +MASKINPORTEN_CLIENT_ID: ef2960de-7fa6-4396-80a5-2eca00e4af28 MASKINPORTEN_CLIENT_JWK: dummy -MASKINPORTEN_SCOPES: dummy +MASKINPORTEN_SCOPES: altinn:resourceregistry/accesslist.read altinn:resourceregistry/accesslist.write altinn:accessmanagement/authorizedparties.resourceowner MASKINPORTEN_WELL_KNOWN_URL: https://test.maskinporten.no/.well-known/oauth-authorization-server TOKEN_X_ISSUER: dummy diff --git a/apps/altinn3-tilgang-service/src/main/resources/application.yml b/apps/altinn3-tilgang-service/src/main/resources/application.yml index 70a799743f3..16f513682d3 100644 --- a/apps/altinn3-tilgang-service/src/main/resources/application.yml +++ b/apps/altinn3-tilgang-service/src/main/resources/application.yml @@ -52,4 +52,5 @@ server: encoding: charset: UTF-8 error: - include-message: always \ No newline at end of file + include-message: always + include-stacktrace: never \ No newline at end of file diff --git a/apps/bruker-service/config.test.yml b/apps/bruker-service/config.test.yml index 713f06a5a78..48e92b075b5 100644 --- a/apps/bruker-service/config.test.yml +++ b/apps/bruker-service/config.test.yml @@ -22,12 +22,11 @@ spec: rules: - application: dolly-frontend-dev - application: dolly-frontend-dev-unstable - - application: dolly-idporten - application: team-dolly-lokal-app - application: testnav-oversikt-frontend outbound: rules: - - application: testnav-person-organisasjon-tilgang-service-dev + - application: testnav-altinn3-tilgang-service liveness: path: /internal/isAlive initialDelay: 4 diff --git a/apps/bruker-service/config.yml b/apps/bruker-service/config.yml index 58cdf65a2d3..4274825e08f 100644 --- a/apps/bruker-service/config.yml +++ b/apps/bruker-service/config.yml @@ -21,14 +21,11 @@ spec: inbound: rules: - application: dolly-frontend - cluster: dev-gcp - application: dolly-idporten - cluster: dev-gcp - application: testnav-oversikt-frontend - cluster: dev-gcp outbound: rules: - - application: testnav-person-organisasjon-tilgang-service + - application: testnav-altinn3-tilgang-proxy liveness: path: /internal/isAlive initialDelay: 4 diff --git a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/config/Consumers.java b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/config/Consumers.java index 51662bd8e36..e3473bbb710 100644 --- a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/config/Consumers.java +++ b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/config/Consumers.java @@ -9,14 +9,6 @@ import static lombok.AccessLevel.PACKAGE; -/** - * Samler alle placeholders for ulike {@code consumers.*}-konfigurasjon her, dvs. subklasser av {@code ServerProperties}. - *

- * Husk at Spring Boot bruker relaxed binding - * mellom configuration properties og field names. - * - * @see ServerProperties - */ @Configuration @ConfigurationProperties(prefix = "consumers") @NoArgsConstructor(access = PACKAGE) @@ -24,6 +16,6 @@ @Setter(PACKAGE) public class Consumers { - private ServerProperties testnavPersonOrganisasjonTilgangService; + private ServerProperties testnavAltinn3TilgangService; } diff --git a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/config/OpenApiConfig.java b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/config/OpenApiConfig.java index cd656377c3d..66a6a6a178f 100644 --- a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/config/OpenApiConfig.java +++ b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/config/OpenApiConfig.java @@ -13,10 +13,14 @@ import java.util.Arrays; import no.nav.testnav.libs.reactivecore.config.ApplicationProperties; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.WebFilter; +import org.springframework.web.server.WebFilterChain; +import reactor.core.publisher.Mono; @Configuration -public class OpenApiConfig { +public class OpenApiConfig implements WebFilter { @Bean public OpenAPI openApi(ApplicationProperties applicationProperties) { @@ -46,4 +50,17 @@ public OpenAPI openApi(ApplicationProperties applicationProperties) { ) ); } + + @Override + public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { + if (exchange.getRequest().getURI().getPath().equals("/swagger")) { + return chain + .filter(exchange.mutate() + .request(exchange.getRequest() + .mutate().path("/swagger-ui.html").build()) + .build()); + } + + return chain.filter(exchange); + } } \ No newline at end of file diff --git a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/PersonOrganisasjonTilgangConsumer.java b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/PersonOrganisasjonTilgangConsumer.java index 0a947be0817..b29097a6057 100644 --- a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/PersonOrganisasjonTilgangConsumer.java +++ b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/PersonOrganisasjonTilgangConsumer.java @@ -1,51 +1,44 @@ package no.nav.testnav.apps.brukerservice.consumer; -import com.fasterxml.jackson.databind.ObjectMapper; import no.nav.testnav.apps.brukerservice.config.Consumers; -import no.nav.testnav.apps.brukerservice.consumer.command.GetOrganisasjonCommand; +import no.nav.testnav.apps.brukerservice.consumer.command.GetBrukertilgangCommand; import no.nav.testnav.apps.brukerservice.domain.Organisasjon; +import no.nav.testnav.libs.reactivesecurity.action.GetAuthenticatedUserId; import no.nav.testnav.libs.reactivesecurity.exchange.TokenExchange; import no.nav.testnav.libs.securitycore.domain.ServerProperties; -import org.springframework.http.MediaType; -import org.springframework.http.codec.json.Jackson2JsonDecoder; -import org.springframework.http.codec.json.Jackson2JsonEncoder; import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.client.ExchangeStrategies; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; @Component public class PersonOrganisasjonTilgangConsumer { + private final WebClient webClient; private final ServerProperties serverProperties; private final TokenExchange tokenExchange; + private final GetAuthenticatedUserId getAuthenticatedUserId; public PersonOrganisasjonTilgangConsumer( Consumers consumers, TokenExchange tokenExchange, - ObjectMapper objectMapper, - WebClient.Builder webClientBuilder) { - serverProperties = consumers.getTestnavPersonOrganisasjonTilgangService(); + WebClient.Builder webClientBuilder, + GetAuthenticatedUserId getAuthenticatedUserId) { + + serverProperties = consumers.getTestnavAltinn3TilgangService(); this.tokenExchange = tokenExchange; - ExchangeStrategies jacksonStrategy = ExchangeStrategies - .builder() - .codecs( - config -> { - config.defaultCodecs() - .jackson2JsonEncoder(new Jackson2JsonEncoder(objectMapper, MediaType.APPLICATION_JSON)); - config.defaultCodecs() - .jackson2JsonDecoder(new Jackson2JsonDecoder(objectMapper, MediaType.APPLICATION_JSON)); - }) - .build(); this.webClient = webClientBuilder - .exchangeStrategies(jacksonStrategy) .baseUrl(serverProperties.getUrl()) .build(); + this.getAuthenticatedUserId = getAuthenticatedUserId; } public Mono getOrganisasjon(String orgnummer) { - return tokenExchange.exchange(serverProperties) - .flatMap(accessToken -> new GetOrganisasjonCommand(webClient, orgnummer, accessToken.getTokenValue()).call()) - .map(Organisasjon::new); + + return Mono.from(getAuthenticatedUserId.call() + .flatMapMany(userId -> tokenExchange.exchange(serverProperties) + .flatMapMany(accessToken -> + new GetBrukertilgangCommand(webClient, userId, accessToken.getTokenValue()).call())) + .filter(org -> org.getOrganisasjonsnummer().equals(orgnummer)) + .map(Organisasjon::new)); } } diff --git a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/command/GetOrganisasjonCommand.java b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/command/GetBrukertilgangCommand.java similarity index 53% rename from apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/command/GetOrganisasjonCommand.java rename to apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/command/GetBrukertilgangCommand.java index 2a766f152c8..f3e949dd4e4 100644 --- a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/command/GetOrganisasjonCommand.java +++ b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/command/GetBrukertilgangCommand.java @@ -1,31 +1,35 @@ package no.nav.testnav.apps.brukerservice.consumer.command; import lombok.RequiredArgsConstructor; -import no.nav.testnav.apps.brukerservice.consumer.dto.OrganisasjonDTO; +import no.nav.testnav.apps.brukerservice.consumer.dto.AltinnBrukerRequest; +import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClientResponseException; +import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.util.concurrent.Callable; @RequiredArgsConstructor -public class GetOrganisasjonCommand implements Callable> { +public class GetBrukertilgangCommand implements Callable> { private final WebClient webClient; - private final String organisasjonsnummer; + private final String ident; private final String token; @Override - public Mono call() { - return webClient.get() - .uri(builder -> builder.path("/api/v1/person/organisasjoner/{organisasjonsnummer}").build(organisasjonsnummer)) + public Flux call() { + return webClient.post() + .uri(builder -> builder.path("/api/v1/brukertilgang").build()) .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) + .bodyValue(new AltinnBrukerRequest(ident)) .retrieve() - .bodyToMono(OrganisasjonDTO.class) + .bodyToFlux(OrganisasjonDTO.class) + .doOnError(WebClientFilter::logErrorMessage) .onErrorResume( throwable -> throwable instanceof WebClientResponseException.NotFound, throwable -> Mono.empty() ); } -} - +} \ No newline at end of file diff --git a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/dto/AltinnBrukerRequest.java b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/dto/AltinnBrukerRequest.java new file mode 100644 index 00000000000..f70ff4216c1 --- /dev/null +++ b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/dto/AltinnBrukerRequest.java @@ -0,0 +1,11 @@ +package no.nav.testnav.apps.brukerservice.consumer.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class AltinnBrukerRequest { + + private String ident; +} diff --git a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/dto/OrganisasjonDTO.java b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/dto/OrganisasjonDTO.java deleted file mode 100644 index 425b1c3bf5c..00000000000 --- a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/dto/OrganisasjonDTO.java +++ /dev/null @@ -1,4 +0,0 @@ -package no.nav.testnav.apps.brukerservice.consumer.dto; - -public record OrganisasjonDTO(String navn, String organisasjonsnummer, String organisasjonsfrom) { -} diff --git a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/domain/Organisasjon.java b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/domain/Organisasjon.java index 77904f9ed88..c292fbc5a20 100644 --- a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/domain/Organisasjon.java +++ b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/domain/Organisasjon.java @@ -1,27 +1,23 @@ package no.nav.testnav.apps.brukerservice.domain; -import no.nav.testnav.apps.brukerservice.consumer.dto.OrganisasjonDTO; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO; -public class Organisasjon { - private final String navn; - private final String organisasjonsnummer; - private final String organisasjonsform; - - public Organisasjon(OrganisasjonDTO dto) { - this.navn = dto.navn(); - this.organisasjonsnummer = dto.organisasjonsnummer(); - this.organisasjonsform = dto.organisasjonsfrom(); - } +@Data +@NoArgsConstructor +@AllArgsConstructor - public String getNavn() { - return navn; - } +public class Organisasjon { - public String getOrganisasjonsnummer() { - return organisasjonsnummer; - } + private String navn; + private String organisasjonsnummer; + private String organisasjonsform; - public String getOrganisasjonsform() { - return organisasjonsform; + public Organisasjon(OrganisasjonDTO dto) { + this.navn = dto.getNavn(); + this.organisasjonsnummer = dto.getOrganisasjonsnummer(); + this.organisasjonsform = dto.getOrganisasjonsform(); } } diff --git a/apps/bruker-service/src/main/resources/application-dev.yml b/apps/bruker-service/src/main/resources/application-dev.yml index 9236e224169..35c9fa83539 100644 --- a/apps/bruker-service/src/main/resources/application-dev.yml +++ b/apps/bruker-service/src/main/resources/application-dev.yml @@ -1,6 +1,13 @@ spring: application: name: testnav-bruker-service-dev + security: + oauth2: + resourceserver: + tokenx: + issuer-uri: ${TOKEN_X_ISSUER} + jwk-set-uri: ${TOKEN_X_JWKS_URI} + accepted-audience: ${TOKEN_X_CLIENT_ID} r2dbc: url: r2dbc:postgresql://${NAIS_DATABASE_TESTNAV_BRUKER_SERVICE_DEV_TESTNAV_BRUKER_SERVICE_DEV_DB_HOST}:${NAIS_DATABASE_TESTNAV_BRUKER_SERVICE_DEV_TESTNAV_BRUKER_SERVICE_DEV_DB_PORT}/${NAIS_DATABASE_TESTNAV_BRUKER_SERVICE_DEV_TESTNAV_BRUKER_SERVICE_DEV_DB_DATABASE} username: ${NAIS_DATABASE_TESTNAV_BRUKER_SERVICE_DEV_TESTNAV_BRUKER_SERVICE_DEV_DB_USERNAME} @@ -12,6 +19,6 @@ spring: consumers: - testnav-person-organisasjon-tilgang-service: - url: http://testnav-person-organisasjon-tilgang-service-dev.dolly.svc.cluster.local - name: testnav-person-organisasjon-tilgang-service-dev \ No newline at end of file + testnav-altinn3-tilgang-service: + url: http://testnav-altinn3-tilgang-service.dolly.svc.cluster.local + name: testnav-altinn3-tilgang-service \ No newline at end of file diff --git a/apps/bruker-service/src/main/resources/application-local.yml b/apps/bruker-service/src/main/resources/application-local.yml index c348e6eb2a7..9c14722dfc9 100644 --- a/apps/bruker-service/src/main/resources/application-local.yml +++ b/apps/bruker-service/src/main/resources/application-local.yml @@ -1,9 +1,10 @@ + AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} CRYPTOGRAPHY_SECRET: DUMMY SUPER SECRET CRYPTOGRAPHY KEY THAT IS NOT SECURE JWT_SECRET: DUMMY SUPER SECRET JWT KEY THAT IS NOT SECURE + TOKEN_X_CLIENT_ID: dev-gcp:dolly:testnav-bruker-service-dev -TOKENDINGS_URL: ${TOKEN_X_ISSUER} spring: application: @@ -16,6 +17,6 @@ spring: password: consumers: - testnav-person-organisasjon-tilgang-service: - url: https://testnav-person-organisasjon-tilgang-service-dev.intern.dev.nav.no - name: testnav-person-organisasjon-tilgang-service-dev + testnav-altinn3-tilgang-service: + url: https://testnav-altinn3-tilgang-service.intern.dev.nav.no + name: testnav-altinn3-tilgang-service diff --git a/apps/bruker-service/src/main/resources/application-prod.yml b/apps/bruker-service/src/main/resources/application-prod.yml index 455275bd171..e6f872195b9 100644 --- a/apps/bruker-service/src/main/resources/application-prod.yml +++ b/apps/bruker-service/src/main/resources/application-prod.yml @@ -1,4 +1,11 @@ spring: + security: + oauth2: + resourceserver: + tokenx: + issuer-uri: ${TOKEN_X_ISSUER} + jwk-set-uri: ${TOKEN_X_JWKS_URI} + accepted-audience: ${TOKEN_X_CLIENT_ID} r2dbc: url: r2dbc:postgresql://${NAIS_DATABASE_TESTNAV_BRUKER_SERVICE_TESTNAV_BRUKER_SERVICE_DB_HOST}:${NAIS_DATABASE_TESTNAV_BRUKER_SERVICE_TESTNAV_BRUKER_SERVICE_DB_PORT}/${NAIS_DATABASE_TESTNAV_BRUKER_SERVICE_TESTNAV_BRUKER_SERVICE_DB_DATABASE} username: ${NAIS_DATABASE_TESTNAV_BRUKER_SERVICE_TESTNAV_BRUKER_SERVICE_DB_USERNAME} diff --git a/apps/bruker-service/src/main/resources/application.yml b/apps/bruker-service/src/main/resources/application.yml index 9f515a648c1..3cb53ea7f47 100644 --- a/apps/bruker-service/src/main/resources/application.yml +++ b/apps/bruker-service/src/main/resources/application.yml @@ -1,3 +1,5 @@ +AAD_ISSUER_URI: https://login.microsoftonline.com/62366534-1ec3-4962-8869-9b5535279d0b + spring: application: version: application.version.todo @@ -6,10 +8,10 @@ spring: security: oauth2: resourceserver: - tokenx: - issuer-uri: ${TOKEN_X_ISSUER} - jwk-set-uri: ${TOKEN_X_JWKS_URI} - accepted-audience: ${TOKEN_X_CLIENT_ID} + aad: + 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} jackson: serialization: write_dates_as_timestamps: @@ -20,11 +22,11 @@ springdoc: url: /v3/api-docs consumers: - testnav-person-organisasjon-tilgang-service: - url: http://testnav-person-organisasjon-tilgang-service.dolly.svc.cluster.local + testnav-altinn3-tilgang-service: + url: http://testnav-altinn3-tilgang-proxy.dolly.svc.cluster.local cluster: dev-gcp namespace: dolly - name: testnav-person-organisasjon-tilgang-service + name: testnav-altinn3-tilgang-proxy management: endpoints: diff --git a/apps/dolly-frontend/config.idporten.yml b/apps/dolly-frontend/config.idporten.yml index aed20782252..64f2ba53138 100644 --- a/apps/dolly-frontend/config.idporten.yml +++ b/apps/dolly-frontend/config.idporten.yml @@ -17,7 +17,7 @@ spec: tenant: nav.no replicas: min: 1 - max: 2 + max: 1 port: 8080 ingresses: - "https://dolly-idporten.ekstern.dev.nav.no" @@ -42,11 +42,8 @@ spec: - application: testnav-organisasjon-faste-data-service - application: testnav-organisasjon-forvalter - application: testnav-organisasjon-service - - application: testnav-organisasjon-tilgang-service - application: testnav-pdl-forvalter - application: testnav-person-faste-data-service - - application: testnav-person-organisasjon-tilgang-service - - application: testnav-person-organisasjon-tilgang-service-dev - application: testnav-person-search-service - application: testnav-person-service - application: testnav-skattekort-service diff --git a/apps/dolly-frontend/config.test.yml b/apps/dolly-frontend/config.test.yml index 260eafa9a3e..9494c59a1f0 100644 --- a/apps/dolly-frontend/config.test.yml +++ b/apps/dolly-frontend/config.test.yml @@ -46,10 +46,8 @@ spec: - application: testnav-organisasjon-faste-data-service - application: testnav-organisasjon-forvalter - application: testnav-organisasjon-service - - application: testnav-organisasjon-tilgang-service - application: testnav-pdl-forvalter-dev - application: testnav-person-faste-data-service - - application: testnav-person-organisasjon-tilgang-service-dev - application: testnav-person-search-service - application: testnav-person-service - application: testnav-sykemelding-api-dev diff --git a/apps/dolly-frontend/config.unstable.yml b/apps/dolly-frontend/config.unstable.yml index 7a6b3df1dba..19b2a8aa5cc 100644 --- a/apps/dolly-frontend/config.unstable.yml +++ b/apps/dolly-frontend/config.unstable.yml @@ -44,9 +44,7 @@ spec: - application: testnav-organisasjon-faste-data-service - application: testnav-organisasjon-forvalter - application: testnav-organisasjon-service - - application: testnav-organisasjon-tilgang-service - application: testnav-pdl-forvalter-dev - - application: testnav-person-organisasjon-tilgang-service-dev - application: testnav-person-search-service - application: testnav-person-service - application: testnav-tenor-search-service diff --git a/apps/dolly-frontend/config.yml b/apps/dolly-frontend/config.yml index f0429be6a19..2faeb17bc3a 100644 --- a/apps/dolly-frontend/config.yml +++ b/apps/dolly-frontend/config.yml @@ -51,10 +51,8 @@ spec: - application: testnav-organisasjon-faste-data-service - application: testnav-organisasjon-forvalter - application: testnav-organisasjon-service - - application: testnav-organisasjon-tilgang-service - application: testnav-pdl-forvalter - application: testnav-person-faste-data-service - - application: testnav-person-organisasjon-tilgang-service - application: testnav-person-search-service - application: testnav-person-service - application: testnav-skattekort-service diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java index 2df2a6e90d0..8124c6e087f 100644 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java @@ -53,7 +53,6 @@ public class DollyFrontendApplicationStarter { @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { - return builder .routes() .route(createRoute(consumers.getTestnavKontoregisterPersonProxy())) @@ -85,7 +84,6 @@ public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { .route(createRoute(consumers.getTestnavSigrunstubProxy())) .route(createRoute(consumers.getTestnavPdlForvalter(), "testnav-pdl-forvalter")) .route(createRoute(consumers.getTestnavPersonSearchService())) - .route(createRoute(consumers.getTestnavPersonOrganisasjonTilgangService(), "testnav-person-organisasjon-tilgang-service")) .route(createRoute(consumers.getTestnavSkjermingsregisterProxy())) .route(createRoute(consumers.getTestnavDokarkivProxy())) .route(createRoute(consumers.getTestnavArbeidsplassenCVProxy())) @@ -147,4 +145,4 @@ private Function> createRoute(String segment, St .filters(filter, removeCookiesFilter, addUserJwtHeaderFilter()) ).uri(host); } -} +} \ No newline at end of file diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java index c29e9a91726..86a118efec9 100644 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java @@ -51,7 +51,6 @@ public class Consumers { private ServerProperties testnavOrganisasjonService; private ServerProperties testnavPdlForvalter; private ServerProperties testnavPensjonTestdataFacadeProxy; - private ServerProperties testnavPersonOrganisasjonTilgangService; private ServerProperties testnavPersonSearchService; private ServerProperties testnavPersonService; private ServerProperties testnavSigrunstubProxy; diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/Altinn3PersonOrganisasjonTilgangConsumer.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/Altinn3PersonOrganisasjonTilgangConsumer.java new file mode 100644 index 00000000000..50a38ef30f7 --- /dev/null +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/Altinn3PersonOrganisasjonTilgangConsumer.java @@ -0,0 +1,66 @@ +package no.nav.dolly.web.consumers; + +import lombok.extern.slf4j.Slf4j; +import no.nav.dolly.web.config.Consumers; +import no.nav.dolly.web.consumers.command.PostPersonOrganisasjonTilgangCommand; +import no.nav.dolly.web.service.AccessService; +import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO; +import no.nav.testnav.libs.reactivesecurity.action.GetAuthenticatedUserId; +import no.nav.testnav.libs.securitycore.domain.ServerProperties; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.reactive.function.client.WebClientResponseException; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@Slf4j +@Component +public class Altinn3PersonOrganisasjonTilgangConsumer { + + private final WebClient webClient; + private final ServerProperties serverProperties; + private final AccessService accessService; + private final GetAuthenticatedUserId getAuthenticatedUserId; + + public Altinn3PersonOrganisasjonTilgangConsumer( + Consumers consumers, + AccessService accessService, + WebClient.Builder webClientBuilder, + GetAuthenticatedUserId getAuthenticatedUserId) { + + this.accessService = accessService; + serverProperties = consumers.getTestnavAltinn3TilgangService(); + + this.webClient = webClientBuilder + .baseUrl(serverProperties.getUrl()) + .build(); + this.getAuthenticatedUserId = getAuthenticatedUserId; + } + + public Mono hasAccess(String organisasjonsnummer, ServerWebExchange exchange) { + + return getAuthenticatedUserId + .call() + .flatMap(userId -> accessService.getAccessToken(serverProperties, exchange) + .flatMapMany(accessToken -> new PostPersonOrganisasjonTilgangCommand(webClient, userId, accessToken).call()) + .filter(organisasjonDTO -> organisasjonDTO.getOrganisasjonsnummer().equals(organisasjonsnummer)) + .onErrorResume( + WebClientResponseException.class::isInstance, + throwable -> { + log.warn("Person har ikke tilgang til organisasjon {}.", organisasjonsnummer); + return Mono.empty(); + }) + .reduce(Boolean.FALSE, (acc, value) -> Boolean.TRUE)); + } + + public Flux getOrganisasjoner(ServerWebExchange exchange) { + + return getAuthenticatedUserId + .call() + .flatMapMany(userId -> + accessService.getAccessToken(serverProperties, exchange) + .flatMapMany(accessToken -> new PostPersonOrganisasjonTilgangCommand(webClient, userId, accessToken).call())); + } +} + diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/PersonOrganisasjonTilgangConsumer.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/PersonOrganisasjonTilgangConsumer.java deleted file mode 100644 index cec7481322b..00000000000 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/PersonOrganisasjonTilgangConsumer.java +++ /dev/null @@ -1,62 +0,0 @@ -package no.nav.dolly.web.consumers; - -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.extern.slf4j.Slf4j; -import no.nav.dolly.web.config.Consumers; -import no.nav.dolly.web.consumers.command.GetPersonOrganisasjonTilgangCommand; -import no.nav.dolly.web.service.AccessService; -import no.nav.testnav.libs.securitycore.domain.ServerProperties; -import org.springframework.http.MediaType; -import org.springframework.http.codec.json.Jackson2JsonDecoder; -import org.springframework.http.codec.json.Jackson2JsonEncoder; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.client.ExchangeStrategies; -import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.reactive.function.client.WebClientResponseException; -import org.springframework.web.server.ServerWebExchange; -import reactor.core.publisher.Mono; - -@Slf4j -@Component -public class PersonOrganisasjonTilgangConsumer { - private final WebClient webClient; - private final ServerProperties serverProperties; - - private final AccessService accessService; - - public PersonOrganisasjonTilgangConsumer( - Consumers consumers, - AccessService accessService, - ObjectMapper objectMapper, - WebClient.Builder webClientBuilder) { - - this.accessService = accessService; - serverProperties = consumers.getTestnavPersonOrganisasjonTilgangService(); - ExchangeStrategies jacksonStrategy = ExchangeStrategies.builder() - .codecs(config -> { - config.defaultCodecs() - .jackson2JsonEncoder(new Jackson2JsonEncoder(objectMapper, MediaType.APPLICATION_JSON)); - config.defaultCodecs() - .jackson2JsonDecoder(new Jackson2JsonDecoder(objectMapper, MediaType.APPLICATION_JSON)); - }).build(); - - this.webClient = webClientBuilder - .exchangeStrategies(jacksonStrategy) - .baseUrl(serverProperties.getUrl()) - .build(); - } - - public Mono hasAccess(String organisasjonsnummer, ServerWebExchange exchange) { - return accessService.getAccessToken(serverProperties, exchange) - .flatMap(accessToken -> new GetPersonOrganisasjonTilgangCommand(webClient, accessToken, organisasjonsnummer).call()) - .onErrorResume( - WebClientResponseException.class::isInstance, - throwable -> { - log.warn("Person har ikke tilgang til organisasjon {}.", organisasjonsnummer); - return Mono.empty(); - }) - .flatMap(value -> Mono.just(true)) - .switchIfEmpty(Mono.just(false)); - } -} - diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/command/GetPersonOrganisasjonTilgangCommand.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/command/PostPersonOrganisasjonTilgangCommand.java similarity index 59% rename from apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/command/GetPersonOrganisasjonTilgangCommand.java rename to apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/command/PostPersonOrganisasjonTilgangCommand.java index 3bdfb86c837..7b7e5ece269 100644 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/command/GetPersonOrganisasjonTilgangCommand.java +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/command/PostPersonOrganisasjonTilgangCommand.java @@ -2,11 +2,12 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import no.nav.dolly.web.consumers.dto.OrganisasjonDTO; +import no.nav.dolly.web.consumers.dto.AltinnBrukerRequest; +import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO; import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; +import reactor.core.publisher.Flux; import reactor.util.retry.Retry; import java.time.Duration; @@ -14,21 +15,24 @@ @Slf4j @RequiredArgsConstructor -public class GetPersonOrganisasjonTilgangCommand implements Callable> { +public class PostPersonOrganisasjonTilgangCommand implements Callable> { + private final WebClient webClient; + private final String ident; private final String token; - private final String organisasjonsnummer; @Override - public Mono call() { + public Flux call() { + return webClient - .get() - .uri(builder -> builder.path("/api/v1/person/organisasjoner/{organisasjonsnummer}").build(organisasjonsnummer)) + .post() + .uri(builder -> builder.path("/api/v1/brukertilgang").build()) .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) + .bodyValue(new AltinnBrukerRequest(ident)) .retrieve() - .bodyToMono(OrganisasjonDTO.class) - .doOnError(error -> log.error("Feilet å hente organisasjon, status: {}, feilmelding: ", - WebClientFilter.getMessage(error), + .bodyToFlux(OrganisasjonDTO.class) + .doOnError(error -> log.error("Feilet å hente organisasjon, status: {}, feilmelding: {}", + WebClientFilter.getStatus(error), WebClientFilter.getMessage(error), error)) .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/dto/AltinnBrukerRequest.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/dto/AltinnBrukerRequest.java new file mode 100644 index 00000000000..91dbb8b2a03 --- /dev/null +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/dto/AltinnBrukerRequest.java @@ -0,0 +1,11 @@ +package no.nav.dolly.web.consumers.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class AltinnBrukerRequest { + + private String ident; +} diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/dto/OrganisasjonDTO.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/dto/OrganisasjonDTO.java deleted file mode 100644 index fdd85cd2839..00000000000 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/consumers/dto/OrganisasjonDTO.java +++ /dev/null @@ -1,12 +0,0 @@ -package no.nav.dolly.web.consumers.dto; - -import java.time.LocalDateTime; - -public record OrganisasjonDTO( - String navn, - String orgnisasjonsnummer, - String orgnisasjonsfrom, - LocalDateTime gyldigTil -) { -} - diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/provider/web/BrukerTilgangController.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/provider/web/BrukerTilgangController.java new file mode 100644 index 00000000000..829b41b4fab --- /dev/null +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/provider/web/BrukerTilgangController.java @@ -0,0 +1,29 @@ +package no.nav.dolly.web.provider.web; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.dolly.web.consumers.Altinn3PersonOrganisasjonTilgangConsumer; +import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +import java.util.List; + +@Slf4j +@RestController +@RequestMapping("/altinn") +@RequiredArgsConstructor +public class BrukerTilgangController { + + private final Altinn3PersonOrganisasjonTilgangConsumer altinn3PersonOrganisasjonTilgangConsumer; + + @GetMapping("/organisasjoner") + public Mono> getOrganisasjoner(ServerWebExchange exchange) { + + return altinn3PersonOrganisasjonTilgangConsumer.getOrganisasjoner(exchange) + .collectList(); + } +} diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/provider/web/SessionController.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/provider/web/SessionController.java index 0652790796c..f6222576b25 100644 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/provider/web/SessionController.java +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/provider/web/SessionController.java @@ -2,7 +2,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import no.nav.dolly.web.consumers.PersonOrganisasjonTilgangConsumer; +import no.nav.dolly.web.consumers.Altinn3PersonOrganisasjonTilgangConsumer; import no.nav.dolly.web.service.BrukerService; import no.nav.testnav.libs.securitycore.config.UserSessionConstant; import org.springframework.http.HttpStatus; @@ -24,7 +24,7 @@ public class SessionController { private final BrukerService brukerService; - private final PersonOrganisasjonTilgangConsumer personOrganisasjonTilgangConsumer; + private final Altinn3PersonOrganisasjonTilgangConsumer altinn3PersonOrganisasjonTilgangConsumer; /** * Ping endepunkt for aa holde sessionen aapen. @@ -44,7 +44,8 @@ public Mono> delete(ServerWebExchange exchange) { @PutMapping("/user") public Mono> addUserToSession(@RequestParam String organisasjonsnummer, ServerWebExchange exchange) { - return personOrganisasjonTilgangConsumer + + return altinn3PersonOrganisasjonTilgangConsumer .hasAccess(organisasjonsnummer, exchange) .doOnError(e -> log.error("Feil ved sjekk av tilgang til org {}", organisasjonsnummer, e)) .flatMap(hasAccess -> { diff --git a/apps/dolly-frontend/src/main/js/playwright/mocks/BasicMocks.tsx b/apps/dolly-frontend/src/main/js/playwright/mocks/BasicMocks.tsx index 7518f066e45..ce86904ffba 100644 --- a/apps/dolly-frontend/src/main/js/playwright/mocks/BasicMocks.tsx +++ b/apps/dolly-frontend/src/main/js/playwright/mocks/BasicMocks.tsx @@ -23,8 +23,7 @@ export const personOrgTilgangMock = [ { navn: 'testytest', organisasjonsnummer: '12345678', - organisasjonsfrom: 'BEDR', - gyldigTil: '2100-10-10T10:10:10.100Z', + organisasjonsform: 'BEDR', }, ] diff --git a/apps/dolly-frontend/src/main/js/playwright/tests/Bankid.spec.ts b/apps/dolly-frontend/src/main/js/playwright/tests/Bankid.spec.ts index 10d86341dca..f832c6a7883 100644 --- a/apps/dolly-frontend/src/main/js/playwright/tests/Bankid.spec.ts +++ b/apps/dolly-frontend/src/main/js/playwright/tests/Bankid.spec.ts @@ -11,7 +11,7 @@ test.describe('Bankid testing', () => { headers: { 'content-type': 'application/json' }, }) }) - await page.route(new RegExp(/testnav-person-organisasjon-tilgang-service/), async (route) => { + await page.route(new RegExp(/altinn\/organisasjoner/), async (route) => { await route.fulfill({ status: 200, body: JSON.stringify(personOrgTilgangMock), diff --git a/apps/dolly-frontend/src/main/js/proxy-routes.json b/apps/dolly-frontend/src/main/js/proxy-routes.json index 2b7e1cf21bb..ea55ec091c7 100644 --- a/apps/dolly-frontend/src/main/js/proxy-routes.json +++ b/apps/dolly-frontend/src/main/js/proxy-routes.json @@ -29,6 +29,10 @@ "/session/user": { "changeOrigin": false }, + "/altinn/organisasjoner": { + "target": "http://localhost:8020", + "secure": false + }, "/testnav-organisasjon-faste-data-service/api": { "changeOrigin": true }, @@ -113,9 +117,6 @@ "/testnav-person-search-service/api": { "changeOrigin": true }, - "/testnav-person-organisasjon-tilgang-service/api": { - "changeOrigin": true - }, "/testnav-pdl-forvalter/api": { "changeOrigin": true }, diff --git a/apps/dolly-frontend/src/main/js/src/service/services/personOrganisasjonTilgang/PersonOrganisasjonTilgangService.tsx b/apps/dolly-frontend/src/main/js/src/service/services/personOrganisasjonTilgang/PersonOrganisasjonTilgangService.tsx index c67a1f009c7..e079958b6b3 100644 --- a/apps/dolly-frontend/src/main/js/src/service/services/personOrganisasjonTilgang/PersonOrganisasjonTilgangService.tsx +++ b/apps/dolly-frontend/src/main/js/src/service/services/personOrganisasjonTilgang/PersonOrganisasjonTilgangService.tsx @@ -1,8 +1,7 @@ import Request from '@/service/services/Request' import logoutBruker from '@/components/utlogging/logoutBruker' -const personOrgTilgangServiceUrl = - '/testnav-person-organisasjon-tilgang-service/api/v1/person/organisasjoner' +const personOrgTilgangServiceUrl = '/altinn/organisasjoner' export default { getOrganisasjoner() { @@ -15,5 +14,5 @@ export default { .then((response) => { return response }) - }, + } } diff --git a/apps/dolly-frontend/src/main/js/src/utils/hooks/useOrganisasjonTilgang.tsx b/apps/dolly-frontend/src/main/js/src/utils/hooks/useOrganisasjonTilgang.tsx index 98f8d78bfb6..47969f3c8eb 100644 --- a/apps/dolly-frontend/src/main/js/src/utils/hooks/useOrganisasjonTilgang.tsx +++ b/apps/dolly-frontend/src/main/js/src/utils/hooks/useOrganisasjonTilgang.tsx @@ -3,7 +3,7 @@ import { fetcher } from '@/api' import { useBrukerProfil } from '@/utils/hooks/useBruker' const getOrganisasjonMiljoeUrl = (orgnummer: string) => - `/testnav-altinn3-tilgang-service/api/v1/miljoer/organisasjon/orgnummer?orgnummer=${orgnummer}` + `/testnav-altinn3-tilgang-service/api/v1/miljoer/organisasjon/${orgnummer}` const organisasjonTilgangUrl = `/testnav-altinn3-tilgang-service/api/v1/organisasjoner` diff --git a/apps/dolly-frontend/src/main/resources/application-local.yml b/apps/dolly-frontend/src/main/resources/application-local.yml index be0739b2cf1..48b781833ba 100644 --- a/apps/dolly-frontend/src/main/resources/application-local.yml +++ b/apps/dolly-frontend/src/main/resources/application-local.yml @@ -41,9 +41,6 @@ consumers: testnav-varslinger-service: name: testnav-varslinger-service-dev url: http://testnav-varslinger-service-dev.intern.dev.nav.no - testnav-person-organisasjon-tilgang-service: - name: testnav-person-organisasjon-tilgang-service-dev - url: https://testnav-person-organisasjon-tilgang-service.intern.dev.nav.no oppsummeringsdokument-service: url: https://testnav-oppsummeringsdokument-service.intern.dev.nav.no testnav-bruker-service: diff --git a/apps/dolly-frontend/src/main/resources/application.yml b/apps/dolly-frontend/src/main/resources/application.yml index 9653c61db58..1731e1a42b7 100644 --- a/apps/dolly-frontend/src/main/resources/application.yml +++ b/apps/dolly-frontend/src/main/resources/application.yml @@ -155,11 +155,6 @@ consumers: namespace: dolly name: testnorge-tilbakemelding-api url: http://testnorge-tilbakemelding-api.dolly.svc.cluster.local - testnav-person-organisasjon-tilgang-service: - cluster: dev-gcp - namespace: dolly - name: testnav-person-organisasjon-tilgang-service - url: http://testnav-person-organisasjon-tilgang-service.dolly.svc.cluster.local testnav-bruker-service: cluster: dev-gcp namespace: dolly diff --git a/apps/dolly-frontend/src/main/resources/logback-spring.xml b/apps/dolly-frontend/src/main/resources/logback-spring.xml index 966dbc796b2..b80ca79b071 100644 --- a/apps/dolly-frontend/src/main/resources/logback-spring.xml +++ b/apps/dolly-frontend/src/main/resources/logback-spring.xml @@ -3,17 +3,9 @@ - - true - 10280 - 20 - ^sun\.reflect\..*\.invoke - ^net\.sf\.cglib\.proxy\.MethodProxy\.invoke - java\.util\.concurrent\..* - org\.apache\.catalina\..* - org\.apache\.coyote\..* - org\.apache\.tomcat\..* - + -1 + true + - diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/altinn3/v1/OrganisasjonDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/altinn3/v1/OrganisasjonDTO.java new file mode 100644 index 00000000000..725ba98dfb4 --- /dev/null +++ b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/altinn3/v1/OrganisasjonDTO.java @@ -0,0 +1,17 @@ +package no.nav.testnav.libs.dto.altinn3.v1; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OrganisasjonDTO { + + private String navn; + private String organisasjonsnummer; + private String organisasjonsform; +} \ No newline at end of file diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/altinn3/v1/PersonDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/altinn3/v1/PersonDTO.java new file mode 100644 index 00000000000..c5a91530fda --- /dev/null +++ b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/altinn3/v1/PersonDTO.java @@ -0,0 +1,32 @@ +package no.nav.testnav.libs.dto.altinn3.v1; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PersonDTO { + + private String ident; + private List organisasjoner; + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class OrganisasjonDTO { + + private String navn; + private String organisasjonsnummer; + private String organisasjonsform; + private Boolean hasAltinnDollyTilgang; + private Boolean hasDollyOrganisasjonTilgang; + private String melding; + } +} diff --git a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedResourceServerType.java b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedResourceServerType.java index a3596f957d2..8d846ba7708 100644 --- a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedResourceServerType.java +++ b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedResourceServerType.java @@ -1,7 +1,9 @@ package no.nav.testnav.libs.reactivesecurity.action; import lombok.RequiredArgsConstructor; +import no.nav.testnav.libs.reactivesecurity.properties.ResourceServerProperties; import no.nav.testnav.libs.securitycore.domain.ResourceServerType; +import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; import org.springframework.stereotype.Component; import reactor.core.publisher.Mono; @@ -10,8 +12,6 @@ import java.util.Optional; import java.util.concurrent.Callable; -import no.nav.testnav.libs.reactivesecurity.properties.ResourceServerProperties; - @Component @RequiredArgsConstructor public class GetAuthenticatedResourceServerType extends JwtResolver implements Callable> { @@ -30,11 +30,18 @@ private Optional getResourceTypeForm(JwtAuthenticationToken @Override public Mono call() { + return getJwtAuthenticationToken() .onErrorResume(JwtResolverException.class, throwable -> Mono.empty()) - .flatMap(token -> getResourceTypeForm(token) - .map(Mono::just) - .orElseGet(Mono::empty) - ); + .flatMap(authentication -> { + if (authentication instanceof JwtAuthenticationToken jwtAuthenticationTokentoken) { + return getResourceTypeForm(jwtAuthenticationTokentoken) + .map(Mono::just) + .orElseGet(Mono::empty); + } else if (authentication instanceof OAuth2AuthenticationToken) { + return Mono.just(ResourceServerType.TOKEN_X); + } + return Mono.empty(); + }); } } diff --git a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedToken.java b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedToken.java index bc5f09c71f3..c69106248ed 100644 --- a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedToken.java +++ b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedToken.java @@ -1,11 +1,18 @@ package no.nav.testnav.libs.reactivesecurity.action; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.testnav.libs.securitycore.domain.Token; +import org.springframework.http.HttpStatus; +import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; +import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; import org.springframework.stereotype.Component; +import org.springframework.web.server.ResponseStatusException; import reactor.core.publisher.Mono; +import java.time.Instant; import java.util.concurrent.Callable; @Component @@ -21,6 +28,7 @@ public Mono call() { .call() .flatMap(serverType -> switch (serverType) { case TOKEN_X -> getJwtAuthenticationToken() + .map(JwtAuthenticationToken.class::cast) .map(jwt -> Token.builder() .clientCredentials(false) .userId(jwt.getTokenAttributes().get("pid").toString()) @@ -28,6 +36,7 @@ public Mono call() { .expiresAt(jwt.getToken().getExpiresAt()) .build()); case AZURE_AD -> getJwtAuthenticationToken() + .map(JwtAuthenticationToken.class::cast) .map(jwt -> Token.builder() .clientCredentials(jwt.getTokenAttributes().get("oid").equals(jwt.getTokenAttributes().get("sub"))) .userId(jwt.getTokenAttributes().get("oid").toString()) diff --git a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedUserId.java b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedUserId.java index 63193f44bcc..b0636ee9c7d 100644 --- a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedUserId.java +++ b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/GetAuthenticatedUserId.java @@ -1,11 +1,15 @@ package no.nav.testnav.libs.reactivesecurity.action; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; +import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; import org.springframework.stereotype.Component; import reactor.core.publisher.Mono; import java.util.concurrent.Callable; +@Slf4j @Component @RequiredArgsConstructor public class GetAuthenticatedUserId extends JwtResolver implements Callable> { @@ -23,6 +27,20 @@ public Mono call() { } private Mono getTokenAttribute(String attribute) { - return getJwtAuthenticationToken().map(value -> value.getTokenAttributes().get(attribute).toString()); + + return getJwtAuthenticationToken() + .map(authentication -> + + switch (authentication) { + + case JwtAuthenticationToken jwtAuthenticationToken -> + jwtAuthenticationToken.getTokenAttributes().get(attribute).toString(); + + case OAuth2AuthenticationToken oauth2AuthenticationToken -> + oauth2AuthenticationToken.getPrincipal().getAttributes().get("pid").toString(); + + default -> ""; + } + ); } } diff --git a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/JwtResolver.java b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/JwtResolver.java index 6f360743c2f..5b19c554aa1 100644 --- a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/JwtResolver.java +++ b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/JwtResolver.java @@ -1,34 +1,19 @@ package no.nav.testnav.libs.reactivesecurity.action; import lombok.extern.slf4j.Slf4j; -import org.springframework.security.authentication.CredentialsExpiredException; +import org.springframework.security.core.Authentication; import org.springframework.security.core.context.ReactiveSecurityContextHolder; import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.oauth2.jwt.Jwt; -import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; import reactor.core.publisher.Mono; -import java.time.Instant; -import java.time.ZonedDateTime; - @Slf4j -@SuppressWarnings("java:S1610") abstract class JwtResolver { - Mono getJwtAuthenticationToken() { + Mono getJwtAuthenticationToken() { return ReactiveSecurityContextHolder .getContext() .switchIfEmpty(Mono.error(new JwtResolverException("ReactiveSecurityContext is empty"))) - .map(SecurityContext::getAuthentication) - .map(JwtAuthenticationToken.class::cast) - .doOnError(throwable -> log.warn("Klarte ikke hente Jwt Auth Token", throwable)) - .doOnSuccess(jwtAuthenticationToken -> { - Jwt credentials = (Jwt) jwtAuthenticationToken.getCredentials(); - Instant expiresAt = credentials.getExpiresAt(); - if (expiresAt == null || expiresAt.isBefore(ZonedDateTime.now().toInstant().plusSeconds(120))) { - throw new CredentialsExpiredException("Jwt er utløpt eller utløper innen kort tid"); - } - }); + .doOnNext(context -> log.info("JwtResolver context.authentication {} {}", context.getAuthentication().getClass().getCanonicalName(), context.getAuthentication())) + .map(SecurityContext::getAuthentication); } - } diff --git a/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/Oauth2Resolver.java b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/Oauth2Resolver.java new file mode 100644 index 00000000000..68dac390a55 --- /dev/null +++ b/libs/reactive-security/src/main/java/no/nav/testnav/libs/reactivesecurity/action/Oauth2Resolver.java @@ -0,0 +1,35 @@ +package no.nav.testnav.libs.reactivesecurity.action; + +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.authentication.CredentialsExpiredException; +import org.springframework.security.core.context.ReactiveSecurityContextHolder; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; +import org.springframework.security.oauth2.jwt.Jwt; +import reactor.core.publisher.Mono; + +import java.time.Instant; +import java.time.ZonedDateTime; + +@Slf4j +@UtilityClass +public class Oauth2Resolver { + + public static Mono getOauth2AuthenticationToken() { + return ReactiveSecurityContextHolder + .getContext() + .switchIfEmpty(Mono.error(new JwtResolverException("ReactiveSecurityContext is empty"))) + .doOnNext(context -> log.info("Oauth2Resolver context.authentication {} {}", context.getAuthentication().getClass().getCanonicalName(), context.getAuthentication())) + .map(SecurityContext::getAuthentication) + .map(OAuth2AuthenticationToken.class::cast) + .doOnError(throwable -> log.warn("Klarte ikke hente Jwt Auth Token", throwable)) + .doOnSuccess(jwtAuthenticationToken -> { + Jwt credentials = (Jwt) jwtAuthenticationToken.getCredentials(); + Instant expiresAt = credentials.getExpiresAt(); + if (expiresAt == null || expiresAt.isBefore(ZonedDateTime.now().toInstant().plusSeconds(120))) { + throw new CredentialsExpiredException("Jwt er utløpt eller utløper innen kort tid"); + } + }); + } +} diff --git a/proxies/altinn3-tilgang-proxy/config.yml b/proxies/altinn3-tilgang-proxy/config.yml index 94091e33059..286fa0d5ab3 100644 --- a/proxies/altinn3-tilgang-proxy/config.yml +++ b/proxies/altinn3-tilgang-proxy/config.yml @@ -24,9 +24,8 @@ spec: - application: team-dolly-lokal-app - application: testnav-oversikt-frontend - application: dolly-frontend - - application: dolly-frontend-dev - - application: dolly-frontend-dev-unstable - application: dolly-idporten + - application: testnav-bruker-service outbound: external: - host: testnav-altinn3-tilgang-service.nav.no From 8ff1281469272a489d7f2f6da6c2bdb792fc0a57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristen=20H=C3=A6rum?= Date: Mon, 6 Jan 2025 10:08:17 +0100 Subject: [PATCH 54/59] Fjerner eksponering av heapdump --- .../adresse-service/src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- apps/brreg-stub/src/main/resources/application.yml | 7 ++++--- apps/bruker-service/src/main/resources/application.yml | 7 ++++--- apps/dolly-backend/src/main/resources/application.yml | 5 ++--- apps/dolly-frontend/src/main/resources/application.yml | 7 ++++--- apps/dollystatus/src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 10 ++++++---- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../miljoer-service/src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- apps/pdl-forvalter/src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- apps/person-service/src/main/resources/application.yml | 7 ++++--- apps/profil-api/src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../sykemelding-api/src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- apps/udi-stub/src/main/resources/application.yml | 7 ++++--- .../src/main/resources/application.yml | 7 ++++--- 54 files changed, 216 insertions(+), 163 deletions(-) diff --git a/apps/adresse-service/src/main/resources/application.yml b/apps/adresse-service/src/main/resources/application.yml index 5b96088b72e..5b3bf750fca 100644 --- a/apps/adresse-service/src/main/resources/application.yml +++ b/apps/adresse-service/src/main/resources/application.yml @@ -34,12 +34,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/altinn3-tilgang-service/src/main/resources/application.yml b/apps/altinn3-tilgang-service/src/main/resources/application.yml index 16f513682d3..654d076c3a4 100644 --- a/apps/altinn3-tilgang-service/src/main/resources/application.yml +++ b/apps/altinn3-tilgang-service/src/main/resources/application.yml @@ -37,12 +37,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/amelding-service/src/main/resources/application.yml b/apps/amelding-service/src/main/resources/application.yml index e90182fd21e..404bec3cc25 100644 --- a/apps/amelding-service/src/main/resources/application.yml +++ b/apps/amelding-service/src/main/resources/application.yml @@ -30,12 +30,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/app-tilgang-analyse-service/src/main/resources/application.yml b/apps/app-tilgang-analyse-service/src/main/resources/application.yml index ebf58a884c3..829bfd78a09 100644 --- a/apps/app-tilgang-analyse-service/src/main/resources/application.yml +++ b/apps/app-tilgang-analyse-service/src/main/resources/application.yml @@ -32,12 +32,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/arbeidsforhold-service/src/main/resources/application.yml b/apps/arbeidsforhold-service/src/main/resources/application.yml index 9e816896986..f15c64ba7ef 100644 --- a/apps/arbeidsforhold-service/src/main/resources/application.yml +++ b/apps/arbeidsforhold-service/src/main/resources/application.yml @@ -33,12 +33,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/batch-bestilling-service/src/main/resources/application.yml b/apps/batch-bestilling-service/src/main/resources/application.yml index 5e056d09e77..0a85377386b 100644 --- a/apps/batch-bestilling-service/src/main/resources/application.yml +++ b/apps/batch-bestilling-service/src/main/resources/application.yml @@ -28,12 +28,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/brreg-stub/src/main/resources/application.yml b/apps/brreg-stub/src/main/resources/application.yml index de4ff173f11..0667df0b3ea 100644 --- a/apps/brreg-stub/src/main/resources/application.yml +++ b/apps/brreg-stub/src/main/resources/application.yml @@ -12,12 +12,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/bruker-service/src/main/resources/application.yml b/apps/bruker-service/src/main/resources/application.yml index 3cb53ea7f47..c08c085bc98 100644 --- a/apps/bruker-service/src/main/resources/application.yml +++ b/apps/bruker-service/src/main/resources/application.yml @@ -33,12 +33,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/dolly-backend/src/main/resources/application.yml b/apps/dolly-backend/src/main/resources/application.yml index 6caad4f8bde..7187259ca47 100644 --- a/apps/dolly-backend/src/main/resources/application.yml +++ b/apps/dolly-backend/src/main/resources/application.yml @@ -64,15 +64,14 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: health: show-components: always show-details: always - heapdump: - enabled: true prometheus: enabled: true prometheus: diff --git a/apps/dolly-frontend/src/main/resources/application.yml b/apps/dolly-frontend/src/main/resources/application.yml index 1731e1a42b7..d448be506fd 100644 --- a/apps/dolly-frontend/src/main/resources/application.yml +++ b/apps/dolly-frontend/src/main/resources/application.yml @@ -246,12 +246,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/dollystatus/src/main/resources/application.yml b/apps/dollystatus/src/main/resources/application.yml index 069adad970b..02b34f3f5a6 100644 --- a/apps/dollystatus/src/main/resources/application.yml +++ b/apps/dollystatus/src/main/resources/application.yml @@ -3,12 +3,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/endringsmelding-frontend/src/main/resources/application.yml b/apps/endringsmelding-frontend/src/main/resources/application.yml index 38f3e2e9a89..0437a6213d6 100644 --- a/apps/endringsmelding-frontend/src/main/resources/application.yml +++ b/apps/endringsmelding-frontend/src/main/resources/application.yml @@ -44,12 +44,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/endringsmelding-service/src/main/resources/application.yml b/apps/endringsmelding-service/src/main/resources/application.yml index d7cdb8c63fc..d552f471d1e 100644 --- a/apps/endringsmelding-service/src/main/resources/application.yml +++ b/apps/endringsmelding-service/src/main/resources/application.yml @@ -45,12 +45,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true health: elasticsearch: enabled: false diff --git a/apps/faste-data-frontend/src/main/resources/application.yml b/apps/faste-data-frontend/src/main/resources/application.yml index 47faf21eb99..6d226e085c8 100644 --- a/apps/faste-data-frontend/src/main/resources/application.yml +++ b/apps/faste-data-frontend/src/main/resources/application.yml @@ -62,12 +62,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/generer-arbeidsforhold-populasjon-service/src/main/resources/application.yml b/apps/generer-arbeidsforhold-populasjon-service/src/main/resources/application.yml index 3c4d2f1263e..716b962f019 100644 --- a/apps/generer-arbeidsforhold-populasjon-service/src/main/resources/application.yml +++ b/apps/generer-arbeidsforhold-populasjon-service/src/main/resources/application.yml @@ -48,12 +48,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/generer-navn-service/src/main/resources/application.yml b/apps/generer-navn-service/src/main/resources/application.yml index 5777e19d691..f470d5ceed7 100644 --- a/apps/generer-navn-service/src/main/resources/application.yml +++ b/apps/generer-navn-service/src/main/resources/application.yml @@ -29,12 +29,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/generer-organisasjon-populasjon-service/src/main/resources/application.yml b/apps/generer-organisasjon-populasjon-service/src/main/resources/application.yml index 241b6cc21ef..c26902af9b9 100644 --- a/apps/generer-organisasjon-populasjon-service/src/main/resources/application.yml +++ b/apps/generer-organisasjon-populasjon-service/src/main/resources/application.yml @@ -41,12 +41,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/generer-synt-amelding-service/src/main/resources/application.yml b/apps/generer-synt-amelding-service/src/main/resources/application.yml index e50b841c107..df0c280972e 100644 --- a/apps/generer-synt-amelding-service/src/main/resources/application.yml +++ b/apps/generer-synt-amelding-service/src/main/resources/application.yml @@ -38,12 +38,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/helsepersonell-service/src/main/resources/application.yml b/apps/helsepersonell-service/src/main/resources/application.yml index 43f90ed6aca..da7af8a8eee 100644 --- a/apps/helsepersonell-service/src/main/resources/application.yml +++ b/apps/helsepersonell-service/src/main/resources/application.yml @@ -29,12 +29,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/inntektsmelding-generator-service/src/main/resources/application.yml b/apps/inntektsmelding-generator-service/src/main/resources/application.yml index 593df4d3e10..edb4821e98f 100644 --- a/apps/inntektsmelding-generator-service/src/main/resources/application.yml +++ b/apps/inntektsmelding-generator-service/src/main/resources/application.yml @@ -24,12 +24,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/inntektsmelding-service/src/main/resources/application.yml b/apps/inntektsmelding-service/src/main/resources/application.yml index dc654d232cf..3e93ae1704b 100644 --- a/apps/inntektsmelding-service/src/main/resources/application.yml +++ b/apps/inntektsmelding-service/src/main/resources/application.yml @@ -40,12 +40,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/jenkins-batch-status-service/src/main/resources/application.yml b/apps/jenkins-batch-status-service/src/main/resources/application.yml index 12bda26837d..38b6be1140a 100644 --- a/apps/jenkins-batch-status-service/src/main/resources/application.yml +++ b/apps/jenkins-batch-status-service/src/main/resources/application.yml @@ -41,12 +41,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/joark-dokument-service/src/main/resources/application.yml b/apps/joark-dokument-service/src/main/resources/application.yml index 50215c47d64..76d160784c6 100644 --- a/apps/joark-dokument-service/src/main/resources/application.yml +++ b/apps/joark-dokument-service/src/main/resources/application.yml @@ -34,12 +34,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/kodeverk-service/src/main/resources/application.yml b/apps/kodeverk-service/src/main/resources/application.yml index 824b314a535..7f880895661 100644 --- a/apps/kodeverk-service/src/main/resources/application.yml +++ b/apps/kodeverk-service/src/main/resources/application.yml @@ -22,12 +22,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/levende-arbeidsforhold-ansettelse/src/main/resources/application.yml b/apps/levende-arbeidsforhold-ansettelse/src/main/resources/application.yml index 29a6a0e10d4..9e676dc80e1 100644 --- a/apps/levende-arbeidsforhold-ansettelse/src/main/resources/application.yml +++ b/apps/levende-arbeidsforhold-ansettelse/src/main/resources/application.yml @@ -28,13 +28,15 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - health.show-details: always - heapdump.enabled: true - prometheus.enabled: true + health: + show-details: always + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/levende-arbeidsforhold-scheduler/src/main/resources/application.yml b/apps/levende-arbeidsforhold-scheduler/src/main/resources/application.yml index e1281b264c9..0ade711cee5 100644 --- a/apps/levende-arbeidsforhold-scheduler/src/main/resources/application.yml +++ b/apps/levende-arbeidsforhold-scheduler/src/main/resources/application.yml @@ -25,12 +25,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/levende-arbeidsforhold-service/src/main/resources/application.yml b/apps/levende-arbeidsforhold-service/src/main/resources/application.yml index bd6d7946969..9366022b2f8 100644 --- a/apps/levende-arbeidsforhold-service/src/main/resources/application.yml +++ b/apps/levende-arbeidsforhold-service/src/main/resources/application.yml @@ -28,12 +28,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/miljoer-service/src/main/resources/application.yml b/apps/miljoer-service/src/main/resources/application.yml index 41fae00bc00..47f1bcc1780 100644 --- a/apps/miljoer-service/src/main/resources/application.yml +++ b/apps/miljoer-service/src/main/resources/application.yml @@ -31,12 +31,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/oppsummeringsdokument-service/src/main/resources/application.yml b/apps/oppsummeringsdokument-service/src/main/resources/application.yml index a3800a156d5..780c6e746f0 100644 --- a/apps/oppsummeringsdokument-service/src/main/resources/application.yml +++ b/apps/oppsummeringsdokument-service/src/main/resources/application.yml @@ -30,12 +30,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/organisasjon-bestilling-service/src/main/resources/application.yml b/apps/organisasjon-bestilling-service/src/main/resources/application.yml index 5d10b138922..e8d0b3a450e 100644 --- a/apps/organisasjon-bestilling-service/src/main/resources/application.yml +++ b/apps/organisasjon-bestilling-service/src/main/resources/application.yml @@ -33,12 +33,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/organisasjon-faste-data-service/src/main/resources/application.yml b/apps/organisasjon-faste-data-service/src/main/resources/application.yml index b35c5e82706..f0e7149af43 100644 --- a/apps/organisasjon-faste-data-service/src/main/resources/application.yml +++ b/apps/organisasjon-faste-data-service/src/main/resources/application.yml @@ -38,12 +38,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/organisasjon-forvalter/src/main/resources/application.yml b/apps/organisasjon-forvalter/src/main/resources/application.yml index 095c0107efa..8e48224db96 100644 --- a/apps/organisasjon-forvalter/src/main/resources/application.yml +++ b/apps/organisasjon-forvalter/src/main/resources/application.yml @@ -63,12 +63,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/organisasjon-mottak-service/src/main/resources/application.yml b/apps/organisasjon-mottak-service/src/main/resources/application.yml index f5454299df6..77d033f0b1c 100644 --- a/apps/organisasjon-mottak-service/src/main/resources/application.yml +++ b/apps/organisasjon-mottak-service/src/main/resources/application.yml @@ -49,12 +49,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/organisasjon-service/src/main/resources/application.yml b/apps/organisasjon-service/src/main/resources/application.yml index 9f897c11c45..64de1fe9017 100644 --- a/apps/organisasjon-service/src/main/resources/application.yml +++ b/apps/organisasjon-service/src/main/resources/application.yml @@ -34,12 +34,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/organisasjon-tilgang-service/src/main/resources/application.yml b/apps/organisasjon-tilgang-service/src/main/resources/application.yml index 543d3d30f23..3f5e8bd26ec 100644 --- a/apps/organisasjon-tilgang-service/src/main/resources/application.yml +++ b/apps/organisasjon-tilgang-service/src/main/resources/application.yml @@ -38,12 +38,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/orgnummer-service/src/main/resources/application.yml b/apps/orgnummer-service/src/main/resources/application.yml index 7928e2c4f00..2de7966ba4c 100644 --- a/apps/orgnummer-service/src/main/resources/application.yml +++ b/apps/orgnummer-service/src/main/resources/application.yml @@ -43,12 +43,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/oversikt-frontend/src/main/resources/application.yml b/apps/oversikt-frontend/src/main/resources/application.yml index cab26a3240a..cdd1bac15de 100644 --- a/apps/oversikt-frontend/src/main/resources/application.yml +++ b/apps/oversikt-frontend/src/main/resources/application.yml @@ -39,12 +39,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/pdl-forvalter/src/main/resources/application.yml b/apps/pdl-forvalter/src/main/resources/application.yml index e2b6c90f4ca..5acfc5165d8 100644 --- a/apps/pdl-forvalter/src/main/resources/application.yml +++ b/apps/pdl-forvalter/src/main/resources/application.yml @@ -56,12 +56,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true health: elasticsearch: enabled: false diff --git a/apps/person-faste-data-service/src/main/resources/application.yml b/apps/person-faste-data-service/src/main/resources/application.yml index 96c6b85b36e..aaa24d49517 100644 --- a/apps/person-faste-data-service/src/main/resources/application.yml +++ b/apps/person-faste-data-service/src/main/resources/application.yml @@ -32,12 +32,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/person-organisasjon-tilgang-service/src/main/resources/application.yml b/apps/person-organisasjon-tilgang-service/src/main/resources/application.yml index 1da5b3b1184..095b0b2f172 100644 --- a/apps/person-organisasjon-tilgang-service/src/main/resources/application.yml +++ b/apps/person-organisasjon-tilgang-service/src/main/resources/application.yml @@ -38,12 +38,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/person-search-service/src/main/resources/application.yml b/apps/person-search-service/src/main/resources/application.yml index 1aecee96702..e2fbb948c45 100644 --- a/apps/person-search-service/src/main/resources/application.yml +++ b/apps/person-search-service/src/main/resources/application.yml @@ -41,12 +41,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/person-service/src/main/resources/application.yml b/apps/person-service/src/main/resources/application.yml index 6a61ab08e39..8c6411c1eaf 100644 --- a/apps/person-service/src/main/resources/application.yml +++ b/apps/person-service/src/main/resources/application.yml @@ -39,12 +39,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/profil-api/src/main/resources/application.yml b/apps/profil-api/src/main/resources/application.yml index 4c9b6cac076..6d87e3d1b3f 100644 --- a/apps/profil-api/src/main/resources/application.yml +++ b/apps/profil-api/src/main/resources/application.yml @@ -41,12 +41,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/skattekort-service/src/main/resources/application.yml b/apps/skattekort-service/src/main/resources/application.yml index 51e2bcada96..72a52109bee 100644 --- a/apps/skattekort-service/src/main/resources/application.yml +++ b/apps/skattekort-service/src/main/resources/application.yml @@ -23,12 +23,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/sykemelding-api/src/main/resources/application.yml b/apps/sykemelding-api/src/main/resources/application.yml index f1e9d0240b5..b49e9a7862a 100644 --- a/apps/sykemelding-api/src/main/resources/application.yml +++ b/apps/sykemelding-api/src/main/resources/application.yml @@ -31,12 +31,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/synt-sykemelding-api/src/main/resources/application.yml b/apps/synt-sykemelding-api/src/main/resources/application.yml index a9ff3f6ba65..70e49cef899 100644 --- a/apps/synt-sykemelding-api/src/main/resources/application.yml +++ b/apps/synt-sykemelding-api/src/main/resources/application.yml @@ -59,12 +59,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/synt-vedtakshistorikk-service/src/main/resources/application.yml b/apps/synt-vedtakshistorikk-service/src/main/resources/application.yml index 12285d7ae0a..3ab20446b84 100644 --- a/apps/synt-vedtakshistorikk-service/src/main/resources/application.yml +++ b/apps/synt-vedtakshistorikk-service/src/main/resources/application.yml @@ -65,12 +65,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/tenor-search-service/src/main/resources/application.yml b/apps/tenor-search-service/src/main/resources/application.yml index 765f641ea55..72f6aa800c2 100644 --- a/apps/tenor-search-service/src/main/resources/application.yml +++ b/apps/tenor-search-service/src/main/resources/application.yml @@ -29,12 +29,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/testnav-ident-pool/src/main/resources/application.yml b/apps/testnav-ident-pool/src/main/resources/application.yml index eec84e92cc7..50680851ade 100644 --- a/apps/testnav-ident-pool/src/main/resources/application.yml +++ b/apps/testnav-ident-pool/src/main/resources/application.yml @@ -15,12 +15,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/testnorge-statisk-data-forvalter/src/main/resources/application.yml b/apps/testnorge-statisk-data-forvalter/src/main/resources/application.yml index fb9d79b9227..52b818eb1db 100644 --- a/apps/testnorge-statisk-data-forvalter/src/main/resources/application.yml +++ b/apps/testnorge-statisk-data-forvalter/src/main/resources/application.yml @@ -83,12 +83,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/tilbakemelding-api/src/main/resources/application.yml b/apps/tilbakemelding-api/src/main/resources/application.yml index f90336663c1..fdf868899a9 100644 --- a/apps/tilbakemelding-api/src/main/resources/application.yml +++ b/apps/tilbakemelding-api/src/main/resources/application.yml @@ -38,12 +38,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/tps-messaging-service/src/main/resources/application.yml b/apps/tps-messaging-service/src/main/resources/application.yml index c36f3d7945a..b7c23264167 100644 --- a/apps/tps-messaging-service/src/main/resources/application.yml +++ b/apps/tps-messaging-service/src/main/resources/application.yml @@ -50,12 +50,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true health: show-details: always health: diff --git a/apps/udi-stub/src/main/resources/application.yml b/apps/udi-stub/src/main/resources/application.yml index 0072dcc00e8..6d4f4085497 100644 --- a/apps/udi-stub/src/main/resources/application.yml +++ b/apps/udi-stub/src/main/resources/application.yml @@ -33,12 +33,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: diff --git a/apps/varslinger-service/src/main/resources/application.yml b/apps/varslinger-service/src/main/resources/application.yml index 2308249ef43..55331eeaa37 100644 --- a/apps/varslinger-service/src/main/resources/application.yml +++ b/apps/varslinger-service/src/main/resources/application.yml @@ -29,12 +29,13 @@ management: enabled-by-default: true web: base-path: /internal - exposure.include: prometheus,heapdump,health + exposure: + include: prometheus,health path-mapping: prometheus: metrics endpoint: - prometheus.enabled: true - heapdump.enabled: true + prometheus: + enabled: true prometheus: metrics: export: From 4bf6d6ca10efad7c195bf972bcba71050ee97050 Mon Sep 17 00:00:00 2001 From: Stian Gustavsson Date: Mon, 6 Jan 2025 10:19:43 +0100 Subject: [PATCH 55/59] Fjernet utdatert z-ident migrering fra doc Fjernet z-ident migreringsinfo som ikke lenger er gyldig og en lenke som ikke eksisterer lenger --- docs/solution-description/azure-ad-og-z-ident.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/docs/solution-description/azure-ad-og-z-ident.md b/docs/solution-description/azure-ad-og-z-ident.md index faf91d76a7c..ee5139cf616 100644 --- a/docs/solution-description/azure-ad-og-z-ident.md +++ b/docs/solution-description/azure-ad-og-z-ident.md @@ -75,9 +75,3 @@ Med access_tokene, som brukes i kommunikasjon fra frontend til backend, vil back Det betyr at vi kan bruke dagens mekanismer for å hente ut epost istedenfor for Z-bruker i Dolly. I Dolly frontend vil vi nå ha mulighet til å hente ut personlige informasjon om brukeren. Som epost, navn osv... som vil hjelpe oss til bedre feilsøkning, og være et steg i å kunne hjelpe personer utenfor NAV. - -### Migererig fra Z-Bruker - -I en periode vil vi legge til funksjonalitet for å kunne kopiere en Z-bruker over til din personlige bruker. På den måten vil ingen miste allerede opprettede brukere. - -[Prototype](https://invis.io/ENXCGRI6XD8#/429665609_Innlogging_Personlig_ident_1) \ No newline at end of file From 3ab8b8e1e292b83a3fd9a698e9093ed5e9125bc9 Mon Sep 17 00:00:00 2001 From: Stian Gustavsson Date: Mon, 6 Jan 2025 11:32:54 +0100 Subject: [PATCH 56/59] - Fikset visning av kildedata i Tenor komponent, grunnet manglende suspense handling (#3711) --- .../js/src/pages/tenorSoek/resultatVisning/TabsVisning.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/dolly-frontend/src/main/js/src/pages/tenorSoek/resultatVisning/TabsVisning.tsx b/apps/dolly-frontend/src/main/js/src/pages/tenorSoek/resultatVisning/TabsVisning.tsx index 3724e2ed864..16545afd3df 100644 --- a/apps/dolly-frontend/src/main/js/src/pages/tenorSoek/resultatVisning/TabsVisning.tsx +++ b/apps/dolly-frontend/src/main/js/src/pages/tenorSoek/resultatVisning/TabsVisning.tsx @@ -1,7 +1,8 @@ import { Tabs } from '@navikt/ds-react' -import React, { lazy } from 'react' +import React, { lazy, Suspense } from 'react' import styled from 'styled-components' import { FileCodeIcon, KeyVerticalIcon } from '@navikt/aksel-icons' +import Loading from '@/components/ui/loading/Loading' const TabsVisningFormatter = styled.div` width: 100%; @@ -56,7 +57,9 @@ export const TabsVisning = ({ children, kildedata }: any) => { marginBottom: '15px', }} > - + }> + + From 8fef1a2f399f2cb592e93d8ed311fc7349acf18f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristen=20H=C3=A6rum?= Date: Mon, 6 Jan 2025 15:38:11 +0100 Subject: [PATCH 57/59] Rydde apper relatert til Altinn2 (#3708) Rydde apper relatert til Altinn2 --- .../app.organisasjon-tilgang-service.yml | 21 -- ...pp.person-organisasjon-tilgang-service.yml | 23 -- apps/altinn3-tilgang-service/config.dev.yml | 1 + ...java => AltinnTilgangServiceConsumer.java} | 4 +- .../service/ValidateService.java | 7 +- .../main/resources/application-virtual.yml | 6 +- .../src/test/resources/application-test.yml | 2 +- apps/organisasjon-tilgang-service/Dockerfile | 8 - apps/organisasjon-tilgang-service/README.md | 6 - .../organisasjon-tilgang-service/build.gradle | 32 --- apps/organisasjon-tilgang-service/config.yml | 79 ------ .../gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - apps/organisasjon-tilgang-service/gradlew | 234 ------------------ apps/organisasjon-tilgang-service/gradlew.bat | 89 ------- .../gradlewUpdate.sh | 3 - .../settings.gradle | 17 -- ...asjonTilgangServiceApplicationStarter.java | 21 -- .../config/AltinnConfig.java | 24 -- .../config/JacksonConfig.java | 27 -- .../config/MaskinportenConfig.java | 24 -- .../config/OpenApiConfig.java | 49 ---- .../config/R2DBCConfiguration.java | 39 --- .../config/SecurityConfig.java | 40 --- .../consumer/altinn/v1/AltinnConsumer.java | 151 ----------- .../CreateOrganisasjonAccessCommand.java | 47 ---- .../DeleteOrganisasjonAccessCommand.java | 46 ---- .../v1/command/GetOrganisasjonCommand.java | 38 --- .../altinn/v1/command/GetRightsCommand.java | 43 ---- .../consumer/altinn/v1/dto/DeleteStatus.java | 16 -- .../altinn/v1/dto/OrganisasjonDTO.java | 8 - .../consumer/altinn/v1/dto/RightDTO.java | 21 -- .../maskinporten/v1/MaskinportenConsumer.java | 94 ------- .../v1/command/GetAccessTokenCommand.java | 40 --- .../v1/command/GetWellKnownCommand.java | 34 --- .../maskinporten/v1/dto/AccessToken.java | 16 -- .../maskinporten/v1/dto/WellKnown.java | 18 -- .../OrganisasjonMiljoeConsumer.java | 41 --- .../OrganisasjonTilgangConsumer.java | 53 ---- .../request/OrganisasjonAccessRequest.java | 11 - .../database/entity/OrganisasjonTilgang.java | 27 -- .../OrganisasjonTilgangRepository.java | 16 -- .../domain/AccessToken.java | 7 - .../domain/Organisasjon.java | 29 --- .../domain/OrganisasjonResponse.java | 21 -- .../mapper/MapperFacadeConfig.java | 35 --- .../mapper/MappingStrategy.java | 19 -- .../OrganisajonTilgangMappingStrategy.java | 33 --- .../service/MiljoerOversiktService.java | 42 ---- .../service/OrganisasjonTilgangService.java | 69 ------ .../src/main/resources/application-local.yml | 17 -- .../src/main/resources/application-prod.yml | 12 - .../src/main/resources/application.yml | 57 ----- .../db/migration/V1.0.0__CreateTables.sql | 10 - .../src/main/resources/logback-spring.xml | 41 --- .../ApplicationContextTest.java | 28 --- .../src/test/resources/application-test.yml | 13 - apps/oversikt-frontend/build.gradle | 1 + apps/oversikt-frontend/config.yml | 59 +---- apps/oversikt-frontend/settings.gradle | 1 + .../OversiktFrontendApplicationStarter.java | 6 +- .../oversiktfrontend/config/Consumers.java | 2 +- .../AltinnTilgangServiceConsumer.java | 59 +++++ .../PersonOrganisasjonTilgangConsumer.java | 71 ------ ...GetAltinnBrukertilgangTilgangCommand.java} | 13 +- .../GetPersonOrganisasjonTilgangCommand.java | 31 --- .../consumer/dto/AltinnBrukerRequest.java | 11 + .../consumer/dto/OrganisasjonDTO.java | 11 - .../PersonOrganisasjonController.java | 23 ++ .../service/AccessService.java | 6 +- .../src/main/js/proxy-routes.json | 4 - .../js/src/pages/UserPage/OrgTableBox.tsx | 2 +- .../js/src/services/OrganisasjonService.ts | 5 +- .../src/main/resources/application-local.yml | 4 +- .../src/main/resources/application.yml | 6 +- .../Dockerfile | 6 - .../README.md | 6 - .../build.gradle | 39 --- .../config.yml | 69 ------ .../gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - .../gradlew | 234 ------------------ .../gradlew.bat | 89 ------- .../gradlewUpdate.sh | 3 - .../settings.gradle | 19 -- ...asjonTilgangServiceApplicationStarter.java | 22 -- .../client/altinn/v1/AltinnClient.java | 78 ------ .../v1/command/GetPersonAccessCommand.java | 48 ---- .../client/altinn/v1/dto/AccessDTO.java | 21 -- .../maskinporten/v1/MaskinportenClient.java | 91 ------- .../v1/command/GetAccessTokenCommand.java | 40 --- .../v1/command/GetWellKnownCommand.java | 34 --- .../maskinporten/v1/dto/AccessToken.java | 16 -- .../client/maskinporten/v1/dto/WellKnown.java | 18 -- .../config/AltinnConfig.java | 41 --- .../config/JacksonConfig.java | 27 -- .../config/MaskinportenConfig.java | 41 --- .../config/OpenApiConfig.java | 49 ---- .../config/SecurityConfig.java | 40 --- .../PersonOrganisasjonController.java | 42 ---- .../controller/dto/OrganisasjonDTO.java | 14 -- .../persontilgangservice/domain/Access.java | 29 --- .../domain/AccessToken.java | 7 - .../service/PersonOrganisasjonService.java | 31 --- .../src/main/resources/application-local.yml | 15 -- .../main/resources/application-virtual.yml | 20 -- .../src/main/resources/application.yml | 57 ----- .../src/main/resources/logback-spring.xml | 54 ---- .../ApplicationContextTest.java | 20 -- .../PersonTilgangServiceIntegrationTest.java | 101 -------- .../src/test/resources/application-test.yml | 13 - .../src/test/resources/logback-spring.xml | 20 -- apps/profil-api/config.test.yml | 10 +- apps/profil-api/config.yml | 10 +- .../profil/ProfilApiApplicationStarter.java | 5 +- .../testnorge/profil/config/Consumers.java | 2 +- .../profil/config/SecurityConfiguration.java | 2 - .../consumer/AzureAdProfileConsumer.java | 7 +- .../PersonOrganisasjonTilgangConsumer.java | 51 ++-- .../GetPersonOrganisasjonTilgangCommand.java | 23 +- .../consumer/command/GetProfileCommand.java | 3 +- .../command/GetProfileImageCommand.java | 3 +- .../profil/consumer/dto/AltinnRequestDTO.java | 13 + .../profil/consumer/dto/OrganisasjonDTO.java | 14 -- .../profil/provider/ProfilController.java | 2 +- .../profil/service/AzureAdTokenService.java | 7 +- .../profil/service/ProfilService.java | 7 +- .../profil/util/WebClientFilter.java | 14 -- .../src/main/resources/application-local.yml | 9 +- .../src/main/resources/application.yml | 6 +- .../src/test/resources/application-test.yml | 9 +- proxies/altinn3-tilgang-proxy/config.yml | 1 + 132 files changed, 218 insertions(+), 3668 deletions(-) delete mode 100644 .github/workflows/app.organisasjon-tilgang-service.yml delete mode 100644 .github/workflows/app.person-organisasjon-tilgang-service.yml rename apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/{PersonOrganisasjonTilgangConsumer.java => AltinnTilgangServiceConsumer.java} (95%) delete mode 100644 apps/organisasjon-tilgang-service/Dockerfile delete mode 100644 apps/organisasjon-tilgang-service/README.md delete mode 100644 apps/organisasjon-tilgang-service/build.gradle delete mode 100644 apps/organisasjon-tilgang-service/config.yml delete mode 100644 apps/organisasjon-tilgang-service/gradle/wrapper/gradle-wrapper.jar delete mode 100644 apps/organisasjon-tilgang-service/gradle/wrapper/gradle-wrapper.properties delete mode 100755 apps/organisasjon-tilgang-service/gradlew delete mode 100644 apps/organisasjon-tilgang-service/gradlew.bat delete mode 100755 apps/organisasjon-tilgang-service/gradlewUpdate.sh delete mode 100644 apps/organisasjon-tilgang-service/settings.gradle delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/OrganisasjonTilgangServiceApplicationStarter.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/config/AltinnConfig.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/config/JacksonConfig.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/config/MaskinportenConfig.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/config/OpenApiConfig.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/config/R2DBCConfiguration.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/config/SecurityConfig.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/AltinnConsumer.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/command/CreateOrganisasjonAccessCommand.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/command/DeleteOrganisasjonAccessCommand.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/command/GetOrganisasjonCommand.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/command/GetRightsCommand.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/dto/DeleteStatus.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/dto/OrganisasjonDTO.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/dto/RightDTO.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/maskinporten/v1/MaskinportenConsumer.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/maskinporten/v1/command/GetAccessTokenCommand.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/maskinporten/v1/command/GetWellKnownCommand.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/maskinporten/v1/dto/AccessToken.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/maskinporten/v1/dto/WellKnown.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/controller/OrganisasjonMiljoeConsumer.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/controller/OrganisasjonTilgangConsumer.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/controller/request/OrganisasjonAccessRequest.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/database/entity/OrganisasjonTilgang.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/database/repository/OrganisasjonTilgangRepository.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/domain/AccessToken.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/domain/Organisasjon.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/domain/OrganisasjonResponse.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/mapper/MapperFacadeConfig.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/mapper/MappingStrategy.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/mapper/OrganisajonTilgangMappingStrategy.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/service/MiljoerOversiktService.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/service/OrganisasjonTilgangService.java delete mode 100644 apps/organisasjon-tilgang-service/src/main/resources/application-local.yml delete mode 100644 apps/organisasjon-tilgang-service/src/main/resources/application-prod.yml delete mode 100644 apps/organisasjon-tilgang-service/src/main/resources/application.yml delete mode 100644 apps/organisasjon-tilgang-service/src/main/resources/db/migration/V1.0.0__CreateTables.sql delete mode 100644 apps/organisasjon-tilgang-service/src/main/resources/logback-spring.xml delete mode 100644 apps/organisasjon-tilgang-service/src/test/java/no/nav/testnav/apps/organisasjontilgangservice/ApplicationContextTest.java delete mode 100644 apps/organisasjon-tilgang-service/src/test/resources/application-test.yml create mode 100644 apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/AltinnTilgangServiceConsumer.java delete mode 100644 apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/PersonOrganisasjonTilgangConsumer.java rename apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/command/{GetPersonOrganisasjonerTilgangCommand.java => GetAltinnBrukertilgangTilgangCommand.java} (64%) delete mode 100644 apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/command/GetPersonOrganisasjonTilgangCommand.java create mode 100644 apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/dto/AltinnBrukerRequest.java delete mode 100644 apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/dto/OrganisasjonDTO.java create mode 100644 apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/controller/PersonOrganisasjonController.java delete mode 100644 apps/person-organisasjon-tilgang-service/Dockerfile delete mode 100644 apps/person-organisasjon-tilgang-service/README.md delete mode 100644 apps/person-organisasjon-tilgang-service/build.gradle delete mode 100644 apps/person-organisasjon-tilgang-service/config.yml delete mode 100644 apps/person-organisasjon-tilgang-service/gradle/wrapper/gradle-wrapper.jar delete mode 100644 apps/person-organisasjon-tilgang-service/gradle/wrapper/gradle-wrapper.properties delete mode 100755 apps/person-organisasjon-tilgang-service/gradlew delete mode 100644 apps/person-organisasjon-tilgang-service/gradlew.bat delete mode 100755 apps/person-organisasjon-tilgang-service/gradlewUpdate.sh delete mode 100644 apps/person-organisasjon-tilgang-service/settings.gradle delete mode 100644 apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/PersonOrganisasjonTilgangServiceApplicationStarter.java delete mode 100644 apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/altinn/v1/AltinnClient.java delete mode 100644 apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/altinn/v1/command/GetPersonAccessCommand.java delete mode 100644 apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/altinn/v1/dto/AccessDTO.java delete mode 100644 apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/maskinporten/v1/MaskinportenClient.java delete mode 100644 apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/maskinporten/v1/command/GetAccessTokenCommand.java delete mode 100644 apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/maskinporten/v1/command/GetWellKnownCommand.java delete mode 100644 apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/maskinporten/v1/dto/AccessToken.java delete mode 100644 apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/maskinporten/v1/dto/WellKnown.java delete mode 100644 apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/config/AltinnConfig.java delete mode 100644 apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/config/JacksonConfig.java delete mode 100644 apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/config/MaskinportenConfig.java delete mode 100644 apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/config/OpenApiConfig.java delete mode 100644 apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/config/SecurityConfig.java delete mode 100644 apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/controller/PersonOrganisasjonController.java delete mode 100644 apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/controller/dto/OrganisasjonDTO.java delete mode 100644 apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/domain/Access.java delete mode 100644 apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/domain/AccessToken.java delete mode 100644 apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/service/PersonOrganisasjonService.java delete mode 100644 apps/person-organisasjon-tilgang-service/src/main/resources/application-local.yml delete mode 100644 apps/person-organisasjon-tilgang-service/src/main/resources/application-virtual.yml delete mode 100644 apps/person-organisasjon-tilgang-service/src/main/resources/application.yml delete mode 100644 apps/person-organisasjon-tilgang-service/src/main/resources/logback-spring.xml delete mode 100644 apps/person-organisasjon-tilgang-service/src/test/java/no/nav/testnav/apps/persontilgangservice/ApplicationContextTest.java delete mode 100644 apps/person-organisasjon-tilgang-service/src/test/java/no/nav/testnav/apps/persontilgangservice/integrationtest/PersonTilgangServiceIntegrationTest.java delete mode 100644 apps/person-organisasjon-tilgang-service/src/test/resources/application-test.yml delete mode 100644 apps/person-organisasjon-tilgang-service/src/test/resources/logback-spring.xml create mode 100644 apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/dto/AltinnRequestDTO.java delete mode 100644 apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/dto/OrganisasjonDTO.java delete mode 100644 apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/util/WebClientFilter.java diff --git a/.github/workflows/app.organisasjon-tilgang-service.yml b/.github/workflows/app.organisasjon-tilgang-service.yml deleted file mode 100644 index 229fcbb1fcd..00000000000 --- a/.github/workflows/app.organisasjon-tilgang-service.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: organisasjon-tilgang-service - -on: - push: - paths: - - "plugins/**" - - "libs/reactive-core/**" - - "libs/reactive-security/**" - - "apps/organisasjon-tilgang-service/**" - - ".github/workflows/app.organisasjon-tilgang-service.yml" - -jobs: - workflow: - uses: ./.github/workflows/common.workflow.backend.yml - with: - working-directory: "apps/organisasjon-tilgang-service" - deploy-tag: "#deploy-organisasjon-tilgang-service" - permissions: - contents: read - id-token: write - secrets: inherit diff --git a/.github/workflows/app.person-organisasjon-tilgang-service.yml b/.github/workflows/app.person-organisasjon-tilgang-service.yml deleted file mode 100644 index 6136dd68925..00000000000 --- a/.github/workflows/app.person-organisasjon-tilgang-service.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: person-organisasjon-tilgang-service - -on: - push: - paths: - - "plugins/**" - - "libs/integration-test/**" - - "libs/reactive-core/**" - - "libs/reactive-security/**" - - "libs/security-core/**" - - "apps/person-organisasjon-tilgang-service/**" - - ".github/workflows/app.person-organisasjon-tilgang-service.yml" - -jobs: - workflow: - uses: ./.github/workflows/common.workflow.backend.yml - with: - working-directory: "apps/person-organisasjon-tilgang-service" - deploy-tag: "#deploy-person-organisasjon-tilgang-service" - permissions: - contents: read - id-token: write - secrets: inherit diff --git a/apps/altinn3-tilgang-service/config.dev.yml b/apps/altinn3-tilgang-service/config.dev.yml index 2c820f19977..6b66adf5c44 100644 --- a/apps/altinn3-tilgang-service/config.dev.yml +++ b/apps/altinn3-tilgang-service/config.dev.yml @@ -32,6 +32,7 @@ spec: - application: team-dolly-lokal-app - application: testnav-oversikt-frontend - application: testnav-bruker-service-dev + - application: testnorge-profil-api-dev outbound: external: - host: platform.tt02.altinn.no diff --git a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/PersonOrganisasjonTilgangConsumer.java b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/AltinnTilgangServiceConsumer.java similarity index 95% rename from apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/PersonOrganisasjonTilgangConsumer.java rename to apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/AltinnTilgangServiceConsumer.java index b29097a6057..986de3c3939 100644 --- a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/PersonOrganisasjonTilgangConsumer.java +++ b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/AltinnTilgangServiceConsumer.java @@ -11,14 +11,14 @@ import reactor.core.publisher.Mono; @Component -public class PersonOrganisasjonTilgangConsumer { +public class AltinnTilgangServiceConsumer { private final WebClient webClient; private final ServerProperties serverProperties; private final TokenExchange tokenExchange; private final GetAuthenticatedUserId getAuthenticatedUserId; - public PersonOrganisasjonTilgangConsumer( + public AltinnTilgangServiceConsumer( Consumers consumers, TokenExchange tokenExchange, WebClient.Builder webClientBuilder, diff --git a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/service/ValidateService.java b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/service/ValidateService.java index 1ada4106bb8..4f39d4eb895 100644 --- a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/service/ValidateService.java +++ b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/service/ValidateService.java @@ -1,7 +1,7 @@ package no.nav.testnav.apps.brukerservice.service; import lombok.RequiredArgsConstructor; -import no.nav.testnav.apps.brukerservice.consumer.PersonOrganisasjonTilgangConsumer; +import no.nav.testnav.apps.brukerservice.consumer.AltinnTilgangServiceConsumer; import no.nav.testnav.apps.brukerservice.exception.UserHasNoAccessToOrgnisasjonException; import org.springframework.stereotype.Service; import reactor.core.publisher.Mono; @@ -9,10 +9,11 @@ @Service @RequiredArgsConstructor public class ValidateService { - private final PersonOrganisasjonTilgangConsumer client; + + private final AltinnTilgangServiceConsumer altinnTilgangServiceConsumer; public Mono validateOrganiasjonsnummerAccess(String organisasjonsnummer) { - return client + return altinnTilgangServiceConsumer .getOrganisasjon(organisasjonsnummer) .doOnNext(organisasjon -> { if (!organisasjon.getOrganisasjonsnummer().equals(organisasjonsnummer)) { diff --git a/apps/bruker-service/src/main/resources/application-virtual.yml b/apps/bruker-service/src/main/resources/application-virtual.yml index b45d934be91..0de519e330b 100644 --- a/apps/bruker-service/src/main/resources/application-virtual.yml +++ b/apps/bruker-service/src/main/resources/application-virtual.yml @@ -23,11 +23,11 @@ spring: password: compose-postgres consumers: - testnav-person-organisasjon-tilgang-service: - url: http://testnav-person-organisasjon-tilgang-service:8080 + testnav-altinn3-tilgang-service: + url: http://testnav-altinn3-tilgang-service:8080 cluster: dev-gcp namespace: dolly - name: testnav-person-organisasjon-tilgang-service + name: testnav-altinn3-tilgang-service TOKEN_X_WELL_KNOWN_URL: http://tokendings:8080/.well-known/oauth-authorization-server TOKEN_X_CLIENT_ID: dev-gcp:dolly:testnav-bruker-service diff --git a/apps/bruker-service/src/test/resources/application-test.yml b/apps/bruker-service/src/test/resources/application-test.yml index 5ac5d4b6204..9f9350113ba 100644 --- a/apps/bruker-service/src/test/resources/application-test.yml +++ b/apps/bruker-service/src/test/resources/application-test.yml @@ -20,5 +20,5 @@ spring: jwk-set-uri: ${wiremockBaseUrl}/jwks consumers: - testnav-person-organisasjon-tilgang-service: + testnav-altinn3-tilgang-service: url: ${wiremockBaseUrl} \ No newline at end of file diff --git a/apps/organisasjon-tilgang-service/Dockerfile b/apps/organisasjon-tilgang-service/Dockerfile deleted file mode 100644 index 5adc5c61063..00000000000 --- a/apps/organisasjon-tilgang-service/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM ghcr.io/navikt/baseimages/temurin:21 -LABEL maintainer="Team Dolly" - -ADD build/libs/app.jar /app/app.jar - -ENV JAVA_OPTS="--add-opens java.base/java.lang=ALL-UNNAMED" - -EXPOSE 8080 \ No newline at end of file diff --git a/apps/organisasjon-tilgang-service/README.md b/apps/organisasjon-tilgang-service/README.md deleted file mode 100644 index 7e9442ea085..00000000000 --- a/apps/organisasjon-tilgang-service/README.md +++ /dev/null @@ -1,6 +0,0 @@ -## organisajon-tilgang-service -Service som godkjenner tilganger for en spesifisert organisasjoner mot Dolly ved bruk av bankid. - -## Lokal kjøring -* [Generelt.](../../docs/local_general.md) -* [Secret Manager.](../../docs/local_secretmanager.md) diff --git a/apps/organisasjon-tilgang-service/build.gradle b/apps/organisasjon-tilgang-service/build.gradle deleted file mode 100644 index 7ec15dac6dc..00000000000 --- a/apps/organisasjon-tilgang-service/build.gradle +++ /dev/null @@ -1,32 +0,0 @@ -plugins { - id "dolly-apps" -} - -sonarqube { - properties { - property "sonar.projectKey", "testnav-organisasjon-tilgang-service" - property "sonar.projectName", "testnav-organisasjon-tilgang-service" - } -} - -dependencies { - implementation "no.nav.testnav.libs:reactive-core" - implementation "no.nav.testnav.libs:reactive-security" - - implementation "org.springframework.boot:spring-boot-starter-oauth2-resource-server" - - implementation "org.springframework.boot:spring-boot-starter-data-r2dbc" - runtimeOnly "org.postgresql:postgresql" - implementation "io.r2dbc:r2dbc-h2" - implementation "org.postgresql:r2dbc-postgresql" - implementation "org.flywaydb:flyway-core" - implementation "org.flywaydb:flyway-database-postgresql" - - implementation "ma.glasnost.orika:orika-core:$versions.orika" - - implementation "org.springdoc:springdoc-openapi-starter-webflux-ui:$versions.springdoc" - implementation "io.swagger.core.v3:swagger-annotations-jakarta:$versions.swagger" - - testImplementation "org.springframework.cloud:spring-cloud-contract-wiremock" -} - diff --git a/apps/organisasjon-tilgang-service/config.yml b/apps/organisasjon-tilgang-service/config.yml deleted file mode 100644 index 497d5fdc323..00000000000 --- a/apps/organisasjon-tilgang-service/config.yml +++ /dev/null @@ -1,79 +0,0 @@ -apiVersion: "nais.io/v1alpha1" -kind: "Application" -metadata: - name: testnav-organisasjon-tilgang-service - namespace: dolly - labels: - team: dolly -spec: - tokenx: - enabled: true - image: "{{image}}" - port: 8080 - webproxy: true - azure: - application: - enabled: true - tenant: nav.no - claims: - groups: - - id: 9c7efec1-1599-4216-a67e-6fd53a6a951c - accessPolicy: - inbound: - rules: - - application: dolly-frontend - - application: dolly-frontend-dev - - application: dolly-frontend-dev-unstable - - application: dolly-idporten - - application: team-dolly-lokal-app - - application: testnav-oversikt-frontend - outbound: - external: - - host: altinn.no - - host: maskinporten.no - liveness: - path: /internal/isAlive - initialDelay: 10 - periodSeconds: 5 - failureThreshold: 500 - observability: - logging: - destinations: - - id: elastic - autoInstrumentation: - enabled: true - runtime: java - readiness: - path: /internal/isReady - initialDelay: 10 - periodSeconds: 5 - failureThreshold: 500 - prometheus: - enabled: true - path: /internal/metrics - envFrom: - - secret: altinn-prod - - secret: google-sql-testnav-organisasjon-tilgang-service - - secret: maskinporten-dolly-prod - replicas: - min: 1 - max: 1 - resources: - requests: - cpu: 200m - memory: 1024Mi - limits: - memory: 2048Mi - ingresses: - - "https://testnav-organisasjon-tilgang-service.intern.dev.nav.no" - env: - - name: SPRING_PROFILES_ACTIVE - value: prod - gcp: - sqlInstances: - - type: POSTGRES_15 - tier: db-custom-1-3840 - name: testnav-organisasjon-tilganger - databases: - - name: testnav-organisasjon-tilganger - autoBackupHour: 2 \ No newline at end of file diff --git a/apps/organisasjon-tilgang-service/gradle/wrapper/gradle-wrapper.jar b/apps/organisasjon-tilgang-service/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL diff --git a/apps/organisasjon-tilgang-service/gradle/wrapper/gradle-wrapper.properties b/apps/organisasjon-tilgang-service/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 48c0a02ca41..00000000000 --- a/apps/organisasjon-tilgang-service/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/apps/organisasjon-tilgang-service/gradlew b/apps/organisasjon-tilgang-service/gradlew deleted file mode 100755 index 3da45c161b0..00000000000 --- a/apps/organisasjon-tilgang-service/gradlew +++ /dev/null @@ -1,234 +0,0 @@ -#!/bin/sh - -# -# Copyright ? 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions ?$var?, ?${var}?, ?${var:-default}?, ?${var+SET}?, -# ?${var#prefix}?, ?${var%suffix}?, and ?$( cmd )?; -# * compound commands having a testable exit status, especially ?case?; -# * various built-in commands including ?command?, ?set?, and ?ulimit?. -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/apps/organisasjon-tilgang-service/gradlew.bat b/apps/organisasjon-tilgang-service/gradlew.bat deleted file mode 100644 index ac1b06f9382..00000000000 --- a/apps/organisasjon-tilgang-service/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/apps/organisasjon-tilgang-service/gradlewUpdate.sh b/apps/organisasjon-tilgang-service/gradlewUpdate.sh deleted file mode 100755 index e5ee6361152..00000000000 --- a/apps/organisasjon-tilgang-service/gradlewUpdate.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -gradle wrapper \ No newline at end of file diff --git a/apps/organisasjon-tilgang-service/settings.gradle b/apps/organisasjon-tilgang-service/settings.gradle deleted file mode 100644 index 29ccda116b3..00000000000 --- a/apps/organisasjon-tilgang-service/settings.gradle +++ /dev/null @@ -1,17 +0,0 @@ -plugins { - id "com.gradle.develocity" version "3.17.4" -} - -rootProject.name = 'organisasjon-tilgang-service' - -includeBuild "../../plugins/java" - -includeBuild '../../libs/reactive-core' -includeBuild '../../libs/reactive-security' - -develocity { - buildScan { - termsOfUseUrl = "https://gradle.com/terms-of-service" - termsOfUseAgree = "yes" - } -} \ No newline at end of file diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/OrganisasjonTilgangServiceApplicationStarter.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/OrganisasjonTilgangServiceApplicationStarter.java deleted file mode 100644 index 5caffe6eb6f..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/OrganisasjonTilgangServiceApplicationStarter.java +++ /dev/null @@ -1,21 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice; - -import no.nav.testnav.libs.reactivecore.config.CoreConfig; -import no.nav.testnav.libs.reactivesecurity.config.SecureOAuth2ServerToServerConfiguration; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Import; -import org.springframework.web.reactive.config.EnableWebFlux; - -@Import({ - CoreConfig.class, - SecureOAuth2ServerToServerConfiguration.class -}) -@EnableWebFlux -@SpringBootApplication -public class OrganisasjonTilgangServiceApplicationStarter { - - public static void main(String[] args) { - SpringApplication.run(OrganisasjonTilgangServiceApplicationStarter.class, args); - } -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/config/AltinnConfig.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/config/AltinnConfig.java deleted file mode 100644 index 47ed78ed69c..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/config/AltinnConfig.java +++ /dev/null @@ -1,24 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.config; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; - -@Getter -@Configuration -@NoArgsConstructor -public class AltinnConfig { - - @Value("${altinn.api.url}") - private String url; - - @Value("${altinn.api.key}") - private String apiKey; - - @Value("${altinn.service.code}") - private String code; - - @Value("${altinn.service.edition}") - private String edition; -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/config/JacksonConfig.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/config/JacksonConfig.java deleted file mode 100644 index 7f0f4f61882..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/config/JacksonConfig.java +++ /dev/null @@ -1,27 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.config; - -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.RequiredArgsConstructor; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.codec.ServerCodecConfigurer; -import org.springframework.http.codec.json.Jackson2JsonDecoder; -import org.springframework.http.codec.json.Jackson2JsonEncoder; -import org.springframework.web.reactive.config.WebFluxConfigurer; - -@Configuration -@RequiredArgsConstructor -public class JacksonConfig implements WebFluxConfigurer { - - private final ObjectMapper objectMapper; - - @Override - public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) { - configurer.defaultCodecs().jackson2JsonEncoder( - new Jackson2JsonEncoder(objectMapper) - ); - - configurer.defaultCodecs().jackson2JsonDecoder( - new Jackson2JsonDecoder(objectMapper) - ); - } -} \ No newline at end of file diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/config/MaskinportenConfig.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/config/MaskinportenConfig.java deleted file mode 100644 index 3ac7906824b..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/config/MaskinportenConfig.java +++ /dev/null @@ -1,24 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.config; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; - -@Getter -@Configuration -@NoArgsConstructor -public class MaskinportenConfig { - - @Value("${MASKINPORTEN_CLIENT_ID}") - private String clientId; - - @Value("${MASKINPORTEN_CLIENT_JWK}") - private String jwkPrivate; - - @Value("${MASKINPORTEN_SCOPES}") - private String scope; - - @Value("${MASKINPORTEN_WELL_KNOWN_URL}") - private String wellKnownUrl; -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/config/OpenApiConfig.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/config/OpenApiConfig.java deleted file mode 100644 index 9fbc6385f89..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/config/OpenApiConfig.java +++ /dev/null @@ -1,49 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.config; - -import io.swagger.v3.oas.models.Components; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.info.Contact; -import io.swagger.v3.oas.models.info.Info; -import io.swagger.v3.oas.models.info.License; -import io.swagger.v3.oas.models.security.SecurityRequirement; -import io.swagger.v3.oas.models.security.SecurityScheme; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.Arrays; - -import no.nav.testnav.libs.reactivecore.config.ApplicationProperties; - - -@Configuration -public class OpenApiConfig { - - @Bean - public OpenAPI openApi(ApplicationProperties applicationProperties) { - return new OpenAPI() - .components(new Components().addSecuritySchemes("bearer-jwt", new SecurityScheme() - .type(SecurityScheme.Type.HTTP) - .scheme("bearer") - .bearerFormat("JWT") - .in(SecurityScheme.In.HEADER) - .name("Authorization") - )) - .addSecurityItem( - new SecurityRequirement().addList("bearer-jwt", Arrays.asList("read", "write"))) - .info(new Info() - .title(applicationProperties.getName()) - .version(applicationProperties.getVersion()) - .description(applicationProperties.getDescription()) - .termsOfService("https://nav.no") - .contact(new Contact() - .url("https://nav-it.slack.com/archives/CA3P9NGA2") - .email("dolly@nav.no") - .name("Team Dolly") - ) - .license(new License() - .name("MIT License") - .url("https://opensource.org/licenses/MIT") - ) - ); - } -} \ No newline at end of file diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/config/R2DBCConfiguration.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/config/R2DBCConfiguration.java deleted file mode 100644 index 39960225f15..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/config/R2DBCConfiguration.java +++ /dev/null @@ -1,39 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.config; - -import io.r2dbc.h2.H2ConnectionFactory; -import io.r2dbc.spi.ConnectionFactory; -import lombok.RequiredArgsConstructor; -import org.flywaydb.core.Flyway; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.core.env.Environment; -import org.springframework.data.r2dbc.config.AbstractR2dbcConfiguration; -import org.springframework.data.r2dbc.config.EnableR2dbcAuditing; -import org.springframework.data.r2dbc.repository.config.EnableR2dbcRepositories; - -@Configuration -@EnableR2dbcAuditing -@EnableR2dbcRepositories -@RequiredArgsConstructor -class R2DBCConfiguration extends AbstractR2dbcConfiguration { - - private final Environment env; - - @Bean(initMethod = "migrate") - public Flyway flyway() { - return new Flyway(Flyway.configure() - .baselineOnMigrate(true) - .dataSource( - env.getRequiredProperty("spring.flyway.url"), - env.getRequiredProperty("spring.flyway.username"), - env.getRequiredProperty("spring.flyway.password")) - ); - } - - @Bean - @Profile("local") - public ConnectionFactory connectionFactory() { - return H2ConnectionFactory.inMemory("testdb"); - } -} \ No newline at end of file diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/config/SecurityConfig.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/config/SecurityConfig.java deleted file mode 100644 index 79595cbdc7f..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/config/SecurityConfig.java +++ /dev/null @@ -1,40 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.config; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.libs.reactivesecurity.manager.JwtReactiveAuthenticationManager; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.method.configuration.EnableReactiveMethodSecurity; -import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; -import org.springframework.security.config.web.server.ServerHttpSecurity; -import org.springframework.security.web.server.SecurityWebFilterChain; - - -@Slf4j -@Configuration -@EnableWebFluxSecurity -@EnableReactiveMethodSecurity -@RequiredArgsConstructor -public class SecurityConfig { - - private final JwtReactiveAuthenticationManager jwtReactiveAuthenticationManager; - - @Bean - public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity httpSecurity) { - return httpSecurity - .csrf(ServerHttpSecurity.CsrfSpec::disable) - .authorizeExchange(authorizeConfig -> authorizeConfig.pathMatchers( - "/internal/**", - "/webjars/**", - "/swagger-resources/**", - "/v3/api-docs/**", - "/swagger-ui/**", - "/swagger", - "/error", - "/swagger-ui.html" - ).permitAll().anyExchange().authenticated()) - .oauth2ResourceServer(oauth2RSConfig -> oauth2RSConfig.jwt(jwtSpec -> jwtSpec.authenticationManager(jwtReactiveAuthenticationManager))).build(); - } - -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/AltinnConsumer.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/AltinnConsumer.java deleted file mode 100644 index 7f80d72c961..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/AltinnConsumer.java +++ /dev/null @@ -1,151 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.consumer.altinn.v1; - -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.apps.organisasjontilgangservice.config.AltinnConfig; -import no.nav.testnav.apps.organisasjontilgangservice.consumer.altinn.v1.command.CreateOrganisasjonAccessCommand; -import no.nav.testnav.apps.organisasjontilgangservice.consumer.altinn.v1.command.DeleteOrganisasjonAccessCommand; -import no.nav.testnav.apps.organisasjontilgangservice.consumer.altinn.v1.command.GetOrganisasjonCommand; -import no.nav.testnav.apps.organisasjontilgangservice.consumer.altinn.v1.command.GetRightsCommand; -import no.nav.testnav.apps.organisasjontilgangservice.consumer.altinn.v1.dto.DeleteStatus; -import no.nav.testnav.apps.organisasjontilgangservice.consumer.altinn.v1.dto.RightDTO; -import no.nav.testnav.apps.organisasjontilgangservice.consumer.maskinporten.v1.MaskinportenConsumer; -import no.nav.testnav.apps.organisasjontilgangservice.domain.Organisasjon; -import org.springframework.http.codec.json.Jackson2JsonDecoder; -import org.springframework.http.codec.json.Jackson2JsonEncoder; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.client.ExchangeFilterFunction; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -import java.time.LocalDateTime; - -@Slf4j -@Component -public class AltinnConsumer { - - private final WebClient webClient; - private final AltinnConfig altinnConfig; - private final MaskinportenConsumer maskinportenConsumer; - - public AltinnConsumer( - AltinnConfig altinnConfig, - MaskinportenConsumer maskinportenConsumer, - ObjectMapper objectMapper, - WebClient.Builder webClientBuilder) { - - this.altinnConfig = altinnConfig; - this.maskinportenConsumer = maskinportenConsumer; - this.webClient = webClientBuilder - .baseUrl(altinnConfig.getUrl()) - .codecs(clientDefaultCodecsConfigurer -> { - clientDefaultCodecsConfigurer - .defaultCodecs() - .jackson2JsonEncoder(new Jackson2JsonEncoder(objectMapper)); - clientDefaultCodecsConfigurer - .defaultCodecs() - .jackson2JsonDecoder(new Jackson2JsonDecoder(objectMapper)); - }) - .filters(exchangeFilterFunctions -> - exchangeFilterFunctions.add(logRequest())) - .build(); - } - - private ExchangeFilterFunction logRequest() { - - return (clientRequest, next) -> { - var buffer = new StringBuilder(250) - .append("Request: ") - .append(clientRequest.method()) - .append(' ') - .append(clientRequest.url()) - .append(System.lineSeparator()); - - clientRequest.headers() - .forEach((name, values) -> values - .forEach(value -> buffer.append('\t') - .append(name) - .append('=') - .append(value.contains("Bearer ") ? "Bearer token" : value) - .append(System.lineSeparator()))); - log.trace(buffer.substring(0, buffer.length() - 1)); - return next.exchange(clientRequest); - }; - } - - - public Flux delete(String organiasjonsnummer) { - return getRights() - .filter(value -> value.reportee().equals(organiasjonsnummer)) - .flatMap(value -> maskinportenConsumer - .getAccessToken() - .flatMap(accessToken -> new DeleteOrganisasjonAccessCommand( - webClient, - accessToken.value(), - altinnConfig.getApiKey(), - value.id() - ).call()) - ); - } - - public Mono create(String organiasjonsnummer, LocalDateTime gyldigTil) { - - var readRight = new RightDTO( - null, - organiasjonsnummer, - altinnConfig.getCode(), - altinnConfig.getEdition(), - "Read", - gyldigTil - ); - return maskinportenConsumer - .getAccessToken() - .flatMap(accessToken -> new CreateOrganisasjonAccessCommand( - webClient, - accessToken.value(), - altinnConfig.getApiKey(), - readRight - ).call() - ).flatMap(right -> maskinportenConsumer - .getAccessToken() - .flatMap(accessToken -> new GetOrganisasjonCommand( - webClient, - accessToken.value(), - right.reportee(), - altinnConfig.getApiKey() - ).call()) - .map(value -> new Organisasjon(value, right)) - ); - } - - public Flux getOrganisasjoner() { - - return getRights() - .map(right -> maskinportenConsumer - .getAccessToken() - .flatMap(accessToken -> new GetOrganisasjonCommand( - webClient, - accessToken.value(), - right.reportee(), - altinnConfig.getApiKey() - ).call()) - .map(value -> new Organisasjon(value, right)) - ).collectList() - .flatMapMany(Flux::concat); - } - - private Flux getRights() { - return maskinportenConsumer - .getAccessToken() - .flatMapMany(accessToken -> new GetRightsCommand( - webClient, - accessToken.value(), - altinnConfig.getCode(), - altinnConfig.getEdition(), - altinnConfig.getApiKey() - ).call() - ); - } - -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/command/CreateOrganisasjonAccessCommand.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/command/CreateOrganisasjonAccessCommand.java deleted file mode 100644 index fe0fdbb7318..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/command/CreateOrganisasjonAccessCommand.java +++ /dev/null @@ -1,47 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.consumer.altinn.v1.command; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.apps.organisasjontilgangservice.consumer.altinn.v1.dto.RightDTO; -import org.springframework.http.HttpHeaders; -import org.springframework.web.reactive.function.BodyInserters; -import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.reactive.function.client.WebClientResponseException; -import reactor.core.publisher.Mono; - -import java.util.concurrent.Callable; - -@Slf4j -@RequiredArgsConstructor -public class CreateOrganisasjonAccessCommand implements Callable> { - private final WebClient webClient; - private final String token; - private final String apiKey; - private final RightDTO dto; - - - @Override - public Mono call() { - - return webClient - .post() - .uri(builder -> builder.path("/api/serviceowner/Srr") - .build() - ) - .body(BodyInserters.fromPublisher(Mono.just(new RightDTO[]{dto}), RightDTO[].class)) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) - .header("ApiKey", apiKey) - .header(HttpHeaders.CONTENT_TYPE, "application/hal+json") - .retrieve() - .bodyToMono(RightDTO[].class) - .map(list -> list[0]) - .doOnError( - WebClientResponseException.class::isInstance, - throwable -> log.error( - "Feil ved opprettelse av organisasjon tilgang i Altinn. {}", - ((WebClientResponseException) throwable).getResponseBodyAsString() - ) - ); - } - -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/command/DeleteOrganisasjonAccessCommand.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/command/DeleteOrganisasjonAccessCommand.java deleted file mode 100644 index 01085ca32b8..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/command/DeleteOrganisasjonAccessCommand.java +++ /dev/null @@ -1,46 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.consumer.altinn.v1.command; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.apps.organisasjontilgangservice.consumer.altinn.v1.dto.DeleteStatus; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.reactive.function.client.WebClientResponseException; -import reactor.core.publisher.Mono; - -import java.util.concurrent.Callable; - -@Slf4j -@RequiredArgsConstructor -public class DeleteOrganisasjonAccessCommand implements Callable> { - private final WebClient webClient; - private final String token; - private final String apiKey; - private final Integer id; - - - @Override - public Mono call() { - - return webClient - .delete() - .uri(builder -> builder.path("/api/serviceowner/Srr/{id}") - .build(id) - ) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) - .header("ApiKey", apiKey) - .header(HttpHeaders.CONTENT_TYPE, "application/hal+json") - .retrieve() - .toBodilessEntity() - .map(resultat -> DeleteStatus.builder() - .status(HttpStatus.valueOf(resultat.getStatusCode().value())) - .build()) - .doOnSuccess(value -> log.info("Organiasjon tilgang {} slettet.", id)) - .doOnError( - WebClientResponseException.class::isInstance, - throwable -> log.error( - "Feil ved henting av rettigheter i Altinn. {}", - ((WebClientResponseException) throwable).getResponseBodyAsString())); - } -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/command/GetOrganisasjonCommand.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/command/GetOrganisasjonCommand.java deleted file mode 100644 index 5c131c8fd07..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/command/GetOrganisasjonCommand.java +++ /dev/null @@ -1,38 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.consumer.altinn.v1.command; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.apps.organisasjontilgangservice.consumer.altinn.v1.dto.OrganisasjonDTO; -import org.springframework.http.HttpHeaders; -import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.reactive.function.client.WebClientResponseException; -import reactor.core.publisher.Mono; - -import java.util.concurrent.Callable; - -@Slf4j -@RequiredArgsConstructor -public class GetOrganisasjonCommand implements Callable> { - private final WebClient webClient; - private final String token; - private final String organisajonsnummer; - private final String apiKey; - - @Override - public Mono call() { - - return webClient - .get() - .uri(builder -> builder.path("api/serviceowner/organizations/{organisajonsnummer}").build(organisajonsnummer) - ) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) - .header("ApiKey", apiKey) - .retrieve() - .bodyToMono(OrganisasjonDTO.class) - .doOnError( - WebClientResponseException.class::isInstance, - throwable -> log.error( - "Feil ved henting av rettigheter i Altinn. {}", - ((WebClientResponseException) throwable).getResponseBodyAsString())); - } -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/command/GetRightsCommand.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/command/GetRightsCommand.java deleted file mode 100644 index 19911a178df..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/command/GetRightsCommand.java +++ /dev/null @@ -1,43 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.consumer.altinn.v1.command; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.apps.organisasjontilgangservice.consumer.altinn.v1.dto.RightDTO; -import org.springframework.http.HttpHeaders; -import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.reactive.function.client.WebClientResponseException; -import reactor.core.publisher.Flux; - -import java.util.concurrent.Callable; - -@Slf4j -@RequiredArgsConstructor -public class GetRightsCommand implements Callable> { - private final WebClient webClient; - private final String token; - private final String serviceCode; - private final String serviceEdition; - private final String apiKey; - - @Override - public Flux call() { - - return webClient - .get() - .uri(builder -> builder.path("/api/serviceowner/Srr") - .queryParam("serviceCode", serviceCode) - .queryParam("serviceEditionCode", serviceEdition) - .build() - ) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) - .header("ApiKey", apiKey) - .retrieve() - .bodyToFlux(RightDTO.class) - .doOnError( - WebClientResponseException.class::isInstance, - throwable -> log.error( - "Feil ved henting av rettigheter i Altinn. {}", - ((WebClientResponseException) throwable).getResponseBodyAsString())) - ; - } -} \ No newline at end of file diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/dto/DeleteStatus.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/dto/DeleteStatus.java deleted file mode 100644 index 388453047e4..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/dto/DeleteStatus.java +++ /dev/null @@ -1,16 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.consumer.altinn.v1.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.springframework.http.HttpStatus; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class DeleteStatus { - - private HttpStatus status; -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/dto/OrganisasjonDTO.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/dto/OrganisasjonDTO.java deleted file mode 100644 index 09ce3a8aadb..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/dto/OrganisasjonDTO.java +++ /dev/null @@ -1,8 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.consumer.altinn.v1.dto; - -public record OrganisasjonDTO( - String Name, - String Type, - String OrganizationNumber -) { -} \ No newline at end of file diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/dto/RightDTO.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/dto/RightDTO.java deleted file mode 100644 index 32c6889128e..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/altinn/v1/dto/RightDTO.java +++ /dev/null @@ -1,21 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.consumer.altinn.v1.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import java.time.LocalDateTime; - -public record RightDTO( - @JsonProperty("Id") - Integer id, - @JsonProperty("Reportee") - String reportee, - @JsonProperty("ServiceCode") - String serviceCode, - @JsonProperty("ServiceEditionCode") - String serviceEditionCode, - @JsonProperty("Right") - String right, - @JsonProperty("ValidTo") - LocalDateTime validTo -) { -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/maskinporten/v1/MaskinportenConsumer.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/maskinporten/v1/MaskinportenConsumer.java deleted file mode 100644 index 9e6c4ab55e4..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/maskinporten/v1/MaskinportenConsumer.java +++ /dev/null @@ -1,94 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.consumer.maskinporten.v1; - -import com.nimbusds.jose.JOSEException; -import com.nimbusds.jose.JOSEObjectType; -import com.nimbusds.jose.JWSAlgorithm; -import com.nimbusds.jose.JWSHeader; -import com.nimbusds.jose.JWSSigner; -import com.nimbusds.jose.crypto.RSASSASigner; -import com.nimbusds.jose.jwk.RSAKey; -import com.nimbusds.jwt.JWTClaimsSet; -import com.nimbusds.jwt.SignedJWT; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.apps.organisasjontilgangservice.config.MaskinportenConfig; -import no.nav.testnav.apps.organisasjontilgangservice.consumer.maskinporten.v1.command.GetAccessTokenCommand; -import no.nav.testnav.apps.organisasjontilgangservice.consumer.maskinporten.v1.command.GetWellKnownCommand; -import no.nav.testnav.apps.organisasjontilgangservice.consumer.maskinporten.v1.dto.AccessToken; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; - -import java.time.Duration; -import java.time.Instant; -import java.util.Date; -import java.util.UUID; -import java.util.function.Function; - -@Slf4j -@Component -public class MaskinportenConsumer { - - private final WebClient webClient; - private final MaskinportenConfig maskinportenConfig; - private final Mono accessToken; - - public MaskinportenConsumer(MaskinportenConfig maskinportenConfig, WebClient.Builder webClientBuilder) { - - this.webClient = webClientBuilder - .build(); - - this.maskinportenConfig = maskinportenConfig; - var wellKnownMono = cache( - new GetWellKnownCommand(webClient, maskinportenConfig).call(), - value -> Duration.ofDays(1) - ); - this.accessToken = cache( - wellKnownMono.flatMap(wellKnown -> new GetAccessTokenCommand(webClient, wellKnown, createJwtClaims(wellKnown.issuer())).call()), - value -> Duration.ofSeconds(value.expiresIn() - 10L) - ); - } - - public Mono getAccessToken() { - return accessToken.map(no.nav.testnav.apps.organisasjontilgangservice.domain.AccessToken::new); - } - - @SneakyThrows - private String createJwtClaims(String audience) { - Instant now = Instant.now(); - var rsaKey = RSAKey.parse(maskinportenConfig.getJwkPrivate()); - return createSignedJWT(rsaKey, - new JWTClaimsSet.Builder() - .audience(audience) - .claim("scope", maskinportenConfig.getScope()) - .issuer(maskinportenConfig.getClientId()) - .issueTime(Date.from(now)) - .expirationTime(Date.from(now.plusSeconds(119))) - .jwtID(UUID.randomUUID().toString()) - .build()) - .serialize(); - } - - private SignedJWT createSignedJWT(RSAKey rsaJwk, JWTClaimsSet claimsSet) { - try { - JWSHeader.Builder header = new JWSHeader.Builder(JWSAlgorithm.RS256) - .keyID(rsaJwk.getKeyID()) - .type(JOSEObjectType.JWT); - SignedJWT signedJWT = new SignedJWT(header.build(), claimsSet); - JWSSigner signer = new RSASSASigner(rsaJwk.toPrivateKey()); - signedJWT.sign(signer); - return signedJWT; - } catch (JOSEException e) { - throw new RuntimeException(e); - } - } - - private static Mono cache(Mono value, Function ttlForValue) { - return value.cache( - ttlForValue, - throwable -> Duration.ZERO, - () -> Duration.ZERO - ); - } - -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/maskinporten/v1/command/GetAccessTokenCommand.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/maskinporten/v1/command/GetAccessTokenCommand.java deleted file mode 100644 index 7902064ab0f..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/maskinporten/v1/command/GetAccessTokenCommand.java +++ /dev/null @@ -1,40 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.consumer.maskinporten.v1.command; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.apps.organisasjontilgangservice.consumer.maskinporten.v1.dto.AccessToken; -import no.nav.testnav.apps.organisasjontilgangservice.consumer.maskinporten.v1.dto.WellKnown; -import org.springframework.web.reactive.function.BodyInserters; -import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.reactive.function.client.WebClientResponseException; -import reactor.core.publisher.Mono; - -import java.util.concurrent.Callable; - -@Slf4j -@RequiredArgsConstructor -public class GetAccessTokenCommand implements Callable> { - private final WebClient webClient; - private final WellKnown wellKnown; - private final String assertion; - - @Override - public Mono call() { - return webClient.post() - .uri(wellKnown.tokenEndpoint()) - .body(BodyInserters - .fromFormData("grant_type", wellKnown.grantTypesSupported().get(0)) - .with("assertion", assertion) - ) - .retrieve() - .bodyToMono(AccessToken.class) - .doOnSuccess(value -> log.info("AccessToken hentet fra maskinporten.")) - .doOnError( - WebClientResponseException.class::isInstance, - throwable -> log.error( - "Feil ved henting av AccessToken for maskinporten. \n{}", - ((WebClientResponseException) throwable).getResponseBodyAsString() - ) - ); - } -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/maskinporten/v1/command/GetWellKnownCommand.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/maskinporten/v1/command/GetWellKnownCommand.java deleted file mode 100644 index 6a59d75058d..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/maskinporten/v1/command/GetWellKnownCommand.java +++ /dev/null @@ -1,34 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.consumer.maskinporten.v1.command; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.apps.organisasjontilgangservice.config.MaskinportenConfig; -import no.nav.testnav.apps.organisasjontilgangservice.consumer.maskinporten.v1.dto.WellKnown; -import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.reactive.function.client.WebClientResponseException; -import reactor.core.publisher.Mono; - -import java.util.concurrent.Callable; - -@Slf4j -@RequiredArgsConstructor -public class GetWellKnownCommand implements Callable> { - private final WebClient webClient; - private final MaskinportenConfig maskinportenConfig; - - @Override - public Mono call() { - return webClient.get() - .uri(maskinportenConfig.getWellKnownUrl()) - .retrieve() - .bodyToMono(WellKnown.class) - .doOnSuccess(value -> log.info("WellKnown hentet for maskinporten.")) - .doOnError( - WebClientResponseException.class::isInstance, - throwable -> log.error( - "Feil ved henting av well known for maskinporten. \n{}", - ((WebClientResponseException) throwable).getResponseBodyAsString() - ) - ); - } -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/maskinporten/v1/dto/AccessToken.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/maskinporten/v1/dto/AccessToken.java deleted file mode 100644 index 46516d4d5d4..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/maskinporten/v1/dto/AccessToken.java +++ /dev/null @@ -1,16 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.consumer.maskinporten.v1.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public record AccessToken( - @JsonProperty("access_token") - String accessToken, - @JsonProperty("token_type") - String tokenType, - @JsonProperty("expires_in") - Integer expiresIn, - @JsonProperty("scope") - String scope -) { - -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/maskinporten/v1/dto/WellKnown.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/maskinporten/v1/dto/WellKnown.java deleted file mode 100644 index 7b051451225..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/consumer/maskinporten/v1/dto/WellKnown.java +++ /dev/null @@ -1,18 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.consumer.maskinporten.v1.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import java.util.List; - -public record WellKnown( - String issuer, - @JsonProperty("token_endpoint") - String tokenEndpoint, - @JsonProperty("jwks_uri") - String jwksUri, - @JsonProperty("token_endpoint_auth_methods_supported") - List tokenEndpointAuthMethodsSupported, - @JsonProperty("grant_types_supported") - List grantTypesSupported -) { -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/controller/OrganisasjonMiljoeConsumer.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/controller/OrganisasjonMiljoeConsumer.java deleted file mode 100644 index 394cf881b8d..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/controller/OrganisasjonMiljoeConsumer.java +++ /dev/null @@ -1,41 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.controller; - -import javassist.NotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.apps.organisasjontilgangservice.database.entity.OrganisasjonTilgang; -import no.nav.testnav.apps.organisasjontilgangservice.service.MiljoerOversiktService; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestController; -import reactor.core.publisher.Mono; - -@Slf4j -@RestController -@RequestMapping("/api/v1/miljoer") -@RequiredArgsConstructor -public class OrganisasjonMiljoeConsumer { - - private final MiljoerOversiktService miljoerOversiktService; - - @GetMapping("/organisasjon/{orgnummer}") - public Mono getOrganisasjon(@RequestParam("orgnummer") String orgnummer) { - - return miljoerOversiktService.getMiljoe(orgnummer); - } - - @ExceptionHandler(NotFoundException.class) - @ResponseStatus(HttpStatus.NOT_FOUND) - public ResponseEntity handleNoSuchElementFoundException( - NotFoundException exception - ) { - return ResponseEntity - .status(HttpStatus.NOT_FOUND) - .body(exception.getMessage()); - } -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/controller/OrganisasjonTilgangConsumer.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/controller/OrganisasjonTilgangConsumer.java deleted file mode 100644 index 99d2a044bba..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/controller/OrganisasjonTilgangConsumer.java +++ /dev/null @@ -1,53 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.controller; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.apps.organisasjontilgangservice.controller.request.OrganisasjonAccessRequest; -import no.nav.testnav.apps.organisasjontilgangservice.domain.OrganisasjonResponse; -import no.nav.testnav.apps.organisasjontilgangservice.service.OrganisasjonTilgangService; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -@Slf4j -@RestController -@RequestMapping("/api/v1/organisasjoner") -@RequiredArgsConstructor -public class OrganisasjonTilgangConsumer { - - private final OrganisasjonTilgangService organisasjonTilgangService; - - @GetMapping - public Flux getAll() { - - return organisasjonTilgangService.getAll(); - } - - @PostMapping - public Mono create(@RequestBody OrganisasjonAccessRequest request) { - - return organisasjonTilgangService - .create(request.organisasjonsnummer(), request.gyldigTil(), request.miljoe()); - } - - @DeleteMapping("/{organisasjonsnummer}") - public Flux delete(@PathVariable String organisasjonsnummer) { - - return organisasjonTilgangService.delete(organisasjonsnummer); - } - - @PutMapping - public Mono update(@RequestBody OrganisasjonAccessRequest request) { - - organisasjonTilgangService.delete(request.organisasjonsnummer()).blockFirst(); - return organisasjonTilgangService - .create(request.organisasjonsnummer(), request.gyldigTil(), request.miljoe()); - } -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/controller/request/OrganisasjonAccessRequest.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/controller/request/OrganisasjonAccessRequest.java deleted file mode 100644 index 9723304472a..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/controller/request/OrganisasjonAccessRequest.java +++ /dev/null @@ -1,11 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.controller.request; - -import java.time.LocalDateTime; - -public record OrganisasjonAccessRequest( - - String organisasjonsnummer, - LocalDateTime gyldigTil, - String miljoe -) { -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/database/entity/OrganisasjonTilgang.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/database/entity/OrganisasjonTilgang.java deleted file mode 100644 index 154d47ef35d..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/database/entity/OrganisasjonTilgang.java +++ /dev/null @@ -1,27 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.database.entity; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.springframework.data.annotation.Id; -import org.springframework.data.relational.core.mapping.Column; -import org.springframework.data.relational.core.mapping.Table; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -@Table(name = "ORGANISASJON_TILGANG") -public class OrganisasjonTilgang { - - @Id - @Column("ID") - private Long id; - - @Column("ORGANISAJON_NUMMER") - private String organisasjonNummer; - - @Column("miljoe") - private String miljoe; -} \ No newline at end of file diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/database/repository/OrganisasjonTilgangRepository.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/database/repository/OrganisasjonTilgangRepository.java deleted file mode 100644 index 67f0b1997d0..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/database/repository/OrganisasjonTilgangRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.database.repository; - -import no.nav.testnav.apps.organisasjontilgangservice.database.entity.OrganisasjonTilgang; -import org.springframework.data.repository.reactive.ReactiveCrudRepository; -import reactor.core.publisher.Mono; - -public interface OrganisasjonTilgangRepository extends ReactiveCrudRepository { - - Mono existsByOrganisasjonNummer(String orgnummer); - - Mono findByOrganisasjonNummer(String orgnummer); - - Mono save(OrganisasjonTilgang organisasjonTilgang); - - Mono deleteByOrganisasjonNummer(String orgnummer); -} \ No newline at end of file diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/domain/AccessToken.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/domain/AccessToken.java deleted file mode 100644 index 2c3d4fcc960..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/domain/AccessToken.java +++ /dev/null @@ -1,7 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.domain; - -public record AccessToken(String value) { - public AccessToken(no.nav.testnav.apps.organisasjontilgangservice.consumer.maskinporten.v1.dto.AccessToken accessToken) { - this(accessToken.accessToken()); - } -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/domain/Organisasjon.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/domain/Organisasjon.java deleted file mode 100644 index faa536716b8..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/domain/Organisasjon.java +++ /dev/null @@ -1,29 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.domain; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import no.nav.testnav.apps.organisasjontilgangservice.consumer.altinn.v1.dto.OrganisasjonDTO; -import no.nav.testnav.apps.organisasjontilgangservice.consumer.altinn.v1.dto.RightDTO; - -import java.time.LocalDateTime; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class Organisasjon { - - private String navn; - private String organisasjonsnummer; - private String organisasjonsform; - private LocalDateTime gyldigTil; - - public Organisasjon(OrganisasjonDTO dto, RightDTO rightDTO) { - this.navn = dto.Name(); - this.organisasjonsnummer = dto.OrganizationNumber(); - this.organisasjonsform = dto.Type(); - this.gyldigTil = rightDTO.validTo(); - } -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/domain/OrganisasjonResponse.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/domain/OrganisasjonResponse.java deleted file mode 100644 index 7b2d1be2ec9..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/domain/OrganisasjonResponse.java +++ /dev/null @@ -1,21 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.domain; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.time.LocalDateTime; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class OrganisasjonResponse { - - private String navn; - private String organisasjonsnummer; - private String organisasjonsform; - private LocalDateTime gyldigTil; - private String miljoe; -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/mapper/MapperFacadeConfig.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/mapper/MapperFacadeConfig.java deleted file mode 100644 index 37af6d8419f..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/mapper/MapperFacadeConfig.java +++ /dev/null @@ -1,35 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.mapper; - -import ma.glasnost.orika.CustomConverter; -import ma.glasnost.orika.MapperFacade; -import ma.glasnost.orika.impl.DefaultMapperFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.List; - -import static java.util.Objects.nonNull; - -@Configuration -public class MapperFacadeConfig { - - @Bean - @SuppressWarnings("java:S3740") - MapperFacade mapperFacade(List mappingStrategies, List customConverters) { - DefaultMapperFactory mapperFactory = new DefaultMapperFactory.Builder().build(); - - if (nonNull(mappingStrategies)) { - for (MappingStrategy mapper : mappingStrategies) { - mapper.register(mapperFactory); - } - } - - if (nonNull(customConverters)) { - for (CustomConverter converter : customConverters) { - mapperFactory.getConverterFactory().registerConverter(converter); - } - } - - return mapperFactory.getMapperFacade(); - } -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/mapper/MappingStrategy.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/mapper/MappingStrategy.java deleted file mode 100644 index f099f95bdc8..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/mapper/MappingStrategy.java +++ /dev/null @@ -1,19 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.mapper; - -import ma.glasnost.orika.MapperFactory; - -@FunctionalInterface -public interface MappingStrategy { - - /** - * A callback for registering criteria on the provided {@link MapperFactory}. - *

- *

{@code
-     *
-     * @Override public void register(MapperFactory factory) {
-     * factory.registerMapper(arbeidsfordelingToRestArbeidsfordeling());
-     * }
-     * }
- */ - void register(MapperFactory factory); -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/mapper/OrganisajonTilgangMappingStrategy.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/mapper/OrganisajonTilgangMappingStrategy.java deleted file mode 100644 index 1429916dc6d..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/mapper/OrganisajonTilgangMappingStrategy.java +++ /dev/null @@ -1,33 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.mapper; - -import ma.glasnost.orika.CustomMapper; -import ma.glasnost.orika.MapperFactory; -import ma.glasnost.orika.MappingContext; -import no.nav.testnav.apps.organisasjontilgangservice.database.entity.OrganisasjonTilgang; -import no.nav.testnav.apps.organisasjontilgangservice.domain.Organisasjon; -import no.nav.testnav.apps.organisasjontilgangservice.domain.OrganisasjonResponse; -import org.springframework.stereotype.Component; - -import static java.util.Objects.nonNull; -import static org.apache.commons.lang3.StringUtils.isNotBlank; - -@Component -public class OrganisajonTilgangMappingStrategy implements MappingStrategy { - @Override - public void register(MapperFactory factory) { - - factory.classMap(Organisasjon.class, OrganisasjonResponse.class) - .customize(new CustomMapper<>() { - - @Override - public void mapAtoB(Organisasjon organisasjon, OrganisasjonResponse response, MappingContext context) { - - var organisasjonTilgang = (OrganisasjonTilgang) context.getProperty("organisasjonTilgang"); - response.setMiljoe(nonNull(organisasjonTilgang) && isNotBlank(organisasjonTilgang.getMiljoe()) ? - organisasjonTilgang.getMiljoe() : "q1"); - } - }) - .byDefault() - .register(); - } -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/service/MiljoerOversiktService.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/service/MiljoerOversiktService.java deleted file mode 100644 index 03410d82600..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/service/MiljoerOversiktService.java +++ /dev/null @@ -1,42 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.service; - -import javassist.NotFoundException; -import lombok.RequiredArgsConstructor; -import no.nav.testnav.apps.organisasjontilgangservice.consumer.altinn.v1.AltinnConsumer; -import no.nav.testnav.apps.organisasjontilgangservice.database.entity.OrganisasjonTilgang; -import no.nav.testnav.apps.organisasjontilgangservice.database.repository.OrganisasjonTilgangRepository; -import org.springframework.stereotype.Service; -import reactor.core.publisher.Mono; - -import static org.apache.commons.lang3.BooleanUtils.isTrue; - -@Service -@RequiredArgsConstructor -public class MiljoerOversiktService { - - private final AltinnConsumer altinnConsumer; - private final OrganisasjonTilgangRepository organisasjonTilgangRepository; - - public Mono getMiljoe(String orgnummer) { - - return altinnConsumer.getOrganisasjoner() - .collectList() - .flatMap(bedrifter -> { - - if (bedrifter.stream().anyMatch(bedrift -> - orgnummer.equals(bedrift.getOrganisasjonsnummer()))) { - - return organisasjonTilgangRepository.existsByOrganisasjonNummer(orgnummer) - .flatMap(miljoe -> isTrue(miljoe) ? - organisasjonTilgangRepository.findByOrganisasjonNummer(orgnummer) : - Mono.just(OrganisasjonTilgang.builder() - .organisasjonNummer(orgnummer) - .miljoe("q1") - .build())); - } else { - return Mono.error(new NotFoundException( - String.format("Organisasjonsnummer %s ble ikke funnet", orgnummer))); - } - }); - } -} diff --git a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/service/OrganisasjonTilgangService.java b/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/service/OrganisasjonTilgangService.java deleted file mode 100644 index 83eeaefd8a6..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/organisasjontilgangservice/service/OrganisasjonTilgangService.java +++ /dev/null @@ -1,69 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice.service; - -import lombok.RequiredArgsConstructor; -import ma.glasnost.orika.MapperFacade; -import ma.glasnost.orika.MappingContext; -import no.nav.testnav.apps.organisasjontilgangservice.consumer.altinn.v1.AltinnConsumer; -import no.nav.testnav.apps.organisasjontilgangservice.database.entity.OrganisasjonTilgang; -import no.nav.testnav.apps.organisasjontilgangservice.database.repository.OrganisasjonTilgangRepository; -import no.nav.testnav.apps.organisasjontilgangservice.domain.OrganisasjonResponse; -import org.springframework.stereotype.Service; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -import java.time.LocalDateTime; - -import static org.apache.commons.lang3.BooleanUtils.isTrue; - -@Service -@RequiredArgsConstructor -public class OrganisasjonTilgangService { - - private final AltinnConsumer altinnConsumer; - private final OrganisasjonTilgangRepository organisasjonTilgangRepository; - private final MapperFacade mapperFacade; - - public Flux getAll() { - - return altinnConsumer.getOrganisasjoner() - .flatMap(organisasjon -> organisasjonTilgangRepository - .existsByOrganisasjonNummer(organisasjon.getOrganisasjonsnummer()) - .flatMap(exists -> isTrue(exists) ? - organisasjonTilgangRepository - .findByOrganisasjonNummer(organisasjon.getOrganisasjonsnummer()) : - Mono.just(new OrganisasjonTilgang())) - .map(organisasjonTilgang -> { - var context = new MappingContext.Factory().getContext(); - context.setProperty("organisasjonTilgang", organisasjonTilgang); - return mapperFacade.map(organisasjon, OrganisasjonResponse.class, context); - })); - } - - public Mono create(String organisasjonsnummer, LocalDateTime gyldigTil, String miljoe) { - - return organisasjonTilgangRepository.existsByOrganisasjonNummer(organisasjonsnummer) - .flatMap(exists -> isTrue(exists) ? - organisasjonTilgangRepository.findByOrganisasjonNummer(organisasjonsnummer) : - Mono.just(OrganisasjonTilgang.builder() - .organisasjonNummer(organisasjonsnummer) - .build())) - .flatMap(organisasjon -> { - organisasjon.setMiljoe(miljoe); - return organisasjonTilgangRepository.save(organisasjon); - }) - .flatMap(organisasjonTilgang -> altinnConsumer.create(organisasjonsnummer, gyldigTil) - .flatMap(organisasjon -> organisasjonTilgangRepository - .findByOrganisasjonNummer(organisasjon.getOrganisasjonsnummer()) - .map(tilgang -> { - var context = new MappingContext.Factory().getContext(); - context.setProperty("organisasjonTilgang", tilgang); - return mapperFacade.map(organisasjon, OrganisasjonResponse.class, context); - }))); - } - - public Flux delete(String organisasjonsnummer) { - - return altinnConsumer.delete(organisasjonsnummer) - .flatMap(status -> organisasjonTilgangRepository.deleteByOrganisasjonNummer(organisasjonsnummer)); - } -} diff --git a/apps/organisasjon-tilgang-service/src/main/resources/application-local.yml b/apps/organisasjon-tilgang-service/src/main/resources/application-local.yml deleted file mode 100644 index e6debad7f2a..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/resources/application-local.yml +++ /dev/null @@ -1,17 +0,0 @@ -ALTINN_API_KEY: dummy -ALTINN_URL: https://tt02.altinn.no -AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} -AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} -MASKINPORTEN_CLIENT_ID: dummy -MASKINPORTEN_CLIENT_JWK: dummy -MASKINPORTEN_SCOPES: dummy -MASKINPORTEN_WELL_KNOWN_URL: dummy -TOKEN_X_ISSUER: dummy - -spring: - config: - import: "sm://" - flyway: - url: jdbc:h2:mem:testdb - username: sa - password: diff --git a/apps/organisasjon-tilgang-service/src/main/resources/application-prod.yml b/apps/organisasjon-tilgang-service/src/main/resources/application-prod.yml deleted file mode 100644 index 9e15570c1b8..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/resources/application-prod.yml +++ /dev/null @@ -1,12 +0,0 @@ -ALTINN_URL: https://altinn.no - -spring: - flyway: - locations: classpath:db/migration - url: jdbc:postgresql://${NAIS_DATABASE_TESTNAV_ORGANISASJON_TILGANGER_TESTNAV_ORGANISASJON_TILGANGER_HOST}:${NAIS_DATABASE_TESTNAV_ORGANISASJON_TILGANGER_TESTNAV_ORGANISASJON_TILGANGER_PORT}/${NAIS_DATABASE_TESTNAV_ORGANISASJON_TILGANGER_TESTNAV_ORGANISASJON_TILGANGER_DATABASE} - username: ${NAIS_DATABASE_TESTNAV_ORGANISASJON_TILGANGER_TESTNAV_ORGANISASJON_TILGANGER_USERNAME} - password: ${NAIS_DATABASE_TESTNAV_ORGANISASJON_TILGANGER_TESTNAV_ORGANISASJON_TILGANGER_PASSWORD} - r2dbc: - url: r2dbc:postgresql://${NAIS_DATABASE_TESTNAV_ORGANISASJON_TILGANGER_TESTNAV_ORGANISASJON_TILGANGER_HOST}:${NAIS_DATABASE_TESTNAV_ORGANISASJON_TILGANGER_TESTNAV_ORGANISASJON_TILGANGER_PORT}/${NAIS_DATABASE_TESTNAV_ORGANISASJON_TILGANGER_TESTNAV_ORGANISASJON_TILGANGER_DATABASE} - username: ${NAIS_DATABASE_TESTNAV_ORGANISASJON_TILGANGER_TESTNAV_ORGANISASJON_TILGANGER_USERNAME} - password: ${NAIS_DATABASE_TESTNAV_ORGANISASJON_TILGANGER_TESTNAV_ORGANISASJON_TILGANGER_PASSWORD} \ No newline at end of file diff --git a/apps/organisasjon-tilgang-service/src/main/resources/application.yml b/apps/organisasjon-tilgang-service/src/main/resources/application.yml deleted file mode 100644 index 3f5e8bd26ec..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/resources/application.yml +++ /dev/null @@ -1,57 +0,0 @@ -AAD_ISSUER_URI: https://login.microsoftonline.com/62366534-1ec3-4962-8869-9b5535279d0b - -spring: - application: - version: application.version.todo - name: testnav-organisasjon-tilgang-service - description: Tjeneste for hente og sette tilganger for orgnisasjoner - security: - oauth2: - resourceserver: - aad: - 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} - jackson: - serialization: - write_dates_as_timestamps: false - -springdoc: - swagger-ui: - disable-swagger-default-url: true - url: /v3/api-docs - -altinn: - api: - url: ${ALTINN_URL} - key: ${ALTINN_API_KEY} - service: - code: 5748 - edition: 1 - -management: - endpoints: - enabled-by-default: true - web: - base-path: /internal - exposure: - include: prometheus,health - path-mapping: - prometheus: metrics - endpoint: - prometheus: - enabled: true - prometheus: - metrics: - export: - enabled: true -server: - servlet: - encoding: - charset: UTF-8 - error: - include-message: always \ No newline at end of file diff --git a/apps/organisasjon-tilgang-service/src/main/resources/db/migration/V1.0.0__CreateTables.sql b/apps/organisasjon-tilgang-service/src/main/resources/db/migration/V1.0.0__CreateTables.sql deleted file mode 100644 index 074fa6a3eb9..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/resources/db/migration/V1.0.0__CreateTables.sql +++ /dev/null @@ -1,10 +0,0 @@ -------------------------------- --- C R E A T E T A B L E S -- -------------------------------- - -create table organisasjon_tilgang -( - id serial primary key, - organisajon_nummer varchar(50) unique, - miljoe varchar(100) -); \ No newline at end of file diff --git a/apps/organisasjon-tilgang-service/src/main/resources/logback-spring.xml b/apps/organisasjon-tilgang-service/src/main/resources/logback-spring.xml deleted file mode 100644 index 379a17ddc3e..00000000000 --- a/apps/organisasjon-tilgang-service/src/main/resources/logback-spring.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - true - - 10280 - 20 - ^sun\.reflect\..*\.invoke - ^net\.sf\.cglib\.proxy\.MethodProxy\.invoke - java\.util\.concurrent\..* - org\.apache\.catalina\..* - org\.apache\.coyote\..* - org\.apache\.tomcat\..* - - - - - - - - - - - - - %d{HH:mm:ss.SSS} | %5p | %logger{25} | %m%n - - utf8 - - - - - - - - - - \ No newline at end of file diff --git a/apps/organisasjon-tilgang-service/src/test/java/no/nav/testnav/apps/organisasjontilgangservice/ApplicationContextTest.java b/apps/organisasjon-tilgang-service/src/test/java/no/nav/testnav/apps/organisasjontilgangservice/ApplicationContextTest.java deleted file mode 100644 index 83743843260..00000000000 --- a/apps/organisasjon-tilgang-service/src/test/java/no/nav/testnav/apps/organisasjontilgangservice/ApplicationContextTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package no.nav.testnav.apps.organisasjontilgangservice; - -import ma.glasnost.orika.MapperFacade; -import org.flywaydb.core.Flyway; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.security.oauth2.jwt.ReactiveJwtDecoder; -import org.springframework.test.context.ActiveProfiles; - -@SpringBootTest -@ActiveProfiles("test") -class ApplicationContextTest { - - @MockBean - public ReactiveJwtDecoder jwtDecoder; - - @MockBean - public MapperFacade mapperFacade; - - @MockBean - public Flyway flyway; - - @Test - @SuppressWarnings("java:S2699") - void load_app_context() { - } -} diff --git a/apps/organisasjon-tilgang-service/src/test/resources/application-test.yml b/apps/organisasjon-tilgang-service/src/test/resources/application-test.yml deleted file mode 100644 index 0468cb34222..00000000000 --- a/apps/organisasjon-tilgang-service/src/test/resources/application-test.yml +++ /dev/null @@ -1,13 +0,0 @@ -ALTINN_URL: http://localhost:8080 -ALTINN_API_KEY: dummy -MASKINPORTEN_CLIENT_ID: dummy -MASKINPORTEN_CLIENT_JWK: dummy -MASKINPORTEN_SCOPES: dummy -MASKINPORTEN_WELL_KNOWN_URL: http://localhost:8080 -TOKEN_X_ISSUER: dummy - -spring: - cloud: - gcp: - secretmanager: - enabled: false \ No newline at end of file diff --git a/apps/oversikt-frontend/build.gradle b/apps/oversikt-frontend/build.gradle index b2e13e3acfa..5e50676ce88 100644 --- a/apps/oversikt-frontend/build.gradle +++ b/apps/oversikt-frontend/build.gradle @@ -13,6 +13,7 @@ sonarqube { dependencies { implementation "io.grpc:grpc-netty:$versions.grpc" + implementation 'no.nav.testnav.libs:data-transfer-objects' implementation "no.nav.testnav.libs:reactive-core" implementation "no.nav.testnav.libs:reactive-frontend" implementation "no.nav.testnav.libs:reactive-security" diff --git a/apps/oversikt-frontend/config.yml b/apps/oversikt-frontend/config.yml index 53082bdaa3f..a94d8e92a2e 100644 --- a/apps/oversikt-frontend/config.yml +++ b/apps/oversikt-frontend/config.yml @@ -26,65 +26,10 @@ spec: accessPolicy: outbound: rules: - - application: dolly-backend - - application: dolly-backend-dev - - application: generer-navn-service - - application: organisasjon-bestilling-service - - application: synthdata-amelding - - application: synthdata-arena-aap - - application: synthdata-arena-dagpenger - - application: synthdata-arena-meldekort - - application: synthdata-arena-tilleggsstonad - - application: synthdata-arena-tiltak - - application: synthdata-arena-vedtakshistorikk - - application: synthdata-elsam-gcp - - application: testnav-adresse-service - - application: testnav-amelding-service - - application: testnav-app-tilgang-analyse-service - - application: testnav-arbeidsforhold-service - - application: testnav-arbeidsplassencv-proxy - - application: testnav-batch-bestilling-service - - application: testnav-bruker-service - application: testnav-bruker-service-dev - - application: testnav-endringsmelding-service - - application: testnav-generer-arbeidsforhold-populasjon-service - - application: testnav-generer-organisasjon-populasjon-service - - application: testnav-generer-synt-amelding-service - - application: testnav-helsepersonell-service - - application: testnav-ident-pool - - application: testnav-inntektsmelding-generator-service - - application: testnav-inntektsmelding-service - - application: testnav-jenkins-batch-status-service - - application: testnav-joark-dokument-service - - application: testnav-kodeverk-service - - application: testnav-miljoer-service - - application: testnav-oppsummeringsdokument-service - - application: testnav-organisasjon-faste-data-service - - application: testnav-organisasjon-forvalter - - application: testnav-organisasjon-mottak-service - - application: testnav-organisasjon-service - - application: testnav-organisasjon-tilgang-service - - application: testnav-orgnummer-service - - application: testnav-pdl-forvalter - - application: testnav-pdl-forvalter-dev - - application: testnav-person-faste-data-service - - application: testnav-person-organisasjon-tilgang-service-dev - - application: testnav-person-search-service - - application: testnav-person-service - - application: testnav-skattekort-service - - application: testnav-sykemelding-api - - application: testnav-synt-sykemelding-api - - application: testnav-synt-vedtakshistorikk-service - - application: testnav-tenor-search-service - - application: testnav-tps-messaging-service - - application: testnav-varslinger-service - - application: testnav-varslinger-service-dev - - application: testnorge-profil-api + - application: testnav-app-tilgang-analyse-service - application: testnorge-profil-api-dev - - application: testnorge-tilbakemelding-api - - application: testnav-levende-arbeidsforhold-ansettelse - - application: testnav-levende-arbeidsforhold-service - - application: testnav-levende-arbeidsforhold-scheduler + - application: testnav-altinn3-tilgang-service liveness: path: /internal/isAlive initialDelay: 4 diff --git a/apps/oversikt-frontend/settings.gradle b/apps/oversikt-frontend/settings.gradle index 77232fe6e5f..b8cdf008d31 100644 --- a/apps/oversikt-frontend/settings.gradle +++ b/apps/oversikt-frontend/settings.gradle @@ -6,6 +6,7 @@ rootProject.name = 'oversikt-frontend' includeBuild "../../plugins/java" +includeBuild '../../libs/data-transfer-objects' includeBuild '../../libs/reactive-core' includeBuild '../../libs/reactive-frontend' includeBuild '../../libs/reactive-security' diff --git a/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/OversiktFrontendApplicationStarter.java b/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/OversiktFrontendApplicationStarter.java index 8efb3b07e95..d6805193226 100644 --- a/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/OversiktFrontendApplicationStarter.java +++ b/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/OversiktFrontendApplicationStarter.java @@ -44,9 +44,9 @@ public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { addAuthenticationHeaderFilterFrom(consumers.getTestnorgeProfilApi()) )) .route(createRoute( - "testnav-organisasjon-tilgang-service", - consumers.getTestnavPersonOrganisasjonTilgangService().getUrl(), - addAuthenticationHeaderFilterFrom(consumers.getTestnavPersonOrganisasjonTilgangService()) + "testnav-altinn3-tilgang-service", + consumers.getTestnavAltinn3TilgangService().getUrl(), + addAuthenticationHeaderFilterFrom(consumers.getTestnavAltinn3TilgangService()) )) .build(); } diff --git a/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/config/Consumers.java b/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/config/Consumers.java index 9906d9803e5..91e71c891b4 100644 --- a/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/config/Consumers.java +++ b/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/config/Consumers.java @@ -25,7 +25,7 @@ public class Consumers { private ServerProperties testnavAppTilgangAnalyseService; - private ServerProperties testnavPersonOrganisasjonTilgangService; + private ServerProperties testnavAltinn3TilgangService; private ServerProperties testnorgeProfilApi; private ServerProperties testnavBrukerService; diff --git a/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/AltinnTilgangServiceConsumer.java b/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/AltinnTilgangServiceConsumer.java new file mode 100644 index 00000000000..684da824c75 --- /dev/null +++ b/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/AltinnTilgangServiceConsumer.java @@ -0,0 +1,59 @@ +package no.nav.testnav.apps.oversiktfrontend.consumer; + +import lombok.extern.slf4j.Slf4j; +import no.nav.testnav.apps.oversiktfrontend.config.Consumers; +import no.nav.testnav.apps.oversiktfrontend.consumer.command.GetAltinnBrukertilgangTilgangCommand; +import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO; +import no.nav.testnav.libs.reactivesecurity.action.GetAuthenticatedUserId; +import no.nav.testnav.libs.reactivesecurity.exchange.TokenExchange; +import no.nav.testnav.libs.securitycore.domain.ServerProperties; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.reactive.function.client.WebClientResponseException; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@Slf4j +@Component +public class AltinnTilgangServiceConsumer { + private final WebClient webClient; + private final ServerProperties serverProperties; + private final TokenExchange tokenExchange; + private final GetAuthenticatedUserId getAuthenticatedUserId; + + public AltinnTilgangServiceConsumer( + Consumers consumers, + TokenExchange tokenExchange, + WebClient.Builder webClientBuilder, + GetAuthenticatedUserId getAuthenticatedUserId) { + + serverProperties = consumers.getTestnavAltinn3TilgangService(); + this.tokenExchange = tokenExchange; + this.webClient = webClientBuilder + .baseUrl(serverProperties.getUrl()) + .build(); + this.getAuthenticatedUserId = getAuthenticatedUserId; + } + + public Flux getOrganisasjoner() { + + return getAuthenticatedUserId.call() + .flatMapMany(userId -> tokenExchange.exchange(serverProperties) + .flatMapMany(accessToken -> + new GetAltinnBrukertilgangTilgangCommand(webClient, userId, accessToken.getTokenValue()).call())); + } + + public Mono hasAccess(String organisasjonsnummer) { + + return Mono.from(getOrganisasjoner() + .filter(org -> org.getOrganisasjonsnummer().equals(organisasjonsnummer)) + .onErrorResume( + WebClientResponseException.class::isInstance, + throwable -> { + log.warn("Person har ikke tilgang til organisasjon {}.", organisasjonsnummer); + return Mono.empty(); + }) + .flatMap(value -> Mono.just(true)) + .switchIfEmpty(Mono.just(false))); + } +} diff --git a/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/PersonOrganisasjonTilgangConsumer.java b/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/PersonOrganisasjonTilgangConsumer.java deleted file mode 100644 index 05fcb8a1528..00000000000 --- a/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/PersonOrganisasjonTilgangConsumer.java +++ /dev/null @@ -1,71 +0,0 @@ -package no.nav.testnav.apps.oversiktfrontend.consumer; - -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.apps.oversiktfrontend.config.Consumers; -import no.nav.testnav.apps.oversiktfrontend.consumer.command.GetPersonOrganisasjonTilgangCommand; -import no.nav.testnav.apps.oversiktfrontend.consumer.command.GetPersonOrganisasjonerTilgangCommand; -import no.nav.testnav.apps.oversiktfrontend.consumer.dto.OrganisasjonDTO; -import no.nav.testnav.libs.reactivesecurity.exchange.TokenExchange; -import no.nav.testnav.libs.securitycore.domain.ServerProperties; -import org.springframework.http.MediaType; -import org.springframework.http.codec.json.Jackson2JsonDecoder; -import org.springframework.http.codec.json.Jackson2JsonEncoder; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.client.ExchangeStrategies; -import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.reactive.function.client.WebClientResponseException; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -@Slf4j -@Component -public class PersonOrganisasjonTilgangConsumer { - private final WebClient webClient; - private final ServerProperties serverProperties; - private final TokenExchange tokenExchange; - - public PersonOrganisasjonTilgangConsumer( - Consumers consumers, - TokenExchange tokenExchange, - ObjectMapper objectMapper, - WebClient.Builder webClientBuilder) { - - serverProperties = consumers.getTestnavPersonOrganisasjonTilgangService(); - this.tokenExchange = tokenExchange; - ExchangeStrategies jacksonStrategy = ExchangeStrategies - .builder() - .codecs( - config -> { - config - .defaultCodecs() - .jackson2JsonEncoder(new Jackson2JsonEncoder(objectMapper, MediaType.APPLICATION_JSON)); - config - .defaultCodecs() - .jackson2JsonDecoder(new Jackson2JsonDecoder(objectMapper, MediaType.APPLICATION_JSON)); - }) - .build(); - this.webClient = webClientBuilder - .exchangeStrategies(jacksonStrategy) - .baseUrl(serverProperties.getUrl()) - .build(); - } - - public Flux getOrganisasjoner() { - return tokenExchange.exchange(serverProperties) - .flatMapMany(accessToken -> new GetPersonOrganisasjonerTilgangCommand(webClient, accessToken.getTokenValue()).call()); - } - - public Mono hasAccess(String organisasjonsnummer) { - return tokenExchange.exchange(serverProperties) - .flatMap(accessToken -> new GetPersonOrganisasjonTilgangCommand(webClient, accessToken.getTokenValue(), organisasjonsnummer).call()) - .onErrorResume( - WebClientResponseException.class::isInstance, - throwable -> { - log.warn("Person har ikke tilgang til organisasjon {}.", organisasjonsnummer); - return Mono.empty(); - }) - .flatMap(value -> Mono.just(true)) - .switchIfEmpty(Mono.just(false)); - } -} diff --git a/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/command/GetPersonOrganisasjonerTilgangCommand.java b/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/command/GetAltinnBrukertilgangTilgangCommand.java similarity index 64% rename from apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/command/GetPersonOrganisasjonerTilgangCommand.java rename to apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/command/GetAltinnBrukertilgangTilgangCommand.java index 2649253571b..d68f1a09485 100644 --- a/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/command/GetPersonOrganisasjonerTilgangCommand.java +++ b/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/command/GetAltinnBrukertilgangTilgangCommand.java @@ -1,7 +1,8 @@ package no.nav.testnav.apps.oversiktfrontend.consumer.command; import lombok.RequiredArgsConstructor; -import no.nav.testnav.apps.oversiktfrontend.consumer.dto.OrganisasjonDTO; +import no.nav.testnav.apps.oversiktfrontend.consumer.dto.AltinnBrukerRequest; +import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO; import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; import org.springframework.web.reactive.function.client.WebClient; @@ -12,16 +13,18 @@ import java.util.concurrent.Callable; @RequiredArgsConstructor -public class GetPersonOrganisasjonerTilgangCommand implements Callable> { +public class GetAltinnBrukertilgangTilgangCommand implements Callable> { private final WebClient webClient; + private final String ident; private final String token; @Override - public Flux call() { + public Flux call() { return webClient - .get() - .uri("/api/v1/person/organisasjoner") + .post() + .uri("/api/v1/brukertilgang") .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) + .bodyValue(new AltinnBrukerRequest(ident)) .retrieve() .bodyToFlux(OrganisasjonDTO.class) .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) diff --git a/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/command/GetPersonOrganisasjonTilgangCommand.java b/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/command/GetPersonOrganisasjonTilgangCommand.java deleted file mode 100644 index ab394911458..00000000000 --- a/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/command/GetPersonOrganisasjonTilgangCommand.java +++ /dev/null @@ -1,31 +0,0 @@ -package no.nav.testnav.apps.oversiktfrontend.consumer.command; - -import lombok.RequiredArgsConstructor; -import no.nav.testnav.apps.oversiktfrontend.consumer.dto.OrganisasjonDTO; -import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; -import org.springframework.http.HttpHeaders; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; -import reactor.util.retry.Retry; - -import java.time.Duration; -import java.util.concurrent.Callable; - -@RequiredArgsConstructor -public class GetPersonOrganisasjonTilgangCommand implements Callable> { - private final WebClient webClient; - private final String token; - private final String organisasjonsnummer; - - @Override - public Mono call() { - return webClient - .get() - .uri(builder -> builder.path("/api/v1/person/organisasjoner/{organisasjonsnummer}").build(organisasjonsnummer)) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) - .retrieve() - .bodyToMono(OrganisasjonDTO.class) - .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) - .filter(WebClientFilter::is5xxException)); - } -} diff --git a/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/dto/AltinnBrukerRequest.java b/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/dto/AltinnBrukerRequest.java new file mode 100644 index 00000000000..9d1422591c4 --- /dev/null +++ b/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/dto/AltinnBrukerRequest.java @@ -0,0 +1,11 @@ +package no.nav.testnav.apps.oversiktfrontend.consumer.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class AltinnBrukerRequest { + + private String ident; +} diff --git a/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/dto/OrganisasjonDTO.java b/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/dto/OrganisasjonDTO.java deleted file mode 100644 index 5981ab1ebae..00000000000 --- a/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/consumer/dto/OrganisasjonDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package no.nav.testnav.apps.oversiktfrontend.consumer.dto; - -import java.time.LocalDateTime; - -public record OrganisasjonDTO( - String navn, - String orgnisasjonsnummer, - String orgnisasjonsfrom, - LocalDateTime gyldigTil -) { -} diff --git a/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/controller/PersonOrganisasjonController.java b/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/controller/PersonOrganisasjonController.java new file mode 100644 index 00000000000..2a5c519c294 --- /dev/null +++ b/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/controller/PersonOrganisasjonController.java @@ -0,0 +1,23 @@ +package no.nav.testnav.apps.oversiktfrontend.controller; + +import lombok.RequiredArgsConstructor; +import no.nav.testnav.apps.oversiktfrontend.consumer.AltinnTilgangServiceConsumer; +import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Flux; + +@RestController +@RequestMapping("/api/v1/person-organisasjoner") +@RequiredArgsConstructor +public class PersonOrganisasjonController { + + private final AltinnTilgangServiceConsumer altinnTilgangServiceConsumer; + + @GetMapping + public Flux getOrganisasjoner() { + + return altinnTilgangServiceConsumer.getOrganisasjoner(); + } +} diff --git a/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/service/AccessService.java b/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/service/AccessService.java index c398412334c..f9d56fc8e2e 100644 --- a/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/service/AccessService.java +++ b/apps/oversikt-frontend/src/main/java/no/nav/testnav/apps/oversiktfrontend/service/AccessService.java @@ -1,16 +1,16 @@ package no.nav.testnav.apps.oversiktfrontend.service; import lombok.RequiredArgsConstructor; -import no.nav.testnav.apps.oversiktfrontend.consumer.PersonOrganisasjonTilgangConsumer; +import no.nav.testnav.apps.oversiktfrontend.consumer.AltinnTilgangServiceConsumer; import org.springframework.stereotype.Service; import reactor.core.publisher.Mono; @Service @RequiredArgsConstructor public class AccessService { - private final PersonOrganisasjonTilgangConsumer personOrganisasjonTilgangConsumer; + private final AltinnTilgangServiceConsumer altinnTilgangServiceConsumer; public Mono hasAccess(String organisasjonsnummer) { - return personOrganisasjonTilgangConsumer.hasAccess(organisasjonsnummer); + return altinnTilgangServiceConsumer.hasAccess(organisasjonsnummer); } } diff --git a/apps/oversikt-frontend/src/main/js/proxy-routes.json b/apps/oversikt-frontend/src/main/js/proxy-routes.json index 323be714bd5..ca3b9c4f10c 100644 --- a/apps/oversikt-frontend/src/main/js/proxy-routes.json +++ b/apps/oversikt-frontend/src/main/js/proxy-routes.json @@ -7,10 +7,6 @@ "target": "http://localhost:8080", "changeOrigin": true }, - "/testnav-person-organisasjon-tilgang-service/api": { - "target": "http://localhost:8080", - "changeOrigin": true - }, "/testnav-bruker-service/api": { "target": "http://localhost:8080", "changeOrigin": true diff --git a/apps/oversikt-frontend/src/main/js/src/pages/UserPage/OrgTableBox.tsx b/apps/oversikt-frontend/src/main/js/src/pages/UserPage/OrgTableBox.tsx index 4ead089850b..d976e9d12f8 100644 --- a/apps/oversikt-frontend/src/main/js/src/pages/UserPage/OrgTableBox.tsx +++ b/apps/oversikt-frontend/src/main/js/src/pages/UserPage/OrgTableBox.tsx @@ -31,7 +31,7 @@ const OrgTableBox = () => ( {list && list.map((item, index) => ( - {item.navn + (item.organisasjonsfrom === 'AS' ? ' AS' : '')} + {item.navn + (item.organisasjonsform === 'AS' ? ' AS' : '')}
event.preventDefault()}> diff --git a/apps/oversikt-frontend/src/main/js/src/services/OrganisasjonService.ts b/apps/oversikt-frontend/src/main/js/src/services/OrganisasjonService.ts index c766de44cd2..539fc029d5d 100644 --- a/apps/oversikt-frontend/src/main/js/src/services/OrganisasjonService.ts +++ b/apps/oversikt-frontend/src/main/js/src/services/OrganisasjonService.ts @@ -3,11 +3,10 @@ import { Api } from '@navikt/dolly-lib' export type Organisasjon = { navn: string organisasjonsnummer: string - organisasjonsfrom: string - gyldigTil: string + organisasjonsform: string } const getOrganisasjoner = (): Promise => - Api.fetchJson('/testnav-person-organisasjon-tilgang-service/api/v1/person/organisasjoner', { + Api.fetchJson('/api/v1/person-organisasjoner', { method: 'GET', }) diff --git a/apps/oversikt-frontend/src/main/resources/application-local.yml b/apps/oversikt-frontend/src/main/resources/application-local.yml index f186349ca25..42d104adaa8 100644 --- a/apps/oversikt-frontend/src/main/resources/application-local.yml +++ b/apps/oversikt-frontend/src/main/resources/application-local.yml @@ -14,7 +14,7 @@ consumers: url: https://testnorge-profil-api-dev.intern.dev.nav.no/api testnav-app-tilgang-analyse-service: url: https://testnav-app-tilgang-analyse-service.intern.dev.nav.no - testnav-person-organisasjon-tilgang-service: - url: https://testnav-person-organisasjon-tilgang-service-dev.intern.dev.nav.no + testnav-altinn3-tilgang-service: + url: https://testnav-altinn3-tilgang-service.intern.dev.nav.no testnav-bruker-service: url: https://testnav-bruker-service-dev.intern.dev.nav.no \ No newline at end of file diff --git a/apps/oversikt-frontend/src/main/resources/application.yml b/apps/oversikt-frontend/src/main/resources/application.yml index cdd1bac15de..e843d6fb138 100644 --- a/apps/oversikt-frontend/src/main/resources/application.yml +++ b/apps/oversikt-frontend/src/main/resources/application.yml @@ -23,11 +23,11 @@ consumers: namespace: dolly name: testnav-app-tilgang-analyse-service url: http://testnav-app-tilgang-analyse-service.dolly.svc.cluster.local - testnav-person-organisasjon-tilgang-service: + testnav-altinn3-tilgang-service: cluster: dev-gcp namespace: dolly - name: testnav-person-organisasjon-tilgang-service-dev - url: http://testnav-person-organisasjon-tilgang-service-dev.dolly.svc.cluster.local + name: testnav-altinn3-tilgang-service + url: http://testnav-altinn3-tilgang-service.dolly.svc.cluster.local testnav-bruker-service: cluster: dev-gcp namespace: dolly diff --git a/apps/person-organisasjon-tilgang-service/Dockerfile b/apps/person-organisasjon-tilgang-service/Dockerfile deleted file mode 100644 index 11043b561a5..00000000000 --- a/apps/person-organisasjon-tilgang-service/Dockerfile +++ /dev/null @@ -1,6 +0,0 @@ -FROM ghcr.io/navikt/baseimages/temurin:21 -LABEL maintainer="Team Dolly" - -ADD build/libs/app.jar /app/app.jar - -EXPOSE 8080 \ No newline at end of file diff --git a/apps/person-organisasjon-tilgang-service/README.md b/apps/person-organisasjon-tilgang-service/README.md deleted file mode 100644 index c51ae05b890..00000000000 --- a/apps/person-organisasjon-tilgang-service/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Person Organisasjon Tilgang Service -Service som henter organisasjoner fra Altinn og hvilke tilganger de har. - -## Lokal kjøring -* [Generelt.](../../docs/local_general.md) -* [Secret Manager.](../../docs/local_secretmanager.md) \ No newline at end of file diff --git a/apps/person-organisasjon-tilgang-service/build.gradle b/apps/person-organisasjon-tilgang-service/build.gradle deleted file mode 100644 index a3ff5f959d4..00000000000 --- a/apps/person-organisasjon-tilgang-service/build.gradle +++ /dev/null @@ -1,39 +0,0 @@ -plugins { - id "dolly-apps" -} - -def test = tasks.named("test") { - useJUnitPlatform { - excludeTags "integration" - } -} -def iTest = tasks.register("iTest", Test) { - useJUnitPlatform { - includeTags "integration" - } - shouldRunAfter test -} - -sonarqube { - properties { - property "sonar.projectKey", "testnav-person-organisasjon-tilgang-service" - property "sonar.projectName", "testnav-person-organisasjon-tilgang-service" - } -} - -dependencies { - implementation "no.nav.testnav.libs:reactive-core" - implementation "no.nav.testnav.libs:reactive-security" - implementation "no.nav.testnav.libs:security-core" - - implementation "org.springframework.boot:spring-boot-starter-oauth2-resource-server" - - implementation "org.springdoc:springdoc-openapi-starter-webflux-ui:$versions.springdoc" - - implementation "com.fasterxml.jackson.core:jackson-core:$versions.jackson" - - testImplementation "org.springframework.cloud:spring-cloud-contract-wiremock" - testImplementation "no.nav.testnav.libs:integration-test" - testImplementation "com.squareup.okhttp3:okhttp:$versions.okhttp" - testImplementation "com.squareup.okhttp3:mockwebserver:$versions.okhttp" -} diff --git a/apps/person-organisasjon-tilgang-service/config.yml b/apps/person-organisasjon-tilgang-service/config.yml deleted file mode 100644 index e36d5c507e6..00000000000 --- a/apps/person-organisasjon-tilgang-service/config.yml +++ /dev/null @@ -1,69 +0,0 @@ -apiVersion: "nais.io/v1alpha1" -kind: "Application" -metadata: - name: testnav-person-organisasjon-tilgang-service - namespace: dolly - labels: - team: dolly -spec: - image: "{{image}}" - port: 8080 - azure: - application: - allowAllUsers: true - enabled: true - tenant: nav.no - tokenx: - enabled: true - accessPolicy: - inbound: - rules: - - application: dolly-frontend - - application: dolly-idporten - - application: team-dolly-lokal-app - - application: testnav-oversikt-frontend - - application: testnav-bruker-service - - application: testnorge-profil-api - outbound: - external: - - host: altinn.no - - host: maskinporten.no - liveness: - path: /internal/isAlive - initialDelay: 4 - periodSeconds: 5 - failureThreshold: 500 - observability: - logging: - destinations: - - id: elastic - autoInstrumentation: - enabled: true - runtime: java - readiness: - path: /internal/isReady - initialDelay: 4 - periodSeconds: 5 - failureThreshold: 500 - prometheus: - enabled: true - path: /internal/metrics - envFrom: - - secret: altinn-prod - - secret: maskinporten-dolly-prod - replicas: - min: 1 - max: 1 - resources: - requests: - cpu: 200m - memory: 1024Mi - limits: - memory: 2048Mi - ingresses: - - "https://testnav-person-organisasjon-tilgang-service.intern.dev.nav.no" - env: - - name: SPRING_PROFILES_ACTIVE - value: prod - - name: ALTINN_URL - value: https://altinn.no \ No newline at end of file diff --git a/apps/person-organisasjon-tilgang-service/gradle/wrapper/gradle-wrapper.jar b/apps/person-organisasjon-tilgang-service/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL diff --git a/apps/person-organisasjon-tilgang-service/gradle/wrapper/gradle-wrapper.properties b/apps/person-organisasjon-tilgang-service/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 48c0a02ca41..00000000000 --- a/apps/person-organisasjon-tilgang-service/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/apps/person-organisasjon-tilgang-service/gradlew b/apps/person-organisasjon-tilgang-service/gradlew deleted file mode 100755 index 3da45c161b0..00000000000 --- a/apps/person-organisasjon-tilgang-service/gradlew +++ /dev/null @@ -1,234 +0,0 @@ -#!/bin/sh - -# -# Copyright ? 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions ?$var?, ?${var}?, ?${var:-default}?, ?${var+SET}?, -# ?${var#prefix}?, ?${var%suffix}?, and ?$( cmd )?; -# * compound commands having a testable exit status, especially ?case?; -# * various built-in commands including ?command?, ?set?, and ?ulimit?. -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/apps/person-organisasjon-tilgang-service/gradlew.bat b/apps/person-organisasjon-tilgang-service/gradlew.bat deleted file mode 100644 index ac1b06f9382..00000000000 --- a/apps/person-organisasjon-tilgang-service/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/apps/person-organisasjon-tilgang-service/gradlewUpdate.sh b/apps/person-organisasjon-tilgang-service/gradlewUpdate.sh deleted file mode 100755 index e5ee6361152..00000000000 --- a/apps/person-organisasjon-tilgang-service/gradlewUpdate.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -gradle wrapper \ No newline at end of file diff --git a/apps/person-organisasjon-tilgang-service/settings.gradle b/apps/person-organisasjon-tilgang-service/settings.gradle deleted file mode 100644 index 6c93b49e1a4..00000000000 --- a/apps/person-organisasjon-tilgang-service/settings.gradle +++ /dev/null @@ -1,19 +0,0 @@ -plugins { - id "com.gradle.develocity" version "3.17.4" -} - -rootProject.name = 'person-organisasjon-tilgang-service' - -includeBuild "../../plugins/java" - -includeBuild '../../libs/integration-test' -includeBuild '../../libs/reactive-core' -includeBuild '../../libs/reactive-security' -includeBuild '../../libs/security-core' - -develocity { - buildScan { - termsOfUseUrl = "https://gradle.com/terms-of-service" - termsOfUseAgree = "yes" - } -} \ No newline at end of file diff --git a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/PersonOrganisasjonTilgangServiceApplicationStarter.java b/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/PersonOrganisasjonTilgangServiceApplicationStarter.java deleted file mode 100644 index 9b61b5fd26c..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/PersonOrganisasjonTilgangServiceApplicationStarter.java +++ /dev/null @@ -1,22 +0,0 @@ -package no.nav.testnav.apps.persontilgangservice; - -import no.nav.testnav.libs.reactivecore.config.CoreConfig; -import no.nav.testnav.libs.reactivesecurity.config.SecureOAuth2ServerToServerConfiguration; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Import; -import org.springframework.web.reactive.config.EnableWebFlux; - - -@Import({ - CoreConfig.class, - SecureOAuth2ServerToServerConfiguration.class -}) -@EnableWebFlux -@SpringBootApplication -public class PersonOrganisasjonTilgangServiceApplicationStarter { - - public static void main(String[] args) { - SpringApplication.run(PersonOrganisasjonTilgangServiceApplicationStarter.class, args); - } -} diff --git a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/altinn/v1/AltinnClient.java b/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/altinn/v1/AltinnClient.java deleted file mode 100644 index ee46fe8a4c0..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/altinn/v1/AltinnClient.java +++ /dev/null @@ -1,78 +0,0 @@ -package no.nav.testnav.apps.persontilgangservice.client.altinn.v1; - -import com.fasterxml.jackson.databind.ObjectMapper; -import no.nav.testnav.apps.persontilgangservice.client.altinn.v1.command.GetPersonAccessCommand; -import no.nav.testnav.apps.persontilgangservice.client.altinn.v1.dto.AccessDTO; -import no.nav.testnav.apps.persontilgangservice.client.maskinporten.v1.MaskinportenClient; -import no.nav.testnav.apps.persontilgangservice.config.AltinnConfig; -import no.nav.testnav.apps.persontilgangservice.domain.Access; -import no.nav.testnav.libs.reactivesecurity.action.GetAuthenticatedUserId; -import org.springframework.http.codec.json.Jackson2JsonDecoder; -import org.springframework.http.codec.json.Jackson2JsonEncoder; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -import java.util.Arrays; - -@Component -public class AltinnClient { - - private final WebClient webClient; - private final AltinnConfig altinnConfig; - private final MaskinportenClient maskinportenClient; - private final GetAuthenticatedUserId getAuthenticatedUserId; - - public AltinnClient( - AltinnConfig altinnConfig, - MaskinportenClient maskinportenClient, - ObjectMapper objectMapper, - GetAuthenticatedUserId getAuthenticatedUserId - ) { - this.altinnConfig = altinnConfig; - this.maskinportenClient = maskinportenClient; - this.getAuthenticatedUserId = getAuthenticatedUserId; - this.webClient = WebClient - .builder() - .baseUrl(altinnConfig.getUrl()) - .codecs(clientDefaultCodecsConfigurer -> { - clientDefaultCodecsConfigurer - .defaultCodecs() - .jackson2JsonEncoder(new Jackson2JsonEncoder(objectMapper)); - clientDefaultCodecsConfigurer - .defaultCodecs() - .jackson2JsonDecoder(new Jackson2JsonDecoder(objectMapper)); - }) - .build(); - } - - public Flux getAccess() { - return getAuthenticatedUserId - .call() - .flatMapMany(userId -> maskinportenClient - .getAccessToken() - .flatMap(accessToken -> new GetPersonAccessCommand( - webClient, - accessToken.value(), - userId, - altinnConfig.getCode(), - altinnConfig.getEdition(), - altinnConfig.getApiKey() - ).call() - ).map(accesses -> Arrays - .stream(accesses) - .filter(AccessDTO::isActive) - .map(Access::new) - .toList() - ).flatMapIterable(list -> list) - ); - } - - public Mono getAccess(String organiasjonsnummer) { - return getAccess() - .filter(value -> value.getOrganisajonsnummer().equals(organiasjonsnummer)) - .next(); - } - -} diff --git a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/altinn/v1/command/GetPersonAccessCommand.java b/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/altinn/v1/command/GetPersonAccessCommand.java deleted file mode 100644 index 5db7644abc0..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/altinn/v1/command/GetPersonAccessCommand.java +++ /dev/null @@ -1,48 +0,0 @@ -package no.nav.testnav.apps.persontilgangservice.client.altinn.v1.command; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.apps.persontilgangservice.client.altinn.v1.dto.AccessDTO; -import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; -import org.springframework.http.HttpHeaders; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; -import reactor.util.retry.Retry; - -import java.time.Duration; -import java.util.Arrays; -import java.util.concurrent.Callable; - -@Slf4j -@RequiredArgsConstructor -public class GetPersonAccessCommand implements Callable> { - private final WebClient webClient; - private final String token; - private final String ident; - private final String serviceCode; - private final String serviceEdition; - private final String apiKey; - - @Override - public Mono call() { - return webClient - .get() - .uri(builder -> builder.path("/api/serviceowner/reportees") - .queryParam("subject", ident) - .queryParam("serviceCode", serviceCode) - .queryParam("serviceEdition", serviceEdition) - .build() - ) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) - .header("ApiKey", apiKey) - .retrieve() - .bodyToMono(AccessDTO[].class) - .doOnNext(response -> Arrays.stream(response) - .forEach(entry -> - log.info("Hentet organisasjon fra Altinn: navn: {}, type: {}, orgnr: {}, orgform: {}, status: {} ", - entry.name(), entry.type(), entry.organizationNumber(), entry.organizationForm(), entry.status()))) - .doOnError(error -> log.error("Henting av \"/reportees\" feilet: {}", WebClientFilter.getMessage(error), error)) - .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) - .filter(WebClientFilter::is5xxException)); - } -} diff --git a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/altinn/v1/dto/AccessDTO.java b/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/altinn/v1/dto/AccessDTO.java deleted file mode 100644 index dad4ebe38ca..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/altinn/v1/dto/AccessDTO.java +++ /dev/null @@ -1,21 +0,0 @@ -package no.nav.testnav.apps.persontilgangservice.client.altinn.v1.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public record AccessDTO( - @JsonProperty("Name") - String name, - @JsonProperty("Type") - String type, - @JsonProperty("OrganizationNumber") - String organizationNumber, - @JsonProperty("OrganizationForm") - String organizationForm, - @JsonProperty("Status") - String status -) { - - public boolean isActive() { - return status.equals("Active"); - } -} diff --git a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/maskinporten/v1/MaskinportenClient.java b/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/maskinporten/v1/MaskinportenClient.java deleted file mode 100644 index e8e640b7220..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/maskinporten/v1/MaskinportenClient.java +++ /dev/null @@ -1,91 +0,0 @@ -package no.nav.testnav.apps.persontilgangservice.client.maskinporten.v1; - -import com.nimbusds.jose.JOSEException; -import com.nimbusds.jose.JOSEObjectType; -import com.nimbusds.jose.JWSAlgorithm; -import com.nimbusds.jose.JWSHeader; -import com.nimbusds.jose.JWSSigner; -import com.nimbusds.jose.crypto.RSASSASigner; -import com.nimbusds.jose.jwk.RSAKey; -import com.nimbusds.jwt.JWTClaimsSet; -import com.nimbusds.jwt.SignedJWT; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.apps.persontilgangservice.client.maskinporten.v1.command.GetAccessTokenCommand; -import no.nav.testnav.apps.persontilgangservice.client.maskinporten.v1.command.GetWellKnownCommand; -import no.nav.testnav.apps.persontilgangservice.client.maskinporten.v1.dto.AccessToken; -import no.nav.testnav.apps.persontilgangservice.config.MaskinportenConfig; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; - -import java.time.Duration; -import java.time.Instant; -import java.util.Date; -import java.util.UUID; -import java.util.function.Function; - -@Slf4j -@Component -public class MaskinportenClient { - - private final WebClient webClient; - private final MaskinportenConfig maskinportenConfig; - private final Mono accessToken; - - public MaskinportenClient(MaskinportenConfig maskinportenConfig) { - this.webClient = WebClient.builder().build(); - this.maskinportenConfig = maskinportenConfig; - var wellKnownMono = cache( - new GetWellKnownCommand(webClient, maskinportenConfig).call(), - value -> Duration.ofDays(7) - ); - this.accessToken = cache( - wellKnownMono.flatMap(wellKnown -> new GetAccessTokenCommand(webClient, wellKnown, createJwtClaims(wellKnown.issuer())).call()), - value -> Duration.ofSeconds(value.expiresIn() - 10L) - ); - } - - private static Mono cache(Mono value, Function ttlForValue) { - return value.cache( - ttlForValue, - throwable -> Duration.ZERO, - () -> Duration.ZERO - ); - } - - public Mono getAccessToken() { - return accessToken.map(no.nav.testnav.apps.persontilgangservice.domain.AccessToken::new); - } - - @SneakyThrows - private String createJwtClaims(String audience) { - Instant now = Instant.now(); - var rsaKey = RSAKey.parse(maskinportenConfig.getJwkPrivate()); - return createSignedJWT(rsaKey, - new JWTClaimsSet.Builder() - .audience(audience) - .claim("scope", maskinportenConfig.getScope()) - .issuer(maskinportenConfig.getClientId()) - .issueTime(Date.from(now)) - .expirationTime(Date.from(now.plusSeconds(119))) - .jwtID(UUID.randomUUID().toString()) - .build()) - .serialize(); - } - - private SignedJWT createSignedJWT(RSAKey rsaJwk, JWTClaimsSet claimsSet) { - try { - JWSHeader.Builder header = new JWSHeader.Builder(JWSAlgorithm.RS256) - .keyID(rsaJwk.getKeyID()) - .type(JOSEObjectType.JWT); - SignedJWT signedJWT = new SignedJWT(header.build(), claimsSet); - JWSSigner signer = new RSASSASigner(rsaJwk.toPrivateKey()); - signedJWT.sign(signer); - return signedJWT; - } catch (JOSEException e) { - throw new RuntimeException(e); - } - } - -} diff --git a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/maskinporten/v1/command/GetAccessTokenCommand.java b/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/maskinporten/v1/command/GetAccessTokenCommand.java deleted file mode 100644 index f1da03d101d..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/maskinporten/v1/command/GetAccessTokenCommand.java +++ /dev/null @@ -1,40 +0,0 @@ -package no.nav.testnav.apps.persontilgangservice.client.maskinporten.v1.command; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.apps.persontilgangservice.client.maskinporten.v1.dto.AccessToken; -import no.nav.testnav.apps.persontilgangservice.client.maskinporten.v1.dto.WellKnown; -import org.springframework.web.reactive.function.BodyInserters; -import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.reactive.function.client.WebClientResponseException; -import reactor.core.publisher.Mono; - -import java.util.concurrent.Callable; - -@Slf4j -@RequiredArgsConstructor -public class GetAccessTokenCommand implements Callable> { - private final WebClient webClient; - private final WellKnown wellKnown; - private final String assertion; - - @Override - public Mono call() { - return webClient.post() - .uri(wellKnown.tokenEndpoint()) - .body(BodyInserters - .fromFormData("grant_type", wellKnown.grantTypesSupported().get(0)) - .with("assertion", assertion) - ) - .retrieve() - .bodyToMono(AccessToken.class) - .doOnSuccess(value -> log.info("AccessToken hentet fra maskinporten.")) - .doOnError( - WebClientResponseException.class::isInstance, - throwable -> log.error( - "Feil ved henting av AccessToken for maskinporten. \n{}", - ((WebClientResponseException) throwable).getResponseBodyAsString() - ) - ); - } -} diff --git a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/maskinporten/v1/command/GetWellKnownCommand.java b/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/maskinporten/v1/command/GetWellKnownCommand.java deleted file mode 100644 index 41d3a870157..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/maskinporten/v1/command/GetWellKnownCommand.java +++ /dev/null @@ -1,34 +0,0 @@ -package no.nav.testnav.apps.persontilgangservice.client.maskinporten.v1.command; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.apps.persontilgangservice.client.maskinporten.v1.dto.WellKnown; -import no.nav.testnav.apps.persontilgangservice.config.MaskinportenConfig; -import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.reactive.function.client.WebClientResponseException; -import reactor.core.publisher.Mono; - -import java.util.concurrent.Callable; - -@Slf4j -@RequiredArgsConstructor -public class GetWellKnownCommand implements Callable> { - private final WebClient webClient; - private final MaskinportenConfig maskinportenConfig; - - @Override - public Mono call() { - return webClient.get() - .uri(maskinportenConfig.getWellKnownUrl()) - .retrieve() - .bodyToMono(WellKnown.class) - .doOnSuccess(value -> log.info("WellKnown hentet for maskinporten.")) - .doOnError( - WebClientResponseException.class::isInstance, - throwable -> log.error( - "Feil ved henting av well known for maskinporten. \n{}", - ((WebClientResponseException) throwable).getResponseBodyAsString() - ) - ); - } -} diff --git a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/maskinporten/v1/dto/AccessToken.java b/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/maskinporten/v1/dto/AccessToken.java deleted file mode 100644 index 90ede59fe24..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/maskinporten/v1/dto/AccessToken.java +++ /dev/null @@ -1,16 +0,0 @@ -package no.nav.testnav.apps.persontilgangservice.client.maskinporten.v1.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public record AccessToken( - @JsonProperty("access_token") - String accessToken, - @JsonProperty("token_type") - String tokenType, - @JsonProperty("expires_in") - Integer expiresIn, - @JsonProperty("scope") - String scope -) { - -} diff --git a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/maskinporten/v1/dto/WellKnown.java b/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/maskinporten/v1/dto/WellKnown.java deleted file mode 100644 index da750ff225d..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/client/maskinporten/v1/dto/WellKnown.java +++ /dev/null @@ -1,18 +0,0 @@ -package no.nav.testnav.apps.persontilgangservice.client.maskinporten.v1.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import java.util.List; - -public record WellKnown( - String issuer, - @JsonProperty("token_endpoint") - String tokenEndpoint, - @JsonProperty("jwks_uri") - String jwksUri, - @JsonProperty("token_endpoint_auth_methods_supported") - List tokenEndpointAuthMethodsSupported, - @JsonProperty("grant_types_supported") - List grantTypesSupported -) { -} diff --git a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/config/AltinnConfig.java b/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/config/AltinnConfig.java deleted file mode 100644 index e1ecc5f9e30..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/config/AltinnConfig.java +++ /dev/null @@ -1,41 +0,0 @@ -package no.nav.testnav.apps.persontilgangservice.config; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class AltinnConfig { - - private final String url; - private final String apiKey; - private final String code; - private final String edition; - - public AltinnConfig( - @Value("${altinn.api.url}") String url, - @Value("${altinn.api.key}") String apiKey, - @Value("${altinn.service.code}") String code, - @Value("${altinn.service.edition}") String edition - ) { - this.url = url; - this.apiKey = apiKey; - this.code = code; - this.edition = edition; - } - - public String getCode() { - return code; - } - - public String getEdition() { - return edition; - } - - public String getUrl() { - return url; - } - - public String getApiKey() { - return apiKey; - } -} diff --git a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/config/JacksonConfig.java b/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/config/JacksonConfig.java deleted file mode 100644 index cbc95a05771..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/config/JacksonConfig.java +++ /dev/null @@ -1,27 +0,0 @@ -package no.nav.testnav.apps.persontilgangservice.config; - -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.RequiredArgsConstructor; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.codec.ServerCodecConfigurer; -import org.springframework.http.codec.json.Jackson2JsonDecoder; -import org.springframework.http.codec.json.Jackson2JsonEncoder; -import org.springframework.web.reactive.config.WebFluxConfigurer; - -@Configuration -@RequiredArgsConstructor -public class JacksonConfig implements WebFluxConfigurer { - - private final ObjectMapper objectMapper; - - @Override - public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) { - configurer.defaultCodecs().jackson2JsonEncoder( - new Jackson2JsonEncoder(objectMapper) - ); - - configurer.defaultCodecs().jackson2JsonDecoder( - new Jackson2JsonDecoder(objectMapper) - ); - } -} \ No newline at end of file diff --git a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/config/MaskinportenConfig.java b/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/config/MaskinportenConfig.java deleted file mode 100644 index faa744f3be2..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/config/MaskinportenConfig.java +++ /dev/null @@ -1,41 +0,0 @@ -package no.nav.testnav.apps.persontilgangservice.config; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class MaskinportenConfig { - - private final String clientId; - private final String jwkPrivate; - private final String scope; - private final String wellKnownUrl; - - public MaskinportenConfig( - @Value("${MASKINPORTEN_CLIENT_ID}") String clientId, - @Value("${MASKINPORTEN_CLIENT_JWK}") String jwkPrivate, - @Value("${MASKINPORTEN_SCOPES}") String scope, - @Value("${MASKINPORTEN_WELL_KNOWN_URL}") String wellKnownUrl - ) { - this.clientId = clientId; - this.scope = scope; - this.jwkPrivate = jwkPrivate; - this.wellKnownUrl = wellKnownUrl; - } - - public String getClientId() { - return clientId; - } - - public String getJwkPrivate() { - return jwkPrivate; - } - - public String getScope() { - return scope; - } - - public String getWellKnownUrl() { - return wellKnownUrl; - } -} diff --git a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/config/OpenApiConfig.java b/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/config/OpenApiConfig.java deleted file mode 100644 index 65c78d3efbd..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/config/OpenApiConfig.java +++ /dev/null @@ -1,49 +0,0 @@ -package no.nav.testnav.apps.persontilgangservice.config; - -import io.swagger.v3.oas.models.Components; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.info.Contact; -import io.swagger.v3.oas.models.info.Info; -import io.swagger.v3.oas.models.info.License; -import io.swagger.v3.oas.models.security.SecurityRequirement; -import io.swagger.v3.oas.models.security.SecurityScheme; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.Arrays; - -import no.nav.testnav.libs.reactivecore.config.ApplicationProperties; - - -@Configuration -public class OpenApiConfig { - - @Bean - public OpenAPI openApi(ApplicationProperties applicationProperties) { - return new OpenAPI() - .components(new Components().addSecuritySchemes("bearer-jwt", new SecurityScheme() - .type(SecurityScheme.Type.HTTP) - .scheme("bearer") - .bearerFormat("JWT") - .in(SecurityScheme.In.HEADER) - .name("Authorization") - )) - .addSecurityItem( - new SecurityRequirement().addList("bearer-jwt", Arrays.asList("read", "write"))) - .info(new Info() - .title(applicationProperties.getName()) - .version(applicationProperties.getVersion()) - .description(applicationProperties.getDescription()) - .termsOfService("https://nav.no") - .contact(new Contact() - .url("https://nav-it.slack.com/archives/CA3P9NGA2") - .email("dolly@nav.no") - .name("Team Dolly") - ) - .license(new License() - .name("MIT License") - .url("https://opensource.org/licenses/MIT") - ) - ); - } -} \ No newline at end of file diff --git a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/config/SecurityConfig.java b/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/config/SecurityConfig.java deleted file mode 100644 index 0701a612ba3..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/config/SecurityConfig.java +++ /dev/null @@ -1,40 +0,0 @@ -package no.nav.testnav.apps.persontilgangservice.config; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.libs.reactivesecurity.manager.JwtReactiveAuthenticationManager; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.method.configuration.EnableReactiveMethodSecurity; -import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; -import org.springframework.security.config.web.server.ServerHttpSecurity; -import org.springframework.security.web.server.SecurityWebFilterChain; - - -@Slf4j -@Configuration -@EnableWebFluxSecurity -@EnableReactiveMethodSecurity -@RequiredArgsConstructor -public class SecurityConfig { - - private final JwtReactiveAuthenticationManager jwtReactiveAuthenticationManager; - - @Bean - public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity httpSecurity) { - return httpSecurity - .csrf(ServerHttpSecurity.CsrfSpec::disable) - .authorizeExchange(authorizeConfig -> authorizeConfig.pathMatchers( - "/internal/**", - "/webjars/**", - "/swagger-resources/**", - "/v3/api-docs/**", - "/swagger-ui/**", - "/swagger", - "/error", - "/swagger-ui.html" - ).permitAll().anyExchange().authenticated()) - .oauth2ResourceServer(oauth2RSConfig -> oauth2RSConfig.jwt(jwtSpec -> jwtSpec.authenticationManager(jwtReactiveAuthenticationManager))) - .build(); - } -} diff --git a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/controller/PersonOrganisasjonController.java b/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/controller/PersonOrganisasjonController.java deleted file mode 100644 index bf27e55d982..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/controller/PersonOrganisasjonController.java +++ /dev/null @@ -1,42 +0,0 @@ -package no.nav.testnav.apps.persontilgangservice.controller; - -import lombok.RequiredArgsConstructor; -import no.nav.testnav.apps.persontilgangservice.controller.dto.OrganisasjonDTO; -import no.nav.testnav.apps.persontilgangservice.domain.Access; -import no.nav.testnav.apps.persontilgangservice.domain.AccessToken; -import no.nav.testnav.apps.persontilgangservice.service.PersonOrganisasjonService; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -@RestController -@RequestMapping("/api/v1/person/organisasjoner") -@RequiredArgsConstructor -public class PersonOrganisasjonController { - - private final PersonOrganisasjonService personOrganisasjonService; - - @GetMapping - public Flux getOrganiasjoner() { - return personOrganisasjonService.getAccess().map(Access::toDTO); - } - - @GetMapping("/token") - public Mono getMaskinportenToken() { - return personOrganisasjonService.getAccessToken(); - } - - - @GetMapping("/{organisasjonsnummer}") - public Mono> getOrganiasjoner(@PathVariable String organisasjonsnummer) { - return personOrganisasjonService - .getAccess(organisasjonsnummer) - .map(Access::toDTO) - .map(ResponseEntity::ok) - .switchIfEmpty(Mono.just(ResponseEntity.notFound().build())); - } -} \ No newline at end of file diff --git a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/controller/dto/OrganisasjonDTO.java b/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/controller/dto/OrganisasjonDTO.java deleted file mode 100644 index 991b8127bd2..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/controller/dto/OrganisasjonDTO.java +++ /dev/null @@ -1,14 +0,0 @@ -package no.nav.testnav.apps.persontilgangservice.controller.dto; - -import com.fasterxml.jackson.annotation.JsonInclude; - -import java.time.LocalDateTime; - -@JsonInclude(JsonInclude.Include.NON_NULL) -public record OrganisasjonDTO( - String navn, - String organisasjonsnummer, - String organisasjonsfrom, - LocalDateTime gyldigTil -) { -} diff --git a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/domain/Access.java b/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/domain/Access.java deleted file mode 100644 index 59c416dd45c..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/domain/Access.java +++ /dev/null @@ -1,29 +0,0 @@ -package no.nav.testnav.apps.persontilgangservice.domain; - -import no.nav.testnav.apps.persontilgangservice.client.altinn.v1.dto.AccessDTO; -import no.nav.testnav.apps.persontilgangservice.controller.dto.OrganisasjonDTO; - -public class Access { - private final String navn; - private final String organisajonsnummer; - private final String organisajonsfrom; - - public Access(AccessDTO accessDTO) { - this.navn = accessDTO.name(); - this.organisajonsnummer = accessDTO.organizationNumber(); - this.organisajonsfrom = accessDTO.organizationForm(); - } - - public OrganisasjonDTO toDTO() { - return new OrganisasjonDTO( - navn, - organisajonsnummer, - organisajonsfrom, - null // TODO Set gyldigTil - ); - } - - public String getOrganisajonsnummer() { - return organisajonsnummer; - } -} diff --git a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/domain/AccessToken.java b/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/domain/AccessToken.java deleted file mode 100644 index 636a4aa3510..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/domain/AccessToken.java +++ /dev/null @@ -1,7 +0,0 @@ -package no.nav.testnav.apps.persontilgangservice.domain; - -public record AccessToken(String value) { - public AccessToken(no.nav.testnav.apps.persontilgangservice.client.maskinporten.v1.dto.AccessToken accessToken) { - this(accessToken.accessToken()); - } -} diff --git a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/service/PersonOrganisasjonService.java b/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/service/PersonOrganisasjonService.java deleted file mode 100644 index bc8bfc06fc4..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/main/java/no/nav/testnav/apps/persontilgangservice/service/PersonOrganisasjonService.java +++ /dev/null @@ -1,31 +0,0 @@ -package no.nav.testnav.apps.persontilgangservice.service; - -import lombok.RequiredArgsConstructor; -import no.nav.testnav.apps.persontilgangservice.client.maskinporten.v1.MaskinportenClient; -import no.nav.testnav.apps.persontilgangservice.domain.AccessToken; -import org.springframework.stereotype.Service; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -import no.nav.testnav.apps.persontilgangservice.client.altinn.v1.AltinnClient; -import no.nav.testnav.apps.persontilgangservice.domain.Access; - -@Service -@RequiredArgsConstructor -public class PersonOrganisasjonService { - - private final AltinnClient client; - private final MaskinportenClient maskinportenClient; - - public Flux getAccess() { - return client.getAccess(); - } - - public Mono getAccessToken() { - return maskinportenClient.getAccessToken(); - } - - public Mono getAccess(String organiasjonsnummer) { - return client.getAccess(organiasjonsnummer); - } -} diff --git a/apps/person-organisasjon-tilgang-service/src/main/resources/application-local.yml b/apps/person-organisasjon-tilgang-service/src/main/resources/application-local.yml deleted file mode 100644 index 1d0b7c93e9d..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/main/resources/application-local.yml +++ /dev/null @@ -1,15 +0,0 @@ -ALTINN_API_KEY: dummy -ALTINN_URL: https://tt02.altinn.no -AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} -AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} -MASKINPORTEN_CLIENT_ID: dummy -MASKINPORTEN_CLIENT_JWK: dummy -MASKINPORTEN_SCOPES: dummy -MASKINPORTEN_WELL_KNOWN_URL: dummy -OKEN_X_JWKS_URI: dummy -TOKEN_X_CLIENT_ID: dummy -TOKEN_X_ISSUER: dummy - -spring: - config: - import: "sm://" diff --git a/apps/person-organisasjon-tilgang-service/src/main/resources/application-virtual.yml b/apps/person-organisasjon-tilgang-service/src/main/resources/application-virtual.yml deleted file mode 100644 index 2a087356478..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/main/resources/application-virtual.yml +++ /dev/null @@ -1,20 +0,0 @@ -TOKEN_X_ISSUER: http://tokendings:8080 -TOKEN_X_JWKS_URI: http://tokendings:8080/jwks -TOKEN_X_CLIENT_ID: dev-gcp:dolly:testnav-person-organisasjon-tilgang-service - -spring: - cloud: - gcp: - secretmanager: - enabled: false - -altinn: - api: - url: http://altinn:8080 - key: dummy-altinn-key - -TOKEN_X_WELL_KNOWN_URL: http://tokendings:8080/.well-known/oauth-authorization-server - -MASKINPORTEN_CLIENT_ID: client-id -MASKINPORTEN_SCOPES: scopes -MASKINPORTEN_WELL_KNOWN_URL: http://maskinporten:8080/.well-known/oauth-authorization-server \ No newline at end of file diff --git a/apps/person-organisasjon-tilgang-service/src/main/resources/application.yml b/apps/person-organisasjon-tilgang-service/src/main/resources/application.yml deleted file mode 100644 index 095b0b2f172..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/main/resources/application.yml +++ /dev/null @@ -1,57 +0,0 @@ -AAD_ISSUER_URI: https://login.microsoftonline.com/62366534-1ec3-4962-8869-9b5535279d0b - -spring: - application: - version: application.version.todo - name: testnav-person-organisasjon-tilgang-service - description: Tjeneste for å hente tilganger for personer - security: - oauth2: - resourceserver: - aad: - 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} - jackson: - serialization: - write_dates_as_timestamps: false - -springdoc: - swagger-ui: - disable-swagger-default-url: true - url: /v3/api-docs - -altinn: - api: - url: ${ALTINN_URL} - key: ${ALTINN_API_KEY} - service: - code: 5748 - edition: 1 - -management: - endpoints: - enabled-by-default: true - web: - base-path: /internal - exposure: - include: prometheus,health - path-mapping: - prometheus: metrics - endpoint: - prometheus: - enabled: true - prometheus: - metrics: - export: - enabled: true -server: - servlet: - encoding: - charset: UTF-8 - error: - include-message: always \ No newline at end of file diff --git a/apps/person-organisasjon-tilgang-service/src/main/resources/logback-spring.xml b/apps/person-organisasjon-tilgang-service/src/main/resources/logback-spring.xml deleted file mode 100644 index 4e4897ae999..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/main/resources/logback-spring.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - true - - 10280 - 20 - ^sun\.reflect\..*\.invoke - ^net\.sf\.cglib\.proxy\.MethodProxy\.invoke - java\.util\.concurrent\..* - org\.apache\.catalina\..* - org\.apache\.coyote\..* - org\.apache\.tomcat\..* - - - - - - - - - - - - - %d{HH:mm:ss.SSS} | %5p | %logger{25} | %m%n - - utf8 - - - - - - - - - - - - %d{HH:mm:ss.SSS} | %5p | %logger{25} | %m%n - - utf8 - - - - - - - - - \ No newline at end of file diff --git a/apps/person-organisasjon-tilgang-service/src/test/java/no/nav/testnav/apps/persontilgangservice/ApplicationContextTest.java b/apps/person-organisasjon-tilgang-service/src/test/java/no/nav/testnav/apps/persontilgangservice/ApplicationContextTest.java deleted file mode 100644 index 384f37ebae5..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/test/java/no/nav/testnav/apps/persontilgangservice/ApplicationContextTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package no.nav.testnav.apps.persontilgangservice; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.security.oauth2.jwt.ReactiveJwtDecoder; -import org.springframework.test.context.ActiveProfiles; - -@SpringBootTest -@ActiveProfiles("test") -class ApplicationContextTest { - - @MockBean - public ReactiveJwtDecoder jwtDecoder; - - @Test - @SuppressWarnings("java:S2699") - void load_app_context() { - } -} diff --git a/apps/person-organisasjon-tilgang-service/src/test/java/no/nav/testnav/apps/persontilgangservice/integrationtest/PersonTilgangServiceIntegrationTest.java b/apps/person-organisasjon-tilgang-service/src/test/java/no/nav/testnav/apps/persontilgangservice/integrationtest/PersonTilgangServiceIntegrationTest.java deleted file mode 100644 index c8080baed10..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/test/java/no/nav/testnav/apps/persontilgangservice/integrationtest/PersonTilgangServiceIntegrationTest.java +++ /dev/null @@ -1,101 +0,0 @@ -package no.nav.testnav.apps.persontilgangservice.integrationtest; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import no.nav.testnav.apps.persontilgangservice.controller.dto.OrganisasjonDTO; -import no.nav.testnav.integrationtest.client.TokendingsClient; -import no.nav.testnav.libs.securitycore.domain.AccessToken; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Tag; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.security.oauth2.jwt.JwtDecoder; -import org.springframework.web.reactive.function.client.WebClient; - -import java.io.IOException; -import java.time.LocalDateTime; - -import static java.util.Collections.singletonList; - -@Tag("integration") -class PersonTilgangServiceIntegrationTest { - - private static final String PID = "01810048413"; - public static MockWebServer mockBackEnd; - @MockBean - JwtDecoder jwtDecoder; - private ObjectMapper objectMapper; - private WebClient webClient; - private TokendingsClient tokendingsClient; - - @BeforeAll - static void setUp() throws IOException { - mockBackEnd = new MockWebServer(); - mockBackEnd.start(); - } - - @AfterAll - static void tearDown() throws IOException { - mockBackEnd.shutdown(); - } - - @BeforeEach - void initialize() { - String baseUrl = String.format("http://localhost:%s", - mockBackEnd.getPort()); - tokendingsClient = new TokendingsClient(baseUrl); - webClient = WebClient.builder().baseUrl(baseUrl).build(); - objectMapper = new ObjectMapper(); - objectMapper.registerModule(new JavaTimeModule()); - } - - @Test - void should_get_all_organisasjons_user_has_access_to_and_get_a_single_organisasjon() throws JsonProcessingException { - - mockBackEnd.enqueue( - new MockResponse().setResponseCode(200) - .setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .setBody(objectMapper.writeValueAsString(new AccessToken("test")))); - // Opprett token for brukeren - var token = tokendingsClient.generateToken("dev-gcp:dolly:testnav-person-organisasjon-tilgang-service", PID).block(); - - mockBackEnd.enqueue( - new MockResponse().setResponseCode(200) - .setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .setBody(objectMapper.writeValueAsString(singletonList(new OrganisasjonDTO("test", "123", "test", LocalDateTime.now()))))); - // Hent alle organiasjoner brukeren har tilgang til - var organisasjoner = webClient.get() - .uri("/api/v1/person/organisasjoner") - .header(HttpHeaders.AUTHORIZATION, "Bearer " + token.getTokenValue()) - .retrieve() - .bodyToMono(OrganisasjonDTO[].class) - .block(); - - Assertions.assertThat(organisasjoner).isNotEmpty(); - - mockBackEnd.enqueue( - new MockResponse().setResponseCode(200) - .setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .setBody(objectMapper.writeValueAsString(new OrganisasjonDTO("test", "123", "test", LocalDateTime.now())))); - - // Hent en organisasjon - var organisasjon = webClient.get() - .uri(builder -> builder.path("/api/v1/person/organisasjoner/{organisasjonsnummer}").build(organisasjoner[0].organisasjonsnummer())) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + token.getTokenValue()) - .retrieve() - .bodyToMono(OrganisasjonDTO.class) - .block(); - - Assertions.assertThat(organisasjon).isNotNull(); - } - - -} diff --git a/apps/person-organisasjon-tilgang-service/src/test/resources/application-test.yml b/apps/person-organisasjon-tilgang-service/src/test/resources/application-test.yml deleted file mode 100644 index 7e52003da3c..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/test/resources/application-test.yml +++ /dev/null @@ -1,13 +0,0 @@ -TOKEN_X_ISSUER: dummy -ALTINN_URL: dummy -ALTINN_API_KEY: dummy -MASKINPORTEN_CLIENT_ID: dummy -MASKINPORTEN_CLIENT_JWK: dummy -MASKINPORTEN_SCOPES: dummy -MASKINPORTEN_WELL_KNOWN_URL: dummy - -spring: - cloud: - gcp: - secretmanager: - enabled: false \ No newline at end of file diff --git a/apps/person-organisasjon-tilgang-service/src/test/resources/logback-spring.xml b/apps/person-organisasjon-tilgang-service/src/test/resources/logback-spring.xml deleted file mode 100644 index 328f2de802b..00000000000 --- a/apps/person-organisasjon-tilgang-service/src/test/resources/logback-spring.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - %d{HH:mm:ss.SSS} | %5p | %logger{25} | %m%n - - utf8 - - - - - - - - - - - \ No newline at end of file diff --git a/apps/profil-api/config.test.yml b/apps/profil-api/config.test.yml index 82b365c1e24..60428643fbe 100644 --- a/apps/profil-api/config.test.yml +++ b/apps/profil-api/config.test.yml @@ -7,10 +7,10 @@ metadata: team: dolly spec: env: - - name: PERSON_ORG_TILGANG_NAME - value: testnav-person-organisasjon-tilgang-service-dev - - name: PERSON_ORG_TILGANG_URL - value: http://testnav-person-organisasjon-tilgang-service-dev.dolly.svc.cluster.local + - name: ALTINN3_TILGANG_NAME + value: testnav-altinn3-tilgang-service + - name: ALTINN3_TILGANG_URL + value: https://testnav-altinn3-tilgang-service.intern.dev.nav.no image: "{{image}}" tokenx: enabled: true @@ -35,7 +35,7 @@ spec: - application: testnorge-tilbakemelding-api outbound: rules: - - application: testnav-person-organisasjon-tilgang-service-dev + - application: testnav-altinn3-tilgang-service liveness: path: /internal/isAlive initialDelay: 4 diff --git a/apps/profil-api/config.yml b/apps/profil-api/config.yml index 0fafd9f254f..e22cb6b0657 100644 --- a/apps/profil-api/config.yml +++ b/apps/profil-api/config.yml @@ -7,10 +7,10 @@ metadata: team: dolly spec: env: - - name: PERSON_ORG_TILGANG_NAME - value: testnav-person-organisasjon-tilgang-service - - name: PERSON_ORG_TILGANG_URL - value: http://testnav-person-organisasjon-tilgang-service.dolly.svc.cluster.local + - name: ALTINN3_TILGANG_NAME + value: testnav-altinn3-tilgang-proxy + - name: ALTINN3_TILGANG_URL + value: https://testnav-altinn3-tilgang-proxy.intern.dev.nav.no image: "{{image}}" tokenx: enabled: true @@ -35,7 +35,7 @@ spec: - application: testnorge-tilbakemelding-api outbound: rules: - - application: testnav-person-organisasjon-tilgang-service + - application: testnav-altinn3-tilgang-proxy liveness: path: /internal/isAlive initialDelay: 4 diff --git a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/ProfilApiApplicationStarter.java b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/ProfilApiApplicationStarter.java index ece981fb1f8..a701184e6d8 100644 --- a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/ProfilApiApplicationStarter.java +++ b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/ProfilApiApplicationStarter.java @@ -1,12 +1,11 @@ package no.nav.registre.testnorge.profil; +import no.nav.testnav.libs.servletcore.config.ApplicationCoreConfig; +import no.nav.testnav.libs.servletsecurity.config.SecureOAuth2ServerToServerConfiguration; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Import; -import no.nav.testnav.libs.servletcore.config.ApplicationCoreConfig; -import no.nav.testnav.libs.servletsecurity.config.SecureOAuth2ServerToServerConfiguration; - @SpringBootApplication @Import({ ApplicationCoreConfig.class, diff --git a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/config/Consumers.java b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/config/Consumers.java index 121e1e769d9..2b6d64efe27 100644 --- a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/config/Consumers.java +++ b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/config/Consumers.java @@ -24,6 +24,6 @@ @Setter(PACKAGE) public class Consumers { - private ServerProperties testnavPersonOrganisasjonTilgangService; + private ServerProperties testnavAltinn3TilgangService; } diff --git a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/config/SecurityConfiguration.java b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/config/SecurityConfiguration.java index 7d810ae9a20..fd9469f6714 100644 --- a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/config/SecurityConfiguration.java +++ b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/config/SecurityConfiguration.java @@ -2,7 +2,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; @@ -12,7 +11,6 @@ @EnableWebSecurity @Configuration -@Profile({ "dev", "prod" }) public class SecurityConfiguration { @Bean diff --git a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/AzureAdProfileConsumer.java b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/AzureAdProfileConsumer.java index 7f5a0341fc3..d899735893c 100644 --- a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/AzureAdProfileConsumer.java +++ b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/AzureAdProfileConsumer.java @@ -7,7 +7,7 @@ import no.nav.registre.testnorge.profil.service.AzureAdTokenService; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.client.reactive.ReactorClientHttpConnector; -import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.ExchangeStrategies; import org.springframework.web.reactive.function.client.WebClient; import reactor.netty.http.client.HttpClient; @@ -17,8 +17,9 @@ import java.util.Optional; @Slf4j -@Component +@Service public class AzureAdProfileConsumer { + private final WebClient webClient; private final AzureAdTokenService azureAdTokenService; @@ -67,7 +68,7 @@ public Optional getProfilImage() { .flatMap(accessToken -> new GetProfileImageCommand(webClient, accessToken.getTokenValue()).call()) .block()); } catch (IllegalStateException e) { - log.warn("Finner ikke profil bilde", e); + log.warn("Finner ikke profilbilde", e); return Optional.empty(); } } diff --git a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/PersonOrganisasjonTilgangConsumer.java b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/PersonOrganisasjonTilgangConsumer.java index 3e1df266723..4e1ee9177f2 100644 --- a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/PersonOrganisasjonTilgangConsumer.java +++ b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/PersonOrganisasjonTilgangConsumer.java @@ -1,19 +1,15 @@ package no.nav.registre.testnorge.profil.consumer; -import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import no.nav.registre.testnorge.profil.config.Consumers; import no.nav.registre.testnorge.profil.consumer.command.GetPersonOrganisasjonTilgangCommand; -import no.nav.registre.testnorge.profil.consumer.dto.OrganisasjonDTO; +import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO; import no.nav.testnav.libs.securitycore.domain.ServerProperties; +import no.nav.testnav.libs.securitycore.domain.UserInfo; +import no.nav.testnav.libs.servletsecurity.action.GetUserInfo; import no.nav.testnav.libs.servletsecurity.exchange.TokenExchange; -import org.springframework.http.MediaType; -import org.springframework.http.codec.json.Jackson2JsonDecoder; -import org.springframework.http.codec.json.Jackson2JsonEncoder; import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.client.ExchangeStrategies; import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.reactive.function.client.WebClientResponseException; import reactor.core.publisher.Mono; @@ -23,41 +19,32 @@ public class PersonOrganisasjonTilgangConsumer { private final WebClient webClient; private final ServerProperties serverProperties; private final TokenExchange tokenExchange; + private final GetUserInfo getUserInfo; public PersonOrganisasjonTilgangConsumer( Consumers consumers, TokenExchange tokenExchange, - ObjectMapper objectMapper, - WebClient.Builder webClientBuilder - ) { - serverProperties = consumers.getTestnavPersonOrganisasjonTilgangService(); + WebClient.Builder webClientBuilder, + GetUserInfo getUserInfo) { + + serverProperties = consumers.getTestnavAltinn3TilgangService(); this.tokenExchange = tokenExchange; - ExchangeStrategies jacksonStrategy = ExchangeStrategies - .builder() - .codecs( - config -> { - config - .defaultCodecs() - .jackson2JsonEncoder(new Jackson2JsonEncoder(objectMapper, MediaType.APPLICATION_JSON)); - config - .defaultCodecs() - .jackson2JsonDecoder(new Jackson2JsonDecoder(objectMapper, MediaType.APPLICATION_JSON)); - }) - .build(); this.webClient = webClientBuilder - .exchangeStrategies(jacksonStrategy) .baseUrl(serverProperties.getUrl()) .build(); + this.getUserInfo = getUserInfo; } public Mono getOrganisasjon(String organisasjonsnummer) { - return tokenExchange.exchange(serverProperties) - .flatMap(accessToken -> new GetPersonOrganisasjonTilgangCommand(webClient, accessToken.getTokenValue(), organisasjonsnummer).call()) - .onErrorResume( - WebClientResponseException.class::isInstance, - throwable -> { - log.warn("Person har ikke tilgang til organisasjon {}.", organisasjonsnummer); - return Mono.empty(); - }); + + var userId = getUserInfo.call() + .map(UserInfo::id) + .orElse(null); + + return Mono.from(tokenExchange.exchange(serverProperties) + .flatMapMany(accessToken -> + new GetPersonOrganisasjonTilgangCommand(webClient, userId, accessToken.getTokenValue()).call())) + .doOnNext(organisasjon -> log.info("Mottatt organisasjon: {}", organisasjon)) + .filter(organisasjon -> organisasjon.getOrganisasjonsnummer().equals(organisasjonsnummer)); } } diff --git a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/command/GetPersonOrganisasjonTilgangCommand.java b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/command/GetPersonOrganisasjonTilgangCommand.java index b07657f13df..7a0502ebdc1 100644 --- a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/command/GetPersonOrganisasjonTilgangCommand.java +++ b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/command/GetPersonOrganisasjonTilgangCommand.java @@ -1,30 +1,35 @@ package no.nav.registre.testnorge.profil.consumer.command; import lombok.RequiredArgsConstructor; -import no.nav.registre.testnorge.profil.consumer.dto.OrganisasjonDTO; -import no.nav.registre.testnorge.profil.util.WebClientFilter; +import no.nav.registre.testnorge.profil.consumer.dto.AltinnRequestDTO; +import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; +import reactor.core.publisher.Flux; import reactor.util.retry.Retry; import java.time.Duration; import java.util.concurrent.Callable; @RequiredArgsConstructor -public class GetPersonOrganisasjonTilgangCommand implements Callable> { +public class GetPersonOrganisasjonTilgangCommand implements Callable> { private final WebClient webClient; + private final String ident; private final String token; - private final String organisasjonsnummer; @Override - public Mono call() { + public Flux call() { + return webClient - .get() - .uri(builder -> builder.path("/api/v1/person/organisasjoner/{organisasjonsnummer}").build(organisasjonsnummer)) + .post() + .uri(builder -> builder.path("/api/v1/brukertilgang") + .build()) .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) + .bodyValue(new AltinnRequestDTO(ident)) .retrieve() - .bodyToMono(OrganisasjonDTO.class) + .bodyToFlux(OrganisasjonDTO.class) + .doOnError(WebClientFilter::logErrorMessage) .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) .filter(WebClientFilter::is5xxException)); } diff --git a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/command/GetProfileCommand.java b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/command/GetProfileCommand.java index f7ef681314c..7d1ae69b933 100644 --- a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/command/GetProfileCommand.java +++ b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/command/GetProfileCommand.java @@ -3,7 +3,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.registre.testnorge.profil.consumer.dto.ProfileDTO; -import no.nav.registre.testnorge.profil.util.WebClientFilter; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; @@ -27,6 +27,7 @@ public Mono call() { .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) .retrieve() .bodyToMono(ProfileDTO.class) + .doOnError(WebClientFilter::logErrorMessage) .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) .filter(WebClientFilter::is5xxException)); } diff --git a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/command/GetProfileImageCommand.java b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/command/GetProfileImageCommand.java index d4970c7d758..d8a7d5deb89 100644 --- a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/command/GetProfileImageCommand.java +++ b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/command/GetProfileImageCommand.java @@ -2,7 +2,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import no.nav.registre.testnorge.profil.util.WebClientFilter; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatusCode; import org.springframework.web.reactive.function.client.WebClient; @@ -33,6 +33,7 @@ public Mono call() { .map(IllegalStateException::new) ) .bodyToMono(byte[].class) + .doOnError(WebClientFilter::logErrorMessage) .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) .filter(WebClientFilter::is5xxException)); } diff --git a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/dto/AltinnRequestDTO.java b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/dto/AltinnRequestDTO.java new file mode 100644 index 00000000000..e2b884a63dc --- /dev/null +++ b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/dto/AltinnRequestDTO.java @@ -0,0 +1,13 @@ +package no.nav.registre.testnorge.profil.consumer.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class AltinnRequestDTO { + + private String ident; +} diff --git a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/dto/OrganisasjonDTO.java b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/dto/OrganisasjonDTO.java deleted file mode 100644 index 2c53b8ece95..00000000000 --- a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/consumer/dto/OrganisasjonDTO.java +++ /dev/null @@ -1,14 +0,0 @@ -package no.nav.registre.testnorge.profil.consumer.dto; - -import com.fasterxml.jackson.annotation.JsonInclude; - -import java.time.LocalDateTime; - -@JsonInclude(JsonInclude.Include.NON_NULL) -public record OrganisasjonDTO( - String navn, - String organisasjonsnummer, - String organisasjonsfrom, - LocalDateTime gyldigTil -) { -} diff --git a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/provider/ProfilController.java b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/provider/ProfilController.java index 8bcfaaac7b8..e08430b3218 100644 --- a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/provider/ProfilController.java +++ b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/provider/ProfilController.java @@ -33,7 +33,7 @@ public ResponseEntity getProfile() { } @GetMapping(value = "/bilde", produces = MediaType.IMAGE_JPEG_VALUE) - public ResponseEntity getImage() { + public ResponseEntity getImage() { return profilService .getImage() .map(value -> ResponseEntity.ok().cacheControl(cacheControl).body(value)) diff --git a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/service/AzureAdTokenService.java b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/service/AzureAdTokenService.java index f262be55d05..0efac636604 100644 --- a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/service/AzureAdTokenService.java +++ b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/service/AzureAdTokenService.java @@ -1,7 +1,10 @@ package no.nav.registre.testnorge.profil.service; import lombok.extern.slf4j.Slf4j; +import no.nav.testnav.libs.securitycore.command.azuread.OnBehalfOfExchangeCommand; +import no.nav.testnav.libs.securitycore.domain.AccessToken; import no.nav.testnav.libs.securitycore.domain.azuread.AzureClientCredential; +import no.nav.testnav.libs.servletsecurity.action.GetAuthenticatedToken; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; @@ -14,10 +17,6 @@ import java.net.URI; -import no.nav.testnav.libs.securitycore.command.azuread.OnBehalfOfExchangeCommand; -import no.nav.testnav.libs.securitycore.domain.AccessToken; -import no.nav.testnav.libs.servletsecurity.action.GetAuthenticatedToken; - @Slf4j @Service public class AzureAdTokenService { diff --git a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/service/ProfilService.java b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/service/ProfilService.java index e522e02a5aa..d139f556c3f 100644 --- a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/service/ProfilService.java +++ b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/service/ProfilService.java @@ -25,15 +25,16 @@ public class ProfilService { public Profil getProfile() { if (isTokenX()) { - return getUserInfo.call().map(userInfo -> + return getUserInfo.call() + .map(userInfo -> organisasjonTilgangConsumer .getOrganisasjon(userInfo.organisasjonsnummer()) .map(dto -> new Profil( userInfo.brukernavn(), UKJENT, UKJENT, - dto.navn(), - dto.organisasjonsnummer(), + dto.getNavn(), + dto.getOrganisasjonsnummer(), BANK_ID) ).block() ).orElse(new Profil( diff --git a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/util/WebClientFilter.java b/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/util/WebClientFilter.java deleted file mode 100644 index 97dd7df99ea..00000000000 --- a/apps/profil-api/src/main/java/no/nav/registre/testnorge/profil/util/WebClientFilter.java +++ /dev/null @@ -1,14 +0,0 @@ -package no.nav.registre.testnorge.profil.util; - -import lombok.experimental.UtilityClass; -import org.springframework.web.reactive.function.client.WebClientResponseException; - -@UtilityClass -public class WebClientFilter { - - public static boolean is5xxException(Throwable throwable) { - - return throwable instanceof WebClientResponseException wce && - wce.getStatusCode().is5xxServerError(); - } -} diff --git a/apps/profil-api/src/main/resources/application-local.yml b/apps/profil-api/src/main/resources/application-local.yml index ab2961d30c7..e2e00d9b43f 100644 --- a/apps/profil-api/src/main/resources/application-local.yml +++ b/apps/profil-api/src/main/resources/application-local.yml @@ -1,10 +1,15 @@ AZURE_APP_CLIENT_ID: ${sm://azure-app-client-id} AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} +TOKEN_X_ISSUER: https://tokenx.dev-gcp.nav.cloud.nais.io +TOKEN_X_JWKS_URI: https://tokenx.dev-gcp.nav.cloud.nais.io +TOKEN_X_CLIENT_ID: dev-gcp:dolly:testnorge-profil-api-dev + spring: config: import: "sm://" consumers: - testnav-person-organisasjon-tilgang-service: - url: https://testnav-person-organisasjon-tilgang-service-dev.dev.intern.nav.no + testnav-altinn3-tilgang-service: + name: testnav-altinn3-tilgang-service + url: https://testnav-altinn3-tilgang-service.intern.dev.nav.no diff --git a/apps/profil-api/src/main/resources/application.yml b/apps/profil-api/src/main/resources/application.yml index 6d87e3d1b3f..7e343630c04 100644 --- a/apps/profil-api/src/main/resources/application.yml +++ b/apps/profil-api/src/main/resources/application.yml @@ -30,11 +30,11 @@ access.scopes: api.azuread.url: https://graph.microsoft.com consumers: - testnav-person-organisasjon-tilgang-service: + testnav-altinn3-tilgang-service: cluster: dev-gcp namespace: dolly - name: ${PERSON_ORG_TILGANG_NAME} - url: ${PERSON_ORG_TILGANG_URL} + name: ${ALTINN3_TILGANG_NAME} + url: ${ALTINN3_TILGANG_URL} management: endpoints: diff --git a/apps/profil-api/src/test/resources/application-test.yml b/apps/profil-api/src/test/resources/application-test.yml index bf7cc5cb0e7..aa8bfa92394 100644 --- a/apps/profil-api/src/test/resources/application-test.yml +++ b/apps/profil-api/src/test/resources/application-test.yml @@ -4,11 +4,4 @@ spring: cloud: gcp: secretmanager: - enabled: false - -consumers: - testnav-person-organisasjon-tilgang-service: - cluster: cluster - namespace: namespace - name: name - url: http://valid.but.not.used + enabled: false \ No newline at end of file diff --git a/proxies/altinn3-tilgang-proxy/config.yml b/proxies/altinn3-tilgang-proxy/config.yml index 286fa0d5ab3..700fe0a5b05 100644 --- a/proxies/altinn3-tilgang-proxy/config.yml +++ b/proxies/altinn3-tilgang-proxy/config.yml @@ -26,6 +26,7 @@ spec: - application: dolly-frontend - application: dolly-idporten - application: testnav-bruker-service + - application: testnorge-profil-api outbound: external: - host: testnav-altinn3-tilgang-service.nav.no From 396d722af038f6f3cc25f25beeadf2f537157494 Mon Sep 17 00:00:00 2001 From: "Kristen.Herum" Date: Tue, 7 Jan 2025 09:20:09 +0100 Subject: [PATCH 58/59] Rydding av Altinn2-tilgang --- .nais/maskinporten.yml | 12 ------------ docker-compose.yml | 8 ++++---- 2 files changed, 4 insertions(+), 16 deletions(-) delete mode 100644 .nais/maskinporten.yml diff --git a/.nais/maskinporten.yml b/.nais/maskinporten.yml deleted file mode 100644 index ae6508f5809..00000000000 --- a/.nais/maskinporten.yml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: nais.io/v1 -kind: MaskinportenClient -metadata: - name: dolly - namespace: dolly - labels: - team: dolly -spec: - scopes: - consumes: - - name: altinn:serviceowner - secretName: maskinporten-dolly-prod # deployes til prod. secret kopieres manuelt til dev. diff --git a/docker-compose.yml b/docker-compose.yml index f917991a0db..a465f8ae262 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,13 +1,13 @@ services: - testnav-person-organisasjon-tilgang-service: - container_name: testnav-person-organisasjon-tilgang-service + testnav-altinn3-tilgang-service: + container_name: testnav-altinn3-tilgang-service environment: - SPRING_PROFILES_ACTIVE=virtual - JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 - TOKEN_X_PRIVATE_JWK=${JWK} - MASKINPORTEN_CLIENT_JWK=${JWK} build: - context: ./apps/person-organisasjon-tilgang-service + context: ./apps/person-altinn3-tilgang-service depends_on: - tokendings - maskinporten @@ -54,7 +54,7 @@ services: context: ./apps/bruker-service depends_on: - testnav-bruker-service-db - - testnav-person-organisasjon-tilgang-service + - testnav-altinn3-tilgang-service - tokendings ports: - "8002:8080" From 922de4c164155b9fd9e3c72543571df2b7b47c64 Mon Sep 17 00:00:00 2001 From: "Kristen.Herum" Date: Tue, 7 Jan 2025 09:22:19 +0100 Subject: [PATCH 59/59] Rydding av Altinn2-tilgang II --- .github/workflows/maskinporten.yml | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 .github/workflows/maskinporten.yml diff --git a/.github/workflows/maskinporten.yml b/.github/workflows/maskinporten.yml deleted file mode 100644 index 9d1b7007cc8..00000000000 --- a/.github/workflows/maskinporten.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: Deploy maskinporten - -on: - push: - branches: - - master - paths: - - '.nais/maskinporten.yml' - -jobs: - deploy-maskinporten: - name: Deploy maskinporten - runs-on: ubuntu-latest - permissions: - contents: read - id-token: write - steps: - - uses: actions/checkout@v4 - - uses: nais/deploy/actions/deploy@v2 - env: - CLUSTER: prod-gcp - RESOURCE: ".nais/maskinporten.yml"