From c031abf8372937b034c528d0d9e97dec6243ad48 Mon Sep 17 00:00:00 2001 From: stigus Date: Wed, 9 Aug 2023 11:40:52 +0200 Subject: [PATCH 01/22] Status dolly #deploy-test-dolly-backend --- .../nav/dolly/bestilling/ConsumerStatus.java | 3 +- .../dolly/provider/api/StatusController.java | 36 +++++++++---------- .../no/nav/dolly/util/CheckAliveUtil.java | 1 + .../js/src/pages/StatusPage/StatusPage.tsx | 2 +- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/ConsumerStatus.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/ConsumerStatus.java index 19819acb232..ce541d930a2 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/ConsumerStatus.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/ConsumerStatus.java @@ -9,12 +9,13 @@ public interface ConsumerStatus { String serviceUrl(); + String consumerName(); default Map checkStatus(WebClient webClient) { final String TEAM_DOLLY = "Team Dolly"; - var consumerStatus = CheckAliveUtil.checkConsumerStatus( + var consumerStatus = CheckAliveUtil.checkConsumerStatus( serviceUrl() + "/internal/isAlive", serviceUrl() + "/internal/isReady", webClient); diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/provider/api/StatusController.java b/apps/dolly-backend/src/main/java/no/nav/dolly/provider/api/StatusController.java index e04b692e757..1631e536c66 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/provider/api/StatusController.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/provider/api/StatusController.java @@ -17,14 +17,11 @@ @RestController @RequiredArgsConstructor -@RequestMapping(value = "/v1/status", produces = MediaType.APPLICATION_JSON_VALUE) +@RequestMapping(value = "/api/v1/status", produces = MediaType.APPLICATION_JSON_VALUE) @CrossOrigin public class StatusController { - private final List consumerRegister; - - private final WebClient webClient; - private static final Map consumerNavnMapping = new HashMap<>(); + private static final List excludeConsumers = List.of("PdlPersonConsumer"); static { consumerNavnMapping.put("DokarkivConsumer", "Dokumentarkiv (JOARK)"); @@ -48,20 +45,8 @@ public class StatusController { consumerNavnMapping.put("ArenaForvalterConsumer", "Arena fagsystem"); } - private static final List excludeConsumers = List.of("PdlPersonConsumer"); - - private static String getConsumerNavn(String classNavn) { - var consumerNavn = classNavn.split("\\$\\$")[0]; - if (consumerNavnMapping.containsKey(consumerNavn)) { - return consumerNavnMapping.get(consumerNavn); - } - return consumerNavn.replace("Consumer", ""); - } - - public static boolean isNotExcluded(ConsumerStatus consumer) { - var consumerNavn = consumer.getClass().getSimpleName().split("\\$\\$")[0]; - return !excludeConsumers.contains(consumerNavn); - } + private final List consumerRegister; + private final WebClient webClient; @GetMapping() @Operation(description = "Hent status for Dolly forbrukere") @@ -73,4 +58,17 @@ public Object clientsStatus() { .collect(Collectors.toMap(key -> key.get(0), value -> value.get(1))); } + public static boolean isNotExcluded(ConsumerStatus consumer) { + var consumerNavn = consumer.getClass().getSimpleName().split("\\$\\$")[0]; + return !excludeConsumers.contains(consumerNavn); + } + + private static String getConsumerNavn(String classNavn) { + var consumerNavn = classNavn.split("\\$\\$")[0]; + if (consumerNavnMapping.containsKey(consumerNavn)) { + return consumerNavnMapping.get(consumerNavn); + } + return consumerNavn.replace("Consumer", ""); + } + } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/util/CheckAliveUtil.java b/apps/dolly-backend/src/main/java/no/nav/dolly/util/CheckAliveUtil.java index 7a5d288e86d..0fe6d4ea3be 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/util/CheckAliveUtil.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/util/CheckAliveUtil.java @@ -37,6 +37,7 @@ private String checkIsAlive(WebClient webClient, String url) { log.error(feilmelding, ex); return feilmelding; } catch (Exception e) { + log.error("Feilet under sjekk av status for {}", url, e); return e.getMessage(); } return null; diff --git a/apps/dollystatus/src/main/js/src/pages/StatusPage/StatusPage.tsx b/apps/dollystatus/src/main/js/src/pages/StatusPage/StatusPage.tsx index 880170f1491..925c20208b8 100644 --- a/apps/dollystatus/src/main/js/src/pages/StatusPage/StatusPage.tsx +++ b/apps/dollystatus/src/main/js/src/pages/StatusPage/StatusPage.tsx @@ -13,7 +13,7 @@ export default () => { const [dataLoading, setDataLoading] = useBoolean(true) useEffect(() => { - const endpoint = 'https://dolly-backend.dev.intern.nav.no/v1/status' + const endpoint = 'https://dolly-backend.dev.intern.nav.no/api/v1/status' fetch(endpoint) .then((response) => response.json()) From 68619412cd73ddc531500d18822cba804c5110ca Mon Sep 17 00:00:00 2001 From: stigus Date: Wed, 9 Aug 2023 13:37:09 +0200 Subject: [PATCH 02/22] =?UTF-8?q?Fikset=20statuser=20som=20ga=20feil=20og?= =?UTF-8?q?=20endret=20en=20del=20p=C3=A5=20oppsett=20for=20status=20#depl?= =?UTF-8?q?oy-test-dolly-backend=20#deploy-inst-proxy=20#deploy-pensjon-te?= =?UTF-8?q?stdata-facade-proxy=20#deploy-udistub-proxy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dolly/bestilling/histark/HistarkConsumer.java | 13 +------------ .../controller/StatusController.java | 4 ++-- .../proxies/histarkproxy/StatusController.java | 2 +- .../testnav/proxies/instproxy/StatusController.java | 4 ++-- .../StatusController.java | 4 ++-- .../proxies/udistubproxy/StatusController.java | 4 ++-- 6 files changed, 10 insertions(+), 21 deletions(-) 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 69bf9553275..56da4699e5b 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 @@ -2,7 +2,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; -import no.nav.dolly.bestilling.ConsumerStatus; import no.nav.dolly.bestilling.histark.command.HistarkPostCommand; import no.nav.dolly.bestilling.histark.domain.HistarkRequest; import no.nav.dolly.bestilling.histark.domain.HistarkResponse; @@ -22,7 +21,7 @@ @Slf4j @Service -public class HistarkConsumer implements ConsumerStatus { +public class HistarkConsumer { private final WebClient webClient; private final TokenExchange tokenService; @@ -52,16 +51,6 @@ public Flux postHistark(HistarkRequest histarkRequest) { token.getTokenValue()).call()); } - @Override - public String serviceUrl() { - return serviceProperties.getUrl(); - } - - @Override - public String consumerName() { - return "testnav-histark-proxy"; - } - private static String getNavCallId() { return format("%s %s", CONSUMER, UUID.randomUUID()); } diff --git a/apps/inntektsmelding-service/src/main/java/no/nav/registre/testnav/inntektsmeldingservice/controller/StatusController.java b/apps/inntektsmelding-service/src/main/java/no/nav/registre/testnav/inntektsmeldingservice/controller/StatusController.java index 81a32821748..7626dbbff48 100644 --- a/apps/inntektsmelding-service/src/main/java/no/nav/registre/testnav/inntektsmeldingservice/controller/StatusController.java +++ b/apps/inntektsmelding-service/src/main/java/no/nav/registre/testnav/inntektsmeldingservice/controller/StatusController.java @@ -18,8 +18,8 @@ public Map> getStatus() { var statusWebClient = WebClient.builder().build(); var status = checkConsumerStatus( - "https://testnav-inntektsmelding-generator-service.dev.intern.nav.no/internal/isAlive", - "https://testnav-inntektsmelding-generator-service.dev.intern.nav.no/internal/isReady", + "https://testnav-inntektsmelding-generator-service.intern.dev.nav.no/internal/isAlive", + "https://testnav-inntektsmelding-generator-service.intern.dev.nav.no/internal/isReady", statusWebClient); status.put("team", TEAM); diff --git a/proxies/histark-proxy/src/main/java/no/nav/testnav/proxies/histarkproxy/StatusController.java b/proxies/histark-proxy/src/main/java/no/nav/testnav/proxies/histarkproxy/StatusController.java index 3ac07ea45a5..e69a6fab020 100644 --- a/proxies/histark-proxy/src/main/java/no/nav/testnav/proxies/histarkproxy/StatusController.java +++ b/proxies/histark-proxy/src/main/java/no/nav/testnav/proxies/histarkproxy/StatusController.java @@ -20,7 +20,7 @@ public Map> getStatus() { var statusWebClient = WebClient.builder().build(); var histarkStatus = checkConsumerStatus( - "https://histarkimport.dev.intern.nav.no/internal/isAlive", + "https://histarkimport.dev.intern.nav.no/internal/health/liveness", "https://histarkimport.dev.intern.nav.no/internal/isReady", statusWebClient); histarkStatus.put("team", TEAM); diff --git a/proxies/inst-proxy/src/main/java/no/nav/testnav/proxies/instproxy/StatusController.java b/proxies/inst-proxy/src/main/java/no/nav/testnav/proxies/instproxy/StatusController.java index 96987dc974e..9a2b0099c3a 100644 --- a/proxies/inst-proxy/src/main/java/no/nav/testnav/proxies/instproxy/StatusController.java +++ b/proxies/inst-proxy/src/main/java/no/nav/testnav/proxies/instproxy/StatusController.java @@ -18,8 +18,8 @@ public Map> getStatus() { var statusWebClient = WebClient.builder().build(); var serviceStatus = checkConsumerStatus( - "https://opphold-testdata.dev.adeo.no/internal/health/liveness", - "https://opphold-testdata.dev.adeo.no/internal/health/readiness", + "https://institusjon-opphold-testdata.dev.intern.nav.no/internal/health/liveness", + "https://institusjon-opphold-testdata.dev.intern.nav.no/internal/health/readiness", statusWebClient); serviceStatus.put("team", TEAM_ROCKET); diff --git a/proxies/pensjon-testdata-facade-proxy/src/main/java/no/nav/testnav/proxies/pensjontestdatafacadeproxy/StatusController.java b/proxies/pensjon-testdata-facade-proxy/src/main/java/no/nav/testnav/proxies/pensjontestdatafacadeproxy/StatusController.java index 99e21504c81..9196eeaee3c 100644 --- a/proxies/pensjon-testdata-facade-proxy/src/main/java/no/nav/testnav/proxies/pensjontestdatafacadeproxy/StatusController.java +++ b/proxies/pensjon-testdata-facade-proxy/src/main/java/no/nav/testnav/proxies/pensjontestdatafacadeproxy/StatusController.java @@ -18,8 +18,8 @@ public Map> getStatus() { var statusWebClient = WebClient.builder().build(); var pensjonStatus = checkConsumerStatus( - "https://pensjon-testdata-facade.pensjontestdata.svc.nais.local/isAlive", - "https://pensjon-testdata-facade.pensjontestdata.svc.nais.local/isReady", + "https://pensjon-testdata-facade.dev.adeo.no/isAlive", + "https://pensjon-testdata-facade.dev.adeo.no/isReady", statusWebClient); pensjonStatus.put("team", TEAM_PENSJON_TESTDATA); diff --git a/proxies/udistub-proxy/src/main/java/no/nav/testnav/proxies/udistubproxy/StatusController.java b/proxies/udistub-proxy/src/main/java/no/nav/testnav/proxies/udistubproxy/StatusController.java index 5d4c7d72034..9d81e42229b 100644 --- a/proxies/udistub-proxy/src/main/java/no/nav/testnav/proxies/udistubproxy/StatusController.java +++ b/proxies/udistub-proxy/src/main/java/no/nav/testnav/proxies/udistubproxy/StatusController.java @@ -18,8 +18,8 @@ public Map> getStatus() { var statusWebClient = WebClient.builder().build(); var status = checkConsumerStatus( - "http://udi-stub.dolly.svc.nais.local/internal/isAlive", - "http://udi-stub.dolly.svc.nais.local/internal/isReady", + "http://udi-stub.dev.intern.nav.no/internal/isAlive", + "http://udi-stub.dev.intern.nav.no/internal/isReady", statusWebClient); status.put("team", TEAM); From 4f0045bdeac71a0ba0ef688ab50124a1e6a80498 Mon Sep 17 00:00:00 2001 From: stigus Date: Wed, 9 Aug 2023 14:34:56 +0200 Subject: [PATCH 03/22] =?UTF-8?q?Fikset=20statuser=20som=20ga=20feil=20og?= =?UTF-8?q?=20endret=20en=20del=20p=C3=A5=20oppsett=20for=20status=20#depl?= =?UTF-8?q?oy-test-dolly-backend=20#deploy-inst-proxy=20#deploy-pensjon-te?= =?UTF-8?q?stdata-facade-proxy=20#deploy-udistub-proxy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InntektsmeldingConsumer.java | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/inntektsmelding/InntektsmeldingConsumer.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/inntektsmelding/InntektsmeldingConsumer.java index d850212d59e..53d97295529 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/inntektsmelding/InntektsmeldingConsumer.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/inntektsmelding/InntektsmeldingConsumer.java @@ -1,7 +1,6 @@ package no.nav.dolly.bestilling.inntektsmelding; import lombok.extern.slf4j.Slf4j; -import no.nav.dolly.bestilling.ConsumerStatus; import no.nav.dolly.bestilling.inntektsmelding.command.OpprettInntektsmeldingCommand; import no.nav.dolly.bestilling.inntektsmelding.domain.InntektsmeldingRequest; import no.nav.dolly.bestilling.inntektsmelding.domain.InntektsmeldingResponse; @@ -20,7 +19,7 @@ @Slf4j @Service -public class InntektsmeldingConsumer implements ConsumerStatus { +public class InntektsmeldingConsumer { private final TokenExchange tokenService; private final WebClient webClient; @@ -38,11 +37,7 @@ public InntektsmeldingConsumer( .build(); } - private static String getNavCallId() { - return format("%s %s", CONSUMER, UUID.randomUUID()); - } - - @Timed(name = "providers", tags = {"operation", "inntektsmelding_opprett"}) + @Timed(name = "providers", tags = { "operation", "inntektsmelding_opprett" }) public Flux postInntektsmelding(InntektsmeldingRequest inntekstsmelding) { var callId = getNavCallId(); @@ -53,14 +48,7 @@ public Flux postInntektsmelding(InntektsmeldingRequest token.getTokenValue(), inntekstsmelding, callId).call()); } - @Override - public String serviceUrl() { - return serviceProperties.getUrl(); - } - - @Override - public String consumerName() { - return "testnav-inntektsmelding-service"; + private static String getNavCallId() { + return format("%s %s", CONSUMER, UUID.randomUUID()); } - } \ No newline at end of file From 67da029f7435ccbecb7c0ae8c3409b6ce0072a07 Mon Sep 17 00:00:00 2001 From: stigus Date: Wed, 9 Aug 2023 15:08:02 +0200 Subject: [PATCH 04/22] =?UTF-8?q?Fikset=20statuser=20som=20ga=20feil=20og?= =?UTF-8?q?=20endret=20en=20del=20p=C3=A5=20oppsett=20for=20status=20#depl?= =?UTF-8?q?oy-test-dolly-backend=20#deploy-inst-proxy=20#deploy-pensjon-te?= =?UTF-8?q?stdata-facade-proxy=20#deploy-udistub-proxy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inntektsmelding/InntektsmeldingConsumer.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/inntektsmelding/InntektsmeldingConsumer.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/inntektsmelding/InntektsmeldingConsumer.java index 53d97295529..323b6b8c0a2 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/inntektsmelding/InntektsmeldingConsumer.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/inntektsmelding/InntektsmeldingConsumer.java @@ -1,6 +1,7 @@ package no.nav.dolly.bestilling.inntektsmelding; import lombok.extern.slf4j.Slf4j; +import no.nav.dolly.bestilling.ConsumerStatus; import no.nav.dolly.bestilling.inntektsmelding.command.OpprettInntektsmeldingCommand; import no.nav.dolly.bestilling.inntektsmelding.domain.InntektsmeldingRequest; import no.nav.dolly.bestilling.inntektsmelding.domain.InntektsmeldingResponse; @@ -19,7 +20,7 @@ @Slf4j @Service -public class InntektsmeldingConsumer { +public class InntektsmeldingConsumer implements ConsumerStatus { private final TokenExchange tokenService; private final WebClient webClient; @@ -48,7 +49,18 @@ public Flux postInntektsmelding(InntektsmeldingRequest token.getTokenValue(), inntekstsmelding, callId).call()); } + @Override + public String serviceUrl() { + return serviceProperties.getUrl(); + } + + @Override + public String consumerName() { + return "testnav-inntektsmelding-service"; + } + private static String getNavCallId() { return format("%s %s", CONSUMER, UUID.randomUUID()); } + } \ No newline at end of file From 7712ecd144ad0e6839f7571857c4730c19e0920c Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 10 Aug 2023 08:49:51 +0200 Subject: [PATCH 05/22] StatusController histark --- .../no/nav/testnav/proxies/histarkproxy/StatusController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proxies/histark-proxy/src/main/java/no/nav/testnav/proxies/histarkproxy/StatusController.java b/proxies/histark-proxy/src/main/java/no/nav/testnav/proxies/histarkproxy/StatusController.java index e69a6fab020..3ac07ea45a5 100644 --- a/proxies/histark-proxy/src/main/java/no/nav/testnav/proxies/histarkproxy/StatusController.java +++ b/proxies/histark-proxy/src/main/java/no/nav/testnav/proxies/histarkproxy/StatusController.java @@ -20,7 +20,7 @@ public Map> getStatus() { var statusWebClient = WebClient.builder().build(); var histarkStatus = checkConsumerStatus( - "https://histarkimport.dev.intern.nav.no/internal/health/liveness", + "https://histarkimport.dev.intern.nav.no/internal/isAlive", "https://histarkimport.dev.intern.nav.no/internal/isReady", statusWebClient); histarkStatus.put("team", TEAM); From c1e83366f52c32f7adfadc1ce821c48a848f1a06 Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 10 Aug 2023 17:41:19 +0200 Subject: [PATCH 06/22] =?UTF-8?q?Lagt=20til=20h=C3=A5ndtering=20av=20statu?= =?UTF-8?q?s=20for=20dolly=20applikasjoner?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/dolly-backend/config.yml | 2 ++ .../nav/dolly/domain/resultset/NavStatus.java | 19 +++++++++++++++++++ .../dolly/domain/resultset/SystemStatus.java | 11 +++++++++++ .../dolly/provider/api/StatusController.java | 18 ++++++++++++++++++ 4 files changed, 50 insertions(+) create mode 100644 apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/NavStatus.java create mode 100644 apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/SystemStatus.java diff --git a/apps/dolly-backend/config.yml b/apps/dolly-backend/config.yml index d686ea76d81..12209dcf04d 100644 --- a/apps/dolly-backend/config.yml +++ b/apps/dolly-backend/config.yml @@ -36,6 +36,8 @@ spec: namespace: aap - application: testnav-helsepersonell-service cluster: dev-gcp + - application: statuspoll + namespace: navdig outbound: rules: - application: generer-navn-service diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/NavStatus.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/NavStatus.java new file mode 100644 index 00000000000..c6f3806255c --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/NavStatus.java @@ -0,0 +1,19 @@ +package no.nav.dolly.domain.resultset; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class NavStatus { + + private SystemStatus status; + private String description; + private String logLink; +} diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/SystemStatus.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/SystemStatus.java new file mode 100644 index 00000000000..3477a292c1c --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/SystemStatus.java @@ -0,0 +1,11 @@ +package no.nav.dolly.domain.resultset; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public enum SystemStatus { + OK, ISSUE, DOWN +} + diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/provider/api/StatusController.java b/apps/dolly-backend/src/main/java/no/nav/dolly/provider/api/StatusController.java index 1631e536c66..2cb8d2f600b 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/provider/api/StatusController.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/provider/api/StatusController.java @@ -3,6 +3,8 @@ import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; import no.nav.dolly.bestilling.ConsumerStatus; +import no.nav.dolly.domain.resultset.NavStatus; +import no.nav.dolly.domain.resultset.SystemStatus; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; @@ -58,6 +60,22 @@ public Object clientsStatus() { .collect(Collectors.toMap(key -> key.get(0), value -> value.get(1))); } + @GetMapping("/oppsummert") + @Operation(description = "Hent oppsummert status for Dolly forbrukere") + public NavStatus clientsStatusSummary() { + var status = consumerRegister + .parallelStream() + .filter(StatusController::isNotExcluded) + .map(client -> List.of(getConsumerNavn(client.getClass().getSimpleName()), client.checkStatus(webClient))) + .collect(Collectors.toMap(key -> key.get(0), value -> value.get(1))); + + return NavStatus.builder() + .status(status.values().stream().allMatch((String value) -> value.matches("OK")) ? SystemStatus.OK : SystemStatus.ISSUE) + .description("temp") //TODO: Legg til description og sjekke om linje over fungerer + .logLink("temp") //TODO: Legg til loglink + .build(); + } + public static boolean isNotExcluded(ConsumerStatus consumer) { var consumerNavn = consumer.getClass().getSimpleName().split("\\$\\$")[0]; return !excludeConsumers.contains(consumerNavn); From 63aead44ea51096cc38511639aa4ce72963520f4 Mon Sep 17 00:00:00 2001 From: Betsy Carina Traran Date: Tue, 15 Aug 2023 13:00:12 +0200 Subject: [PATCH 07/22] Statusmelding sjekk identlister --- .../sammendrag/miljoeStatus/MiljoeStatus.tsx | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/apps/dolly-frontend/src/main/js/src/components/bestilling/sammendrag/miljoeStatus/MiljoeStatus.tsx b/apps/dolly-frontend/src/main/js/src/components/bestilling/sammendrag/miljoeStatus/MiljoeStatus.tsx index 38e03fb02a1..a2fbdc7d000 100644 --- a/apps/dolly-frontend/src/main/js/src/components/bestilling/sammendrag/miljoeStatus/MiljoeStatus.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/bestilling/sammendrag/miljoeStatus/MiljoeStatus.tsx @@ -92,20 +92,27 @@ const mergeIdentiskeStatusmeldinger = (statuser: Status[]) => { ?.map((status) => ({ melding: status.melding, navn: status.navn, + identer: status.identer, })) ?.filter( - (value, index, self) => index === self?.findIndex((status) => _.isEqual(status, value)) + (value, index, self) => index === self?.findIndex((status) => _.isEqual(status, value)), ) - return [...unikeStatusMeldingerPerSystem]?.map((statusMelding) => - statuser - ?.filter( - (status) => status.melding === statusMelding.melding && status.navn === statusMelding.navn - ) - ?.reduce((previousValue, currentValue) => ({ - ...previousValue, - miljo: `${previousValue.miljo}, ${currentValue.miljo}`, - })) + return [...unikeStatusMeldingerPerSystem]?.map( + (statusMelding) => + statuser + ?.filter((status) => { + const identerErIdentiske = _.isEqual(status.identer, statusMelding.identer) + return ( + status.melding === statusMelding.melding && + status.navn === statusMelding.navn && + identerErIdentiske + ) + }) + ?.reduce((previousValue, currentValue) => ({ + ...previousValue, + miljo: `${previousValue.miljo}, ${currentValue.miljo}`, + })), ) } From 7907ac04905c55120fb505a7f49b8549a197bc66 Mon Sep 17 00:00:00 2001 From: stigus Date: Wed, 16 Aug 2023 15:58:30 +0200 Subject: [PATCH 08/22] =?UTF-8?q?Skrevet=20om=20statush=C3=A5ndtering=20fo?= =?UTF-8?q?r=20diverse=20testnav=20applikasjoner?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nav/dolly/bestilling/ConsumerStatus.java | 8 ++--- .../dolly/provider/api/StatusController.java | 27 +++++++++++---- .../no/nav/dolly/util/CheckAliveUtil.java | 19 +++++++---- .../controller/StatusController.java | 15 ++++---- .../dto/status/v1/DollyStatusResponse.java | 13 +++++++ proxies/arena-forvalteren-proxy/build.gradle | 1 + .../arena-forvalteren-proxy/settings.gradle | 1 + .../StatusController.java | 15 ++++---- proxies/pdl-proxy/build.gradle | 3 +- proxies/pdl-proxy/settings.gradle | 1 + .../proxies/pdlproxy/StatusController.java | 34 ++++++++----------- proxies/saf-proxy/build.gradle | 1 + proxies/saf-proxy/settings.gradle | 1 + .../proxies/safproxy/StatusController.java | 13 ++++--- 14 files changed, 90 insertions(+), 62 deletions(-) create mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/status/v1/DollyStatusResponse.java diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/ConsumerStatus.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/ConsumerStatus.java index ce541d930a2..93dfb7fda12 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/ConsumerStatus.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/ConsumerStatus.java @@ -1,6 +1,7 @@ package no.nav.dolly.bestilling; import no.nav.dolly.util.CheckAliveUtil; +import no.nav.testnav.libs.dto.status.v1.DollyStatusResponse; import org.springframework.web.reactive.function.client.WebClient; import java.util.Map; @@ -12,17 +13,14 @@ public interface ConsumerStatus { String consumerName(); - default Map checkStatus(WebClient webClient) { - final String TEAM_DOLLY = "Team Dolly"; + default Map checkStatus(WebClient webClient) { var consumerStatus = CheckAliveUtil.checkConsumerStatus( serviceUrl() + "/internal/isAlive", serviceUrl() + "/internal/isReady", webClient); - consumerStatus.put("team", TEAM_DOLLY); - - var statusMap = new ConcurrentHashMap(); + var statusMap = new ConcurrentHashMap(); statusMap.put(consumerName(), consumerStatus); try { diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/provider/api/StatusController.java b/apps/dolly-backend/src/main/java/no/nav/dolly/provider/api/StatusController.java index 2cb8d2f600b..140424eff84 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/provider/api/StatusController.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/provider/api/StatusController.java @@ -2,7 +2,9 @@ import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import no.nav.dolly.bestilling.ConsumerStatus; +import no.nav.testnav.libs.dto.status.v1.DollyStatusResponse; import no.nav.dolly.domain.resultset.NavStatus; import no.nav.dolly.domain.resultset.SystemStatus; import org.springframework.http.MediaType; @@ -18,6 +20,7 @@ import java.util.stream.Collectors; @RestController +@Slf4j @RequiredArgsConstructor @RequestMapping(value = "/api/v1/status", produces = MediaType.APPLICATION_JSON_VALUE) @CrossOrigin @@ -52,12 +55,12 @@ public class StatusController { @GetMapping() @Operation(description = "Hent status for Dolly forbrukere") - public Object clientsStatus() { + public Map> clientsStatus() { return consumerRegister .parallelStream() .filter(StatusController::isNotExcluded) .map(client -> List.of(getConsumerNavn(client.getClass().getSimpleName()), client.checkStatus(webClient))) - .collect(Collectors.toMap(key -> key.get(0), value -> value.get(1))); + .collect(Collectors.toMap(key -> key.get(0), value -> (Map) value.get(1))); } @GetMapping("/oppsummert") @@ -67,12 +70,24 @@ public NavStatus clientsStatusSummary() { .parallelStream() .filter(StatusController::isNotExcluded) .map(client -> List.of(getConsumerNavn(client.getClass().getSimpleName()), client.checkStatus(webClient))) - .collect(Collectors.toMap(key -> key.get(0), value -> value.get(1))); + .collect(Collectors.toMap(key -> (String) key.get(0), value -> (Map) value.get(1))); + + status.values().forEach(temp -> { + log.info(temp.toString()); + temp.values().forEach(dollyStatusResponse -> { + log.info(dollyStatusResponse.toString()); + }); + }); return NavStatus.builder() - .status(status.values().stream().allMatch((String value) -> value.matches("OK")) ? SystemStatus.OK : SystemStatus.ISSUE) - .description("temp") //TODO: Legg til description og sjekke om linje over fungerer - .logLink("temp") //TODO: Legg til loglink + .status(status.values().stream() + .allMatch(statusResponseMap -> statusResponseMap.values().stream() + .allMatch(dollyStatusResponse -> dollyStatusResponse.getReady() + .matches("OK"))) ? SystemStatus.OK : SystemStatus.ISSUE) + .description(status.entrySet().stream() + .filter(entry -> !entry.getValue().values().stream().allMatch(dollyStatusResponse -> dollyStatusResponse.getReady().matches("OK"))) + .map(Map.Entry::getKey).collect(Collectors.joining(", "))) //TODO: Legg til description og sjekke om linje over fungerer + .logLink("") //TODO: Legg til loglink .build(); } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/util/CheckAliveUtil.java b/apps/dolly-backend/src/main/java/no/nav/dolly/util/CheckAliveUtil.java index 0fe6d4ea3be..5061ddfc415 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/util/CheckAliveUtil.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/util/CheckAliveUtil.java @@ -2,12 +2,12 @@ import lombok.experimental.UtilityClass; import lombok.extern.slf4j.Slf4j; +import no.nav.testnav.libs.dto.status.v1.DollyStatusResponse; import org.springframework.http.ResponseEntity; import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClientResponseException; import java.util.HashMap; -import java.util.Map; import static java.util.Objects.nonNull; @@ -15,16 +15,21 @@ @Slf4j public final class CheckAliveUtil { + final String TEAM_DOLLY = "Team Dolly"; private static final String PATTERN = "%s, URL: %s"; - public static Map checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - var map = new HashMap(); - map.put("alive", checkIsAlive(webClient, aliveUrl)); - map.put("ready", checkIsAlive(webClient, readyUrl)); - return map; + public static DollyStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + var map = new HashMap(); + map.put("alive", checkInternal(webClient, aliveUrl)); + map.put("ready", checkInternal(webClient, readyUrl)); + return DollyStatusResponse.builder() + .alive(checkInternal(webClient, aliveUrl)) + .ready(checkInternal(webClient, readyUrl)) + .team(TEAM_DOLLY) + .build(); } - private String checkIsAlive(WebClient webClient, String url) { + private String checkInternal(WebClient webClient, String url) { try { ResponseEntity response = webClient.get().uri(url) .retrieve().toBodilessEntity() diff --git a/apps/inntektsmelding-service/src/main/java/no/nav/registre/testnav/inntektsmeldingservice/controller/StatusController.java b/apps/inntektsmelding-service/src/main/java/no/nav/registre/testnav/inntektsmeldingservice/controller/StatusController.java index 7626dbbff48..095bcd00c1e 100644 --- a/apps/inntektsmelding-service/src/main/java/no/nav/registre/testnav/inntektsmeldingservice/controller/StatusController.java +++ b/apps/inntektsmelding-service/src/main/java/no/nav/registre/testnav/inntektsmeldingservice/controller/StatusController.java @@ -1,5 +1,6 @@ package no.nav.registre.testnav.inntektsmeldingservice.controller; +import no.nav.testnav.libs.dto.status.v1.DollyStatusResponse; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -7,33 +8,31 @@ import reactor.core.publisher.Mono; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; @RestController public class StatusController { private static final String TEAM = "Team Dolly"; @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - public Map> getStatus() { + public Map getStatus() { var statusWebClient = WebClient.builder().build(); var status = checkConsumerStatus( "https://testnav-inntektsmelding-generator-service.intern.dev.nav.no/internal/isAlive", "https://testnav-inntektsmelding-generator-service.intern.dev.nav.no/internal/isReady", statusWebClient); - status.put("team", TEAM); return Map.of( "testnav-inntektsmelding-generator-service", status ); } - public Map checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - ConcurrentHashMap status = new ConcurrentHashMap<>(); + public DollyStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + var dollyStatus = DollyStatusResponse.builder().team(TEAM).build(); Thread blockingThread = new Thread(() -> { - status.put("alive", checkStatus(webClient, aliveUrl).block()); - status.put("ready", checkStatus(webClient, readyUrl).block()); + dollyStatus.setAlive(checkStatus(webClient, aliveUrl).block()); + dollyStatus.setReady(checkStatus(webClient, readyUrl).block()); }); blockingThread.start(); try { @@ -42,7 +41,7 @@ public Map checkConsumerStatus(String aliveUrl, String readyUrl, throw new RuntimeException(e); } - return status; + return dollyStatus; } private Mono checkStatus(WebClient webClient, String url) { diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/status/v1/DollyStatusResponse.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/status/v1/DollyStatusResponse.java new file mode 100644 index 00000000000..2670fb4c0fd --- /dev/null +++ b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/status/v1/DollyStatusResponse.java @@ -0,0 +1,13 @@ +package no.nav.testnav.libs.dto.status.v1; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class DollyStatusResponse { + + private String alive; + private String ready; + private String team; +} diff --git a/proxies/arena-forvalteren-proxy/build.gradle b/proxies/arena-forvalteren-proxy/build.gradle index f49f959c183..eee2ba3f396 100644 --- a/proxies/arena-forvalteren-proxy/build.gradle +++ b/proxies/arena-forvalteren-proxy/build.gradle @@ -54,6 +54,7 @@ dependencies { implementation 'no.nav.testnav.libs:reactive-core' implementation 'no.nav.testnav.libs:reactive-proxy' implementation 'no.nav.testnav.libs:security-core' + implementation 'no.nav.testnav.libs:data-transfer-objects' implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' implementation 'org.springframework.boot:spring-boot-starter-webflux' diff --git a/proxies/arena-forvalteren-proxy/settings.gradle b/proxies/arena-forvalteren-proxy/settings.gradle index aea5f2e4fd8..c6c8e896db9 100644 --- a/proxies/arena-forvalteren-proxy/settings.gradle +++ b/proxies/arena-forvalteren-proxy/settings.gradle @@ -8,6 +8,7 @@ rootProject.name = 'arena-forvalteren-proxy' includeBuild '../../libs/reactive-core' includeBuild '../../libs/reactive-proxy' includeBuild '../../libs/security-core' +includeBuild '../../libs/data-transfer-objects' gradleEnterprise { buildScan { diff --git a/proxies/arena-forvalteren-proxy/src/main/java/no/nav/testnav/proxies/arenaforvalterenproxy/StatusController.java b/proxies/arena-forvalteren-proxy/src/main/java/no/nav/testnav/proxies/arenaforvalterenproxy/StatusController.java index 3787651c1d0..b8bb88bf3d2 100644 --- a/proxies/arena-forvalteren-proxy/src/main/java/no/nav/testnav/proxies/arenaforvalterenproxy/StatusController.java +++ b/proxies/arena-forvalteren-proxy/src/main/java/no/nav/testnav/proxies/arenaforvalterenproxy/StatusController.java @@ -1,5 +1,6 @@ package no.nav.testnav.proxies.arenaforvalterenproxy; +import no.nav.testnav.libs.dto.status.v1.DollyStatusResponse; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -7,33 +8,31 @@ import reactor.core.publisher.Mono; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; @RestController public class StatusController { private static final String TEAM = "Team Arena"; @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - public Map> getStatus() { + public Map getStatus() { var statusWebClient = WebClient.builder().build(); var status = checkConsumerStatus( "https://arena-forvalteren.dev.adeo.no/internal/isAlive", "https://arena-forvalteren.dev.adeo.no/internal/isReady", statusWebClient); - status.put("team", TEAM); return Map.of( "arena-forvalteren", status ); } - public Map checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - ConcurrentHashMap status = new ConcurrentHashMap<>(); + public DollyStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + DollyStatusResponse status = DollyStatusResponse.builder().team(TEAM).build(); Thread blockingThread = new Thread(() -> { - status.put("alive", checkStatus(webClient, aliveUrl).block()); - status.put("ready", checkStatus(webClient, readyUrl).block()); + status.setAlive(checkStatus(webClient, aliveUrl).block()); + status.setReady(checkStatus(webClient, readyUrl).block()); }); blockingThread.start(); try { @@ -54,4 +53,4 @@ private Mono checkStatus(WebClient webClient, String url) { .doOnSuccess(result -> Mono.just("OK")) .map(result -> result.startsWith("Error:") ? result : "OK"); } -} +} \ No newline at end of file diff --git a/proxies/pdl-proxy/build.gradle b/proxies/pdl-proxy/build.gradle index a510c861f5e..4d0d5716e9f 100644 --- a/proxies/pdl-proxy/build.gradle +++ b/proxies/pdl-proxy/build.gradle @@ -53,13 +53,14 @@ dependencies { implementation 'no.nav.testnav.libs:reactive-core' implementation 'no.nav.testnav.libs:reactive-proxy' implementation 'no.nav.testnav.libs:reactive-security' + implementation 'no.nav.testnav.libs:data-transfer-objects' implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' implementation 'org.springframework.boot:spring-boot-starter-webflux' implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap' // TODO remove legacy bootstrap config. implementation 'org.springframework.cloud:spring-cloud-starter-vault-config' implementation 'org.springframework.cloud:spring-cloud-starter-gateway' - + implementation 'net.logstash.logback:logstash-logback-encoder:7.3' implementation 'org.hibernate.validator:hibernate-validator' diff --git a/proxies/pdl-proxy/settings.gradle b/proxies/pdl-proxy/settings.gradle index a5c9b599049..983b60cb6fa 100644 --- a/proxies/pdl-proxy/settings.gradle +++ b/proxies/pdl-proxy/settings.gradle @@ -5,6 +5,7 @@ plugins { rootProject.name = 'pdl-proxy' includeBuild '../../libs/security-core' +includeBuild '../../libs/data-transfer-objects' includeBuild '../../libs/reactive-core' includeBuild '../../libs/reactive-proxy' includeBuild '../../libs/reactive-security' diff --git a/proxies/pdl-proxy/src/main/java/no/nav/testnav/proxies/pdlproxy/StatusController.java b/proxies/pdl-proxy/src/main/java/no/nav/testnav/proxies/pdlproxy/StatusController.java index 9f72ba9430f..e904f0aa4f6 100644 --- a/proxies/pdl-proxy/src/main/java/no/nav/testnav/proxies/pdlproxy/StatusController.java +++ b/proxies/pdl-proxy/src/main/java/no/nav/testnav/proxies/pdlproxy/StatusController.java @@ -1,5 +1,6 @@ package no.nav.testnav.proxies.pdlproxy; +import no.nav.testnav.libs.dto.status.v1.DollyStatusResponse; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -7,45 +8,38 @@ import reactor.core.publisher.Mono; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; @RestController public class StatusController { private static final String TEAM_PDL = "Team Persondata"; @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - public Map> getStatus() { - var statusWebClient = WebClient.builder().build(); + public Map getStatus() { var pdlTestdataStatus = checkConsumerStatus( "https://pdl-testdata.dev.intern.nav.no/internal/health/liveness", "https://pdl-testdata.dev.intern.nav.no/internal/health/readiness", WebClient.builder().build()); - pdlTestdataStatus.put("team", TEAM_PDL); var pdlApiStatus = checkConsumerStatus( "https://pdl-api.dev.intern.nav.no/internal/health/liveness", "https://pdl-api.dev.intern.nav.no/internal/health/readiness", WebClient.builder().build()); - pdlApiStatus.put("team", TEAM_PDL); var pdlApiQ1Status = checkConsumerStatus( "https://pdl-api-q1.dev.intern.nav.no/internal/health/liveness", "https://pdl-api-q1.dev.intern.nav.no/internal/health/readiness", WebClient.builder().build()); - pdlApiQ1Status.put("team", TEAM_PDL); var pdlIdenthendelseStatus = checkConsumerStatus( "https://pdl-identhendelse-lager.dev.intern.nav.no/internal/health/liveness", "https://pdl-identhendelse-lager.dev.intern.nav.no/internal/health/readiness", WebClient.builder().build()); - pdlIdenthendelseStatus.put("team", TEAM_PDL); var pdlAktorStatus = checkConsumerStatus( "https://pdl-aktor.dev.intern.nav.no/internal/health/liveness", "https://pdl-aktor.dev.intern.nav.no/internal/health/readiness", WebClient.builder().build()); - pdlAktorStatus.put("team", TEAM_PDL); return Map.of( "pdl-testdata", pdlTestdataStatus, @@ -56,12 +50,12 @@ public Map> getStatus() { ); } - public Map checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - ConcurrentHashMap status = new ConcurrentHashMap<>(); + public DollyStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + DollyStatusResponse status = DollyStatusResponse.builder().team(TEAM_PDL).build(); Thread blockingThread = new Thread(() -> { - status.put("alive", checkStatus(webClient, aliveUrl).block()); - status.put("ready", checkStatus(webClient, readyUrl).block()); + status.setAlive(checkStatus(webClient, aliveUrl).block()); + status.setReady(checkStatus(webClient, readyUrl).block()); }); blockingThread.start(); try { @@ -74,12 +68,12 @@ public Map checkConsumerStatus(String aliveUrl, String readyUrl, } private Mono checkStatus(WebClient webClient, String url) { - return webClient.get().uri(url) - .retrieve() - .bodyToMono(String.class) - .defaultIfEmpty("OK") - .onErrorResume(Exception.class, error -> Mono.just("Error: " + error.getMessage())) - .doOnSuccess(result -> Mono.just("OK")) - .map(result -> result.startsWith("Error:") ? result : "OK"); + return webClient.get().uri(url) + .retrieve() + .bodyToMono(String.class) + .defaultIfEmpty("OK") + .onErrorResume(Exception.class, error -> Mono.just("Error: " + error.getMessage())) + .doOnSuccess(result -> Mono.just("OK")) + .map(result -> result.startsWith("Error:") ? result : "OK"); } -} +} \ No newline at end of file diff --git a/proxies/saf-proxy/build.gradle b/proxies/saf-proxy/build.gradle index 2375dfd7c77..e683afdb2ce 100644 --- a/proxies/saf-proxy/build.gradle +++ b/proxies/saf-proxy/build.gradle @@ -53,6 +53,7 @@ dependencies { implementation 'no.nav.testnav.libs:reactive-core' implementation 'no.nav.testnav.libs:reactive-proxy' implementation 'no.nav.testnav.libs:reactive-security' + implementation 'no.nav.testnav.libs:data-transfer-objects' implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' implementation 'org.springframework.boot:spring-boot-starter-webflux' diff --git a/proxies/saf-proxy/settings.gradle b/proxies/saf-proxy/settings.gradle index 10fc93a237d..046cc5fc40e 100644 --- a/proxies/saf-proxy/settings.gradle +++ b/proxies/saf-proxy/settings.gradle @@ -9,6 +9,7 @@ includeBuild '../../libs/reactive-core' includeBuild '../../libs/reactive-proxy' includeBuild '../../libs/security-core' includeBuild '../../libs/reactive-security' +includeBuild '../../libs/data-transfer-objects' gradleEnterprise { buildScan { diff --git a/proxies/saf-proxy/src/main/java/no/nav/testnav/proxies/safproxy/StatusController.java b/proxies/saf-proxy/src/main/java/no/nav/testnav/proxies/safproxy/StatusController.java index 4f36600b9f3..c02ad9d79a8 100644 --- a/proxies/saf-proxy/src/main/java/no/nav/testnav/proxies/safproxy/StatusController.java +++ b/proxies/saf-proxy/src/main/java/no/nav/testnav/proxies/safproxy/StatusController.java @@ -1,5 +1,6 @@ package no.nav.testnav.proxies.safproxy; +import no.nav.testnav.libs.dto.status.v1.DollyStatusResponse; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -7,7 +8,6 @@ import reactor.core.publisher.Mono; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -16,7 +16,7 @@ public class StatusController { private static final String TEAM = "teamdokumenthandtering"; @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - public Map> getStatus() { + public Map getStatus() { var statusWebClient = WebClient.builder().build(); return Stream.of("q1", "q2", "q4", "q5", "t3") @@ -26,7 +26,6 @@ public Map> getStatus() { "https://saf-" + miljo + ".teamdokumenthandtering.svc.nais.local/isAlive", "https://saf-" + miljo + "teamdokumenthandtering.svc.nais.local/isReady", statusWebClient); - miljoStatus.put("team", TEAM); return Map.of( "saf-" + miljo, miljoStatus ); @@ -35,12 +34,12 @@ public Map> getStatus() { .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); } - public Map checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - ConcurrentHashMap status = new ConcurrentHashMap<>(); + public DollyStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + DollyStatusResponse status = DollyStatusResponse.builder().team(TEAM).build(); Thread blockingThread = new Thread(() -> { - status.put("alive", checkStatus(webClient, aliveUrl).block()); - status.put("ready", checkStatus(webClient, readyUrl).block()); + status.setAlive(checkStatus(webClient, aliveUrl).block()); + status.setReady(checkStatus(webClient, readyUrl).block()); }); blockingThread.start(); try { From a868e2c4ecd6e665803b99f4b6f0851698df6e9e Mon Sep 17 00:00:00 2001 From: stigus Date: Wed, 16 Aug 2023 16:19:54 +0200 Subject: [PATCH 09/22] Fix for forbidden logout mot cv endepunkt #deploy-test-frontend --- .../src/main/js/src/api/index.ts | 49 ++++++++++--------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/apps/dolly-frontend/src/main/js/src/api/index.ts b/apps/dolly-frontend/src/main/js/src/api/index.ts index 72c19b8b70f..75c43e83c62 100644 --- a/apps/dolly-frontend/src/main/js/src/api/index.ts +++ b/apps/dolly-frontend/src/main/js/src/api/index.ts @@ -17,8 +17,8 @@ export const multiFetcherAny = (urlListe, headers) => { throw new Error('Returnerte ingen verdi, prøver neste promise..') } return [result] - }) - ) + }), + ), ) } @@ -27,8 +27,8 @@ export const multiFetcherAll = (urlListe, headers = null) => { urlListe.map((url) => fetcher(url, headers).then((result) => { return result - }) - ) + }), + ), ) } @@ -37,8 +37,8 @@ export const multiFetcherBatchData = (url, dataListe) => { dataListe.map((data) => fetchJson(url, { method: 'POST' }, data).then((result) => { return result - }) - ) + }), + ), ) } @@ -47,8 +47,8 @@ export const multiFetcherInst = (miljoUrlListe, headers = null, path = null) => miljoUrlListe.map((obj) => fetcher(obj.url, headers).then((result) => { return { miljo: obj.miljo, data: path ? result[path] : result?.[obj.miljo] } - }) - ) + }), + ), ) } @@ -59,8 +59,8 @@ export const multiFetcherArena = (miljoUrlListe, headers = null) => { const filteredResult = result?.status === 'NO_CONTENT' || result?.status === 'NOT_FOUND' ? null : result return { miljo: obj.miljo, data: filteredResult, status: result?.status } - }) - ) + }), + ), ) } @@ -73,8 +73,8 @@ export const multiFetcherAareg = (miljoUrlListe, headers = null, path = null) => }) .catch((feil) => { return { miljo: obj.miljo, feil: feil } - }) - ) + }), + ), ).then((liste) => liste?.map((item) => item?.value)) } @@ -85,8 +85,8 @@ export const multiFetcherAmelding = (miljoUrlListe, headers = null, path = null) .then((result) => ({ miljo: obj.miljo, data: path ? result[path] : result })) .catch((feil) => { return { miljo: obj.miljo, feil: feil } - }) - ) + }), + ), ).then((liste) => liste?.map((item) => item?.value)) } @@ -95,8 +95,8 @@ export const multiFetcherPensjon = (miljoUrlListe, headers = null as any) => { miljoUrlListe.map((obj) => fetcher(obj.url, { miljo: obj.miljo, ...headers }).then((result) => { return { miljo: obj.miljo, data: result } - }) - ) + }), + ), ) } @@ -108,8 +108,8 @@ export const multiFetcherDokarkiv = (miljoUrlListe) => miljo: obj.miljo, data: result, })) - : { miljo: obj.miljo, data: null } - ) + : { miljo: obj.miljo, data: null }, + ), ) export const fetcher = (url, headers) => @@ -119,7 +119,10 @@ export const fetcher = (url, headers) => return res.data }) .catch((reason) => { - if (reason?.response?.status === 401 || reason?.response?.status === 403) { + if ( + (reason?.response?.status === 401 || reason?.response?.status === 403) && + url.includes('dolly-backend') + ) { console.error('Auth feilet, navigerer til login') navigateToLogin() } @@ -134,7 +137,7 @@ export const fetcher = (url, headers) => export const imageFetcher = (...args: Argument[]) => originalFetch(...args).then((res: Response) => - res.ok ? res.blob().then((blob: Blob) => URL.createObjectURL(blob)) : null + res.ok ? res.blob().then((blob: Blob) => URL.createObjectURL(blob)) : null, ) type Method = 'POST' | 'GET' | 'PUT' | 'DELETE' @@ -149,7 +152,7 @@ const _fetch = (url: string, config: Config, body?: object): Promise = fetchRetry(url, { retryOn: (attempt, _error, response) => { if (!response.ok && !runningCypressE2E()) { - if (response.status === 401) { + if (response.status === 401 && url.includes('dolly-backend')) { console.error('Auth feilet, navigerer til login') navigateToLogin() } @@ -172,7 +175,7 @@ const _fetch = (url: string, config: Config, body?: object): Promise = window.location.href = response.url } if (!response.ok && !runningCypressE2E()) { - if (response.status === 401) { + if (response.status === 401 && url.includes('dolly-backend')) { console.error('Auth feilet, navigerer til login') navigateToLogin() } @@ -191,7 +194,7 @@ const fetchJson = (url: string, config: Config, body?: object): Promise => method: config.method, headers: { ...config.headers, 'Content-Type': 'application/json' }, }, - body + body, ) .then((response) => { return response?.text() From 26d272562b6af86d13e630dff8acef5677d9bde1 Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 17 Aug 2023 08:41:14 +0200 Subject: [PATCH 10/22] =?UTF-8?q?Skrevet=20om=20statush=C3=A5ndtering=20fo?= =?UTF-8?q?r=20diverse=20testnav=20applikasjoner?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nav/dolly/bestilling/ConsumerStatus.java | 6 +- .../dolly/provider/api/StatusController.java | 8 +- .../no/nav/dolly/util/CheckAliveUtil.java | 6 +- .../controller/StatusController.java | 8 +- ...sponse.java => TestnavStatusResponse.java} | 2 +- .../StatusController.java | 8 +- proxies/brregstub-proxy/build.gradle | 1 + proxies/brregstub-proxy/settings.gradle | 1 + .../brregstubproxy/StatusController.java | 13 ++- proxies/dokarkiv-proxy/build.gradle | 3 +- proxies/dokarkiv-proxy/settings.gradle | 1 + .../dokarkivproxy/StatusController.java | 16 ++- proxies/histark-proxy/build.gradle | 1 + proxies/histark-proxy/settings.gradle | 1 + .../histarkproxy/StatusController.java | 101 ------------------ proxies/inntektstub-proxy/build.gradle | 1 + proxies/inntektstub-proxy/settings.gradle | 1 + .../inntektstubproxy/StatusController.java | 72 +++---------- proxies/inst-proxy/build.gradle | 1 + proxies/inst-proxy/settings.gradle | 1 + .../proxies/instproxy/StatusController.java | 15 ++- proxies/kodeverk-proxy/build.gradle | 1 + proxies/kodeverk-proxy/settings.gradle | 1 + .../kodeverkproxy/StatusController.java | 35 +++--- .../kontoregister-person-proxy/build.gradle | 1 + .../settings.gradle | 1 + .../kontoregisterperson/StatusController.java | 72 ++++--------- proxies/norg2-proxy/build.gradle | 1 + proxies/norg2-proxy/settings.gradle | 1 + .../proxies/norg2proxy/StatusController.java | 35 +++--- .../proxies/pdlproxy/StatusController.java | 8 +- .../build.gradle | 1 + .../settings.gradle | 1 + .../StatusController.java | 64 ++++------- .../proxies/safproxy/StatusController.java | 8 +- proxies/sigrunstub-proxy/build.gradle | 1 + proxies/sigrunstub-proxy/settings.gradle | 1 + .../sigrunstubproxy/StatusController.java | 23 ++-- proxies/skjermingsregister-proxy/build.gradle | 1 + .../skjermingsregister-proxy/settings.gradle | 1 + .../StatusController.java | 21 ++-- .../statisk-data-forvalter-proxy/build.gradle | 1 + .../settings.gradle | 1 + .../StatusController.java | 21 ++-- proxies/sykemelding-api-proxy/build.gradle | 1 + proxies/sykemelding-api-proxy/settings.gradle | 1 + .../sykemeldingapiproxy/StatusController.java | 21 ++-- .../synthdata-meldekort-proxy/build.gradle | 1 + .../synthdata-meldekort-proxy/settings.gradle | 1 + .../StatusController.java | 22 ++-- proxies/tps-forvalteren-proxy/build.gradle | 1 + proxies/tps-forvalteren-proxy/settings.gradle | 1 + .../tpsforvalterenproxy/StatusController.java | 21 ++-- proxies/udistub-proxy/build.gradle | 1 + proxies/udistub-proxy/settings.gradle | 1 + .../udistubproxy/StatusController.java | 21 ++-- 56 files changed, 277 insertions(+), 384 deletions(-) rename libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/status/v1/{DollyStatusResponse.java => TestnavStatusResponse.java} (83%) delete mode 100644 proxies/histark-proxy/src/main/java/no/nav/testnav/proxies/histarkproxy/StatusController.java diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/ConsumerStatus.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/ConsumerStatus.java index 93dfb7fda12..79ab6da758d 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/ConsumerStatus.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/ConsumerStatus.java @@ -1,7 +1,7 @@ package no.nav.dolly.bestilling; import no.nav.dolly.util.CheckAliveUtil; -import no.nav.testnav.libs.dto.status.v1.DollyStatusResponse; +import no.nav.testnav.libs.dto.status.v1.TestnavStatusResponse; import org.springframework.web.reactive.function.client.WebClient; import java.util.Map; @@ -13,14 +13,14 @@ public interface ConsumerStatus { String consumerName(); - default Map checkStatus(WebClient webClient) { + default Map checkStatus(WebClient webClient) { var consumerStatus = CheckAliveUtil.checkConsumerStatus( serviceUrl() + "/internal/isAlive", serviceUrl() + "/internal/isReady", webClient); - var statusMap = new ConcurrentHashMap(); + var statusMap = new ConcurrentHashMap(); statusMap.put(consumerName(), consumerStatus); try { diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/provider/api/StatusController.java b/apps/dolly-backend/src/main/java/no/nav/dolly/provider/api/StatusController.java index 140424eff84..c43a4f753be 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/provider/api/StatusController.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/provider/api/StatusController.java @@ -4,7 +4,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.dolly.bestilling.ConsumerStatus; -import no.nav.testnav.libs.dto.status.v1.DollyStatusResponse; +import no.nav.testnav.libs.dto.status.v1.TestnavStatusResponse; import no.nav.dolly.domain.resultset.NavStatus; import no.nav.dolly.domain.resultset.SystemStatus; import org.springframework.http.MediaType; @@ -55,12 +55,12 @@ public class StatusController { @GetMapping() @Operation(description = "Hent status for Dolly forbrukere") - public Map> clientsStatus() { + public Map> clientsStatus() { return consumerRegister .parallelStream() .filter(StatusController::isNotExcluded) .map(client -> List.of(getConsumerNavn(client.getClass().getSimpleName()), client.checkStatus(webClient))) - .collect(Collectors.toMap(key -> key.get(0), value -> (Map) value.get(1))); + .collect(Collectors.toMap(key -> key.get(0), value -> (Map) value.get(1))); } @GetMapping("/oppsummert") @@ -70,7 +70,7 @@ public NavStatus clientsStatusSummary() { .parallelStream() .filter(StatusController::isNotExcluded) .map(client -> List.of(getConsumerNavn(client.getClass().getSimpleName()), client.checkStatus(webClient))) - .collect(Collectors.toMap(key -> (String) key.get(0), value -> (Map) value.get(1))); + .collect(Collectors.toMap(key -> (String) key.get(0), value -> (Map) value.get(1))); status.values().forEach(temp -> { log.info(temp.toString()); diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/util/CheckAliveUtil.java b/apps/dolly-backend/src/main/java/no/nav/dolly/util/CheckAliveUtil.java index 5061ddfc415..b64be758aaf 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/util/CheckAliveUtil.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/util/CheckAliveUtil.java @@ -2,7 +2,7 @@ import lombok.experimental.UtilityClass; import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.libs.dto.status.v1.DollyStatusResponse; +import no.nav.testnav.libs.dto.status.v1.TestnavStatusResponse; import org.springframework.http.ResponseEntity; import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClientResponseException; @@ -18,11 +18,11 @@ public final class CheckAliveUtil { final String TEAM_DOLLY = "Team Dolly"; private static final String PATTERN = "%s, URL: %s"; - public static DollyStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + public static TestnavStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { var map = new HashMap(); map.put("alive", checkInternal(webClient, aliveUrl)); map.put("ready", checkInternal(webClient, readyUrl)); - return DollyStatusResponse.builder() + return TestnavStatusResponse.builder() .alive(checkInternal(webClient, aliveUrl)) .ready(checkInternal(webClient, readyUrl)) .team(TEAM_DOLLY) diff --git a/apps/inntektsmelding-service/src/main/java/no/nav/registre/testnav/inntektsmeldingservice/controller/StatusController.java b/apps/inntektsmelding-service/src/main/java/no/nav/registre/testnav/inntektsmeldingservice/controller/StatusController.java index 095bcd00c1e..bda4334d916 100644 --- a/apps/inntektsmelding-service/src/main/java/no/nav/registre/testnav/inntektsmeldingservice/controller/StatusController.java +++ b/apps/inntektsmelding-service/src/main/java/no/nav/registre/testnav/inntektsmeldingservice/controller/StatusController.java @@ -1,6 +1,6 @@ package no.nav.registre.testnav.inntektsmeldingservice.controller; -import no.nav.testnav.libs.dto.status.v1.DollyStatusResponse; +import no.nav.testnav.libs.dto.status.v1.TestnavStatusResponse; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -14,7 +14,7 @@ public class StatusController { private static final String TEAM = "Team Dolly"; @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - public Map getStatus() { + public Map getStatus() { var statusWebClient = WebClient.builder().build(); var status = checkConsumerStatus( @@ -27,8 +27,8 @@ public Map getStatus() { ); } - public DollyStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - var dollyStatus = DollyStatusResponse.builder().team(TEAM).build(); + public TestnavStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + var dollyStatus = TestnavStatusResponse.builder().team(TEAM).build(); Thread blockingThread = new Thread(() -> { dollyStatus.setAlive(checkStatus(webClient, aliveUrl).block()); diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/status/v1/DollyStatusResponse.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/status/v1/TestnavStatusResponse.java similarity index 83% rename from libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/status/v1/DollyStatusResponse.java rename to libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/status/v1/TestnavStatusResponse.java index 2670fb4c0fd..41a3c838995 100644 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/status/v1/DollyStatusResponse.java +++ b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/status/v1/TestnavStatusResponse.java @@ -5,7 +5,7 @@ @Data @Builder -public class DollyStatusResponse { +public class TestnavStatusResponse { private String alive; private String ready; diff --git a/proxies/arena-forvalteren-proxy/src/main/java/no/nav/testnav/proxies/arenaforvalterenproxy/StatusController.java b/proxies/arena-forvalteren-proxy/src/main/java/no/nav/testnav/proxies/arenaforvalterenproxy/StatusController.java index b8bb88bf3d2..ebc3acf749b 100644 --- a/proxies/arena-forvalteren-proxy/src/main/java/no/nav/testnav/proxies/arenaforvalterenproxy/StatusController.java +++ b/proxies/arena-forvalteren-proxy/src/main/java/no/nav/testnav/proxies/arenaforvalterenproxy/StatusController.java @@ -1,6 +1,6 @@ package no.nav.testnav.proxies.arenaforvalterenproxy; -import no.nav.testnav.libs.dto.status.v1.DollyStatusResponse; +import no.nav.testnav.libs.dto.status.v1.TestnavStatusResponse; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -14,7 +14,7 @@ public class StatusController { private static final String TEAM = "Team Arena"; @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - public Map getStatus() { + public Map getStatus() { var statusWebClient = WebClient.builder().build(); var status = checkConsumerStatus( @@ -27,8 +27,8 @@ public Map getStatus() { ); } - public DollyStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - DollyStatusResponse status = DollyStatusResponse.builder().team(TEAM).build(); + public TestnavStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + TestnavStatusResponse status = TestnavStatusResponse.builder().team(TEAM).build(); Thread blockingThread = new Thread(() -> { status.setAlive(checkStatus(webClient, aliveUrl).block()); diff --git a/proxies/brregstub-proxy/build.gradle b/proxies/brregstub-proxy/build.gradle index bdf1b1e0cb9..e82e9dbe465 100644 --- a/proxies/brregstub-proxy/build.gradle +++ b/proxies/brregstub-proxy/build.gradle @@ -52,6 +52,7 @@ dependencies { implementation 'no.nav.testnav.libs:reactive-core' implementation 'no.nav.testnav.libs:reactive-proxy' + implementation 'no.nav.testnav.libs:data-transfer-objects' implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' implementation 'org.springframework.boot:spring-boot-starter-webflux' diff --git a/proxies/brregstub-proxy/settings.gradle b/proxies/brregstub-proxy/settings.gradle index 1801aeb77cb..64944f7f93b 100644 --- a/proxies/brregstub-proxy/settings.gradle +++ b/proxies/brregstub-proxy/settings.gradle @@ -6,6 +6,7 @@ rootProject.name = 'brregstub-proxy' includeBuild '../../libs/reactive-core' +includeBuild '../../libs/data-transfer-objects' includeBuild '../../libs/reactive-proxy' gradleEnterprise { diff --git a/proxies/brregstub-proxy/src/main/java/no/nav/testnav/proxies/brregstubproxy/StatusController.java b/proxies/brregstub-proxy/src/main/java/no/nav/testnav/proxies/brregstubproxy/StatusController.java index c28d639b522..bfe9d586d40 100644 --- a/proxies/brregstub-proxy/src/main/java/no/nav/testnav/proxies/brregstubproxy/StatusController.java +++ b/proxies/brregstub-proxy/src/main/java/no/nav/testnav/proxies/brregstubproxy/StatusController.java @@ -1,5 +1,6 @@ package no.nav.testnav.proxies.brregstubproxy; +import no.nav.testnav.libs.dto.status.v1.TestnavStatusResponse; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -7,33 +8,31 @@ import reactor.core.publisher.Mono; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; @RestController public class StatusController { private static final String TEAM = "Team Dolly"; @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - public Map> getStatus() { + public Map getStatus() { var statusWebClient = WebClient.builder().build(); var status = checkConsumerStatus( "https://brreg-stub.dev.intern.nav.no/isAlive", "https://brreg-stub.dev.intern.nav.no/isReady", statusWebClient); - status.put("team", TEAM); return Map.of( "brreg-stub", status ); } - public Map checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - ConcurrentHashMap status = new ConcurrentHashMap<>(); + public TestnavStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + TestnavStatusResponse status = TestnavStatusResponse.builder().team(TEAM).build(); Thread blockingThread = new Thread(() -> { - status.put("alive", checkStatus(webClient, aliveUrl).block()); - status.put("ready", checkStatus(webClient, readyUrl).block()); + status.setAlive(checkStatus(webClient, aliveUrl).block()); + status.setReady(checkStatus(webClient, readyUrl).block()); }); blockingThread.start(); try { diff --git a/proxies/dokarkiv-proxy/build.gradle b/proxies/dokarkiv-proxy/build.gradle index c26083094f4..dcf9a438b1b 100644 --- a/proxies/dokarkiv-proxy/build.gradle +++ b/proxies/dokarkiv-proxy/build.gradle @@ -48,13 +48,14 @@ dependencies { implementation 'no.nav.testnav.libs:reactive-core' implementation 'no.nav.testnav.libs:reactive-proxy' implementation 'no.nav.testnav.libs:reactive-security' + implementation 'no.nav.testnav.libs:data-transfer-objects' implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' implementation 'org.springframework.boot:spring-boot-starter-webflux' implementation 'org.springframework.cloud:spring-cloud-starter-vault-config' implementation 'org.springframework.cloud:spring-cloud-starter-gateway' - + implementation 'net.logstash.logback:logstash-logback-encoder:7.3' implementation 'org.hibernate.validator:hibernate-validator' diff --git a/proxies/dokarkiv-proxy/settings.gradle b/proxies/dokarkiv-proxy/settings.gradle index a7587cb147e..5e3b302a99e 100644 --- a/proxies/dokarkiv-proxy/settings.gradle +++ b/proxies/dokarkiv-proxy/settings.gradle @@ -8,6 +8,7 @@ includeBuild '../../libs/reactive-core' includeBuild '../../libs/reactive-proxy' includeBuild '../../libs/security-core' includeBuild '../../libs/reactive-security' +includeBuild '../../libs/data-transfer-objects' gradleEnterprise { buildScan { diff --git a/proxies/dokarkiv-proxy/src/main/java/no/nav/testnav/proxies/dokarkivproxy/StatusController.java b/proxies/dokarkiv-proxy/src/main/java/no/nav/testnav/proxies/dokarkivproxy/StatusController.java index f2eab4b1bbc..4a5f27150ac 100644 --- a/proxies/dokarkiv-proxy/src/main/java/no/nav/testnav/proxies/dokarkivproxy/StatusController.java +++ b/proxies/dokarkiv-proxy/src/main/java/no/nav/testnav/proxies/dokarkivproxy/StatusController.java @@ -1,5 +1,6 @@ package no.nav.testnav.proxies.dokarkivproxy; +import no.nav.testnav.libs.dto.status.v1.TestnavStatusResponse; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; @@ -9,9 +10,7 @@ import java.util.Arrays; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; -import java.util.stream.Stream; @RestController public class StatusController { @@ -21,7 +20,7 @@ public class StatusController { private String environments; @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - public Map> getStatus() { + public Map getStatus() { var statusWebClient = WebClient.builder().build(); return Arrays.asList(environments.split(",")).stream() @@ -31,7 +30,6 @@ public Map> getStatus() { "https://dokarkiv-" + miljo + ".dev.adeo.no/actuator/health/liveness", "https://dokarkiv-" + miljo + ".dev.adeo.no/actuator/health/readiness", statusWebClient); - miljoStatus.put("team", TEAM_DOKARKIV); return Map.of( "dokarkiv-" + miljo, miljoStatus ); @@ -40,12 +38,12 @@ public Map> getStatus() { .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); } - public Map checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - ConcurrentHashMap status = new ConcurrentHashMap<>(); + public TestnavStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + TestnavStatusResponse status = TestnavStatusResponse.builder().team(TEAM_DOKARKIV).build(); Thread blockingThread = new Thread(() -> { - status.put("alive", checkStatus(webClient, aliveUrl).block()); - status.put("ready", checkStatus(webClient, readyUrl).block()); + status.setAlive(checkStatus(webClient, aliveUrl).block()); + status.setReady(checkStatus(webClient, readyUrl).block()); }); blockingThread.start(); try { @@ -66,4 +64,4 @@ private Mono checkStatus(WebClient webClient, String url) { .doOnSuccess(result -> Mono.just("OK")) .map(result -> result.startsWith("Error:") ? result : "OK"); } -} +} \ No newline at end of file diff --git a/proxies/histark-proxy/build.gradle b/proxies/histark-proxy/build.gradle index 8121db84f4e..cd230be8df9 100644 --- a/proxies/histark-proxy/build.gradle +++ b/proxies/histark-proxy/build.gradle @@ -51,6 +51,7 @@ dependencies { implementation 'no.nav.testnav.libs:reactive-core' implementation 'no.nav.testnav.libs:reactive-proxy' + implementation 'no.nav.testnav.libs:data-transfer-objects' implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' implementation 'org.springframework.boot:spring-boot-starter-webflux' diff --git a/proxies/histark-proxy/settings.gradle b/proxies/histark-proxy/settings.gradle index 6d37707a042..9dcebfc21b4 100644 --- a/proxies/histark-proxy/settings.gradle +++ b/proxies/histark-proxy/settings.gradle @@ -7,6 +7,7 @@ rootProject.name = 'histark-proxy' includeBuild '../../libs/reactive-core' includeBuild '../../libs/reactive-proxy' +includeBuild '../../libs/data-transfer-objects' gradleEnterprise { buildScan { diff --git a/proxies/histark-proxy/src/main/java/no/nav/testnav/proxies/histarkproxy/StatusController.java b/proxies/histark-proxy/src/main/java/no/nav/testnav/proxies/histarkproxy/StatusController.java deleted file mode 100644 index 3ac07ea45a5..00000000000 --- a/proxies/histark-proxy/src/main/java/no/nav/testnav/proxies/histarkproxy/StatusController.java +++ /dev/null @@ -1,101 +0,0 @@ -package no.nav.testnav.proxies.histarkproxy; - -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -@RestController -public class StatusController { - private static final String TEAM = "Team Histark"; - - @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - public Map> getStatus() { - var statusWebClient = WebClient.builder().build(); - - var histarkStatus = checkConsumerStatus( - "https://histarkimport.dev.intern.nav.no/internal/isAlive", - "https://histarkimport.dev.intern.nav.no/internal/isReady", - statusWebClient); - histarkStatus.put("team", TEAM); - - return Map.of( - "histark", histarkStatus - ); - } - - public Map checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - ConcurrentHashMap status = new ConcurrentHashMap<>(); - - Thread blockingThread = new Thread(() -> { - var serviceStatus = Stream.of( - checkStatus(webClient, new CheckRequest("alive", aliveUrl)), - checkStatus(webClient, new CheckRequest("ready", readyUrl)) - ) - .map(Mono::block) - .collect(Collectors.toMap(CheckResponse::getType, CheckResponse::getResponse)); - - status.putAll(serviceStatus); - }); - blockingThread.start(); - try { - blockingThread.join(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - - return status; - } - - private Mono checkStatus(WebClient webClient, CheckRequest checkRequest) { - return webClient.get().uri(checkRequest.url) - .retrieve() - .bodyToMono(String.class) - .defaultIfEmpty("OK") - .onErrorResume(Exception.class, error -> Mono.just("Error: " + error.getMessage())) - .doOnSuccess(result -> Mono.just("OK")) - .map(result -> new CheckResponse(checkRequest.type, result.startsWith("Error:") ? result : "OK")); - } - - static class CheckRequest { - public String type; - public String url; - - public CheckRequest(String type, String url) { - this.type = type; - this.url = url; - } - - public String getType() { - return type; - } - - public String getUrl() { - return url; - } - } - - static class CheckResponse { - public String type; - public String response; - - public CheckResponse(String type, String response) { - this.type = type; - this.response = response; - } - - public String getType() { - return type; - } - - public String getResponse() { - return response; - } - } -} diff --git a/proxies/inntektstub-proxy/build.gradle b/proxies/inntektstub-proxy/build.gradle index 90b4256fcfe..d692c3c55cc 100644 --- a/proxies/inntektstub-proxy/build.gradle +++ b/proxies/inntektstub-proxy/build.gradle @@ -51,6 +51,7 @@ dependencies { implementation 'no.nav.testnav.libs:reactive-core' implementation 'no.nav.testnav.libs:reactive-proxy' + implementation 'no.nav.testnav.libs:data-transfer-objects' implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' implementation 'org.springframework.boot:spring-boot-starter-webflux' diff --git a/proxies/inntektstub-proxy/settings.gradle b/proxies/inntektstub-proxy/settings.gradle index 47220e3d87a..78faa0e7780 100644 --- a/proxies/inntektstub-proxy/settings.gradle +++ b/proxies/inntektstub-proxy/settings.gradle @@ -7,6 +7,7 @@ rootProject.name = 'inntektstub-proxy' includeBuild '../../libs/reactive-core' includeBuild '../../libs/reactive-proxy' +includeBuild '../../libs/data-transfer-objects' gradleEnterprise { buildScan { diff --git a/proxies/inntektstub-proxy/src/main/java/no/nav/testnav/proxies/inntektstubproxy/StatusController.java b/proxies/inntektstub-proxy/src/main/java/no/nav/testnav/proxies/inntektstubproxy/StatusController.java index f4c1f80f812..5bb41d89797 100644 --- a/proxies/inntektstub-proxy/src/main/java/no/nav/testnav/proxies/inntektstubproxy/StatusController.java +++ b/proxies/inntektstub-proxy/src/main/java/no/nav/testnav/proxies/inntektstubproxy/StatusController.java @@ -1,5 +1,6 @@ package no.nav.testnav.proxies.inntektstubproxy; +import no.nav.testnav.libs.dto.status.v1.TestnavStatusResponse; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -7,41 +8,39 @@ import reactor.core.publisher.Mono; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; -import java.util.stream.Stream; @RestController public class StatusController { private static final String TEAM = "Team Inntekt"; @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - public Map> getStatus() { + public Map getStatus() { var statusWebClient = WebClient.builder().build(); var pensjonStatus = checkConsumerStatus( "http://inntektstub.team-inntekt.svc.nais.local/internal/isAlive", "http://inntektstub.team-inntekt.svc.nais.local/internal/isReady", statusWebClient); - pensjonStatus.put("team", TEAM); return Map.of( "inntektstub", pensjonStatus ); } - public Map checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - ConcurrentHashMap status = new ConcurrentHashMap<>(); + public TestnavStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + TestnavStatusResponse status = TestnavStatusResponse.builder().team(TEAM).build(); Thread blockingThread = new Thread(() -> { - var serviceStatus = Stream.of( - checkStatus(webClient, new CheckRequest("alive", aliveUrl)), - checkStatus(webClient, new CheckRequest("ready", readyUrl)) - ) - .map(request -> request.block()) - .collect(Collectors.toMap(CheckResponse::getType, CheckResponse::getResponse)); - - status.putAll(serviceStatus); + status.setAlive( + checkStatus(webClient, aliveUrl) + .blockOptional() + .orElse("Error: Empty response") + ); + status.setReady( + checkStatus(webClient, readyUrl) + .blockOptional() + .orElse("Error: Empty response") + ); }); blockingThread.start(); try { @@ -53,49 +52,12 @@ public Map checkConsumerStatus(String aliveUrl, String readyUrl, return status; } - static class CheckRequest { - public String type; - public String url; - - public CheckRequest(String type, String url) { - this.type = type; - this.url = url; - } - - public String getType() { - return type; - } - - public String getUrl() { - return url; - } - } - - static class CheckResponse { - public String type; - public String response; - - public CheckResponse(String type, String response) { - this.type = type; - this.response = response; - } - - public String getType() { - return type; - } - - public String getResponse() { - return response; - } - } - - private Mono checkStatus(WebClient webClient, CheckRequest checkRequest) { - return webClient.get().uri(checkRequest.url) + private Mono checkStatus(WebClient webClient, String url) { + return webClient.get().uri(url) .retrieve() .bodyToMono(String.class) .defaultIfEmpty("OK") .onErrorResume(Exception.class, error -> Mono.just("Error: " + error.getMessage())) - .doOnSuccess(result -> Mono.just("OK")) - .map(result -> new CheckResponse(checkRequest.type, result.startsWith("Error:") ? result : "OK")); + .map(result -> result.startsWith("Error:") ? result : "OK"); } } diff --git a/proxies/inst-proxy/build.gradle b/proxies/inst-proxy/build.gradle index 206df6cc338..a37e0ef9272 100644 --- a/proxies/inst-proxy/build.gradle +++ b/proxies/inst-proxy/build.gradle @@ -52,6 +52,7 @@ dependencies { implementation 'no.nav.testnav.libs:reactive-core' implementation 'no.nav.testnav.libs:reactive-proxy' + implementation 'no.nav.testnav.libs:data-transfer-objects' implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' implementation 'org.springframework.boot:spring-boot-starter-webflux' diff --git a/proxies/inst-proxy/settings.gradle b/proxies/inst-proxy/settings.gradle index 3cb31aa9109..acfb0900b3d 100644 --- a/proxies/inst-proxy/settings.gradle +++ b/proxies/inst-proxy/settings.gradle @@ -7,6 +7,7 @@ rootProject.name = 'inst-proxy' includeBuild '../../libs/reactive-core' includeBuild '../../libs/reactive-proxy' +includeBuild '../../libs/data-transfer-objects' gradleEnterprise { buildScan { diff --git a/proxies/inst-proxy/src/main/java/no/nav/testnav/proxies/instproxy/StatusController.java b/proxies/inst-proxy/src/main/java/no/nav/testnav/proxies/instproxy/StatusController.java index 9a2b0099c3a..4d683cd67c8 100644 --- a/proxies/inst-proxy/src/main/java/no/nav/testnav/proxies/instproxy/StatusController.java +++ b/proxies/inst-proxy/src/main/java/no/nav/testnav/proxies/instproxy/StatusController.java @@ -1,5 +1,6 @@ package no.nav.testnav.proxies.instproxy; +import no.nav.testnav.libs.dto.status.v1.TestnavStatusResponse; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -7,39 +8,35 @@ import reactor.core.publisher.Mono; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; @RestController public class StatusController { private static final String TEAM_ROCKET = "Team Rocket"; @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - public Map> getStatus() { + public Map getStatus() { var statusWebClient = WebClient.builder().build(); var serviceStatus = checkConsumerStatus( "https://institusjon-opphold-testdata.dev.intern.nav.no/internal/health/liveness", "https://institusjon-opphold-testdata.dev.intern.nav.no/internal/health/readiness", statusWebClient); - serviceStatus.put("team", TEAM_ROCKET); return Map.of( "inst-testdata", serviceStatus ); } - public Map checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - ConcurrentHashMap status = new ConcurrentHashMap<>(); + public TestnavStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + TestnavStatusResponse status = TestnavStatusResponse.builder().team(TEAM_ROCKET).build(); Thread blockingThread = new Thread(() -> { - status.put( - "alive", + status.setAlive( checkStatus(webClient, aliveUrl) .blockOptional() .orElse("Error: Empty response") ); - status.put( - "ready", + status.setReady( checkStatus(webClient, readyUrl) .blockOptional() .orElse("Error: Empty response") diff --git a/proxies/kodeverk-proxy/build.gradle b/proxies/kodeverk-proxy/build.gradle index 9c1759d6911..d8ea50caa4d 100644 --- a/proxies/kodeverk-proxy/build.gradle +++ b/proxies/kodeverk-proxy/build.gradle @@ -52,6 +52,7 @@ dependencies { implementation 'no.nav.testnav.libs:reactive-core' implementation 'no.nav.testnav.libs:reactive-proxy' + implementation 'no.nav.testnav.libs:data-transfer-objects' implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' implementation 'org.springframework.boot:spring-boot-starter-webflux' diff --git a/proxies/kodeverk-proxy/settings.gradle b/proxies/kodeverk-proxy/settings.gradle index 0aa9a3571b2..3ca07e31229 100644 --- a/proxies/kodeverk-proxy/settings.gradle +++ b/proxies/kodeverk-proxy/settings.gradle @@ -7,6 +7,7 @@ rootProject.name = 'kodeverk-proxy' includeBuild '../../libs/reactive-core' includeBuild '../../libs/reactive-proxy' +includeBuild '../../libs/data-transfer-objects' gradleEnterprise { buildScan { diff --git a/proxies/kodeverk-proxy/src/main/java/no/nav/testnav/proxies/kodeverkproxy/StatusController.java b/proxies/kodeverk-proxy/src/main/java/no/nav/testnav/proxies/kodeverkproxy/StatusController.java index 7baedb41308..1c50d065a73 100644 --- a/proxies/kodeverk-proxy/src/main/java/no/nav/testnav/proxies/kodeverkproxy/StatusController.java +++ b/proxies/kodeverk-proxy/src/main/java/no/nav/testnav/proxies/kodeverkproxy/StatusController.java @@ -1,5 +1,6 @@ package no.nav.testnav.proxies.kodeverkproxy; +import no.nav.testnav.libs.dto.status.v1.TestnavStatusResponse; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -7,33 +8,39 @@ import reactor.core.publisher.Mono; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; @RestController public class StatusController { private static final String TEAM = "org"; @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - public Map> getStatus() { + public Map getStatus() { var statusWebClient = WebClient.builder().build(); var pensjonStatus = checkConsumerStatus( "http://kodeverk.org.svc.nais.local/internal/isAlive", "http://kodeverk.org.svc.nais.local/internal/isReady", statusWebClient); - pensjonStatus.put("team", TEAM); return Map.of( "kodeverk", pensjonStatus ); } - public Map checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - ConcurrentHashMap status = new ConcurrentHashMap<>(); + public TestnavStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + TestnavStatusResponse status = TestnavStatusResponse.builder().team(TEAM).build(); Thread blockingThread = new Thread(() -> { - status.put("alive", checkStatus(webClient, aliveUrl).block()); - status.put("ready", checkStatus(webClient, readyUrl).block()); + status.setAlive( + checkStatus(webClient, aliveUrl) + .blockOptional() + .orElse("Error: Empty response") + ); + status.setReady( + checkStatus(webClient, readyUrl) + .blockOptional() + .orElse("Error: Empty response") + ); }); blockingThread.start(); try { @@ -46,12 +53,12 @@ public Map checkConsumerStatus(String aliveUrl, String readyUrl, } private Mono checkStatus(WebClient webClient, String url) { - return webClient.get().uri(url) - .retrieve() - .bodyToMono(String.class) - .defaultIfEmpty("OK") - .onErrorResume(Exception.class, error -> Mono.just("Error: " + error.getMessage())) - .doOnSuccess(result -> Mono.just("OK")) - .map(result -> result.startsWith("Error:") ? result : "OK"); + return webClient.get().uri(url) + .retrieve() + .bodyToMono(String.class) + .defaultIfEmpty("OK") + .onErrorResume(Exception.class, error -> Mono.just("Error: " + error.getMessage())) + .doOnSuccess(result -> Mono.just("OK")) + .map(result -> result.startsWith("Error:") ? result : "OK"); } } diff --git a/proxies/kontoregister-person-proxy/build.gradle b/proxies/kontoregister-person-proxy/build.gradle index 3a7643bb5e8..7f34e262f5a 100644 --- a/proxies/kontoregister-person-proxy/build.gradle +++ b/proxies/kontoregister-person-proxy/build.gradle @@ -53,6 +53,7 @@ dependencies { implementation 'no.nav.testnav.libs:reactive-core' implementation 'no.nav.testnav.libs:reactive-proxy' implementation 'no.nav.testnav.libs:reactive-security' + implementation 'no.nav.testnav.libs:data-transfer-objects' implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' implementation 'org.springframework.boot:spring-boot-starter-webflux' diff --git a/proxies/kontoregister-person-proxy/settings.gradle b/proxies/kontoregister-person-proxy/settings.gradle index 4a3a31d6b85..d983d007c8d 100644 --- a/proxies/kontoregister-person-proxy/settings.gradle +++ b/proxies/kontoregister-person-proxy/settings.gradle @@ -9,6 +9,7 @@ includeBuild '../../libs/reactive-core' includeBuild '../../libs/reactive-proxy' includeBuild '../../libs/security-core' includeBuild '../../libs/reactive-security' +includeBuild '../../libs/data-transfer-objects' gradleEnterprise { buildScan { diff --git a/proxies/kontoregister-person-proxy/src/main/java/no/nav/testnav/proxies/kontoregisterperson/StatusController.java b/proxies/kontoregister-person-proxy/src/main/java/no/nav/testnav/proxies/kontoregisterperson/StatusController.java index 3b132307941..7878417bc52 100644 --- a/proxies/kontoregister-person-proxy/src/main/java/no/nav/testnav/proxies/kontoregisterperson/StatusController.java +++ b/proxies/kontoregister-person-proxy/src/main/java/no/nav/testnav/proxies/kontoregisterperson/StatusController.java @@ -1,5 +1,6 @@ package no.nav.testnav.proxies.kontoregisterperson; +import no.nav.testnav.libs.dto.status.v1.TestnavStatusResponse; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -7,41 +8,39 @@ import reactor.core.publisher.Mono; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; -import java.util.stream.Stream; @RestController public class StatusController { private static final String TEAM_OKONOMI = "Team utbetale og informere (okonomi)"; @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - public Map> getStatus() { + public Map getStatus() { var statusWebClient = WebClient.builder().build(); var pensjonStatus = checkConsumerStatus( "https://sokos-kontoregister-person.intern.dev.nav.no/internal/is_alive", "https://sokos-kontoregister-person.intern.dev.nav.no/internal/is_ready", statusWebClient); - pensjonStatus.put("team", TEAM_OKONOMI); return Map.of( "sokos-kontoregister-person", pensjonStatus ); } - public Map checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - ConcurrentHashMap status = new ConcurrentHashMap<>(); + public TestnavStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + TestnavStatusResponse status = TestnavStatusResponse.builder().team(TEAM_OKONOMI).build(); Thread blockingThread = new Thread(() -> { - var serviceStatus = Stream.of( - checkStatus(webClient, new CheckRequest("alive", aliveUrl)), - checkStatus(webClient, new CheckRequest("ready", readyUrl)) - ) - .map(request -> request.block()) - .collect(Collectors.toMap(CheckResponse::getType, CheckResponse::getResponse)); - - status.putAll(serviceStatus); + status.setAlive( + checkStatus(webClient, aliveUrl) + .blockOptional() + .orElse("Error: Empty response") + ); + status.setReady( + checkStatus(webClient, readyUrl) + .blockOptional() + .orElse("Error: Empty response") + ); }); blockingThread.start(); try { @@ -53,48 +52,13 @@ public Map checkConsumerStatus(String aliveUrl, String readyUrl, return status; } - static class CheckRequest { - public String type; - public String url; - - public CheckRequest(String type, String url) { - this.type = type; - this.url = url; - } - - public String getType() { - return type; - } - - public String getUrl() { - return url; - } - } - - static class CheckResponse { - public String type; - public String response; - - public CheckResponse(String type, String response) { - this.type = type; - this.response = response; - } - - public String getType() { - return type; - } - - public String getResponse() { - return response; - } - } - - private Mono checkStatus(WebClient webClient, CheckRequest checkRequest) { - return webClient.get().uri(checkRequest.url) + private Mono checkStatus(WebClient webClient, String url) { + return webClient.get().uri(url) .retrieve() .bodyToMono(String.class) + .defaultIfEmpty("OK") .onErrorResume(Exception.class, error -> Mono.just("Error: " + error.getMessage())) .doOnSuccess(result -> Mono.just("OK")) - .map(result -> new CheckResponse(checkRequest.type, result.startsWith("Error:") ? result : "OK")); + .map(result -> result.startsWith("Error:") ? result : "OK"); } } diff --git a/proxies/norg2-proxy/build.gradle b/proxies/norg2-proxy/build.gradle index b761c286a11..61afff9cd00 100644 --- a/proxies/norg2-proxy/build.gradle +++ b/proxies/norg2-proxy/build.gradle @@ -45,6 +45,7 @@ dependencies { implementation 'no.nav.testnav.libs:reactive-core' implementation 'no.nav.testnav.libs:reactive-proxy' + implementation 'no.nav.testnav.libs:data-transfer-objects' implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' implementation 'org.springframework.boot:spring-boot-starter-webflux' diff --git a/proxies/norg2-proxy/settings.gradle b/proxies/norg2-proxy/settings.gradle index 16113f307c1..d1a2e4e66ff 100644 --- a/proxies/norg2-proxy/settings.gradle +++ b/proxies/norg2-proxy/settings.gradle @@ -7,6 +7,7 @@ rootProject.name = 'norg2-proxy' includeBuild '../../libs/reactive-core' includeBuild '../../libs/reactive-proxy' +includeBuild '../../libs/data-transfer-objects' gradleEnterprise { buildScan { diff --git a/proxies/norg2-proxy/src/main/java/no/nav/testnav/proxies/norg2proxy/StatusController.java b/proxies/norg2-proxy/src/main/java/no/nav/testnav/proxies/norg2proxy/StatusController.java index e1f5763ab63..5fec58bc3c9 100644 --- a/proxies/norg2-proxy/src/main/java/no/nav/testnav/proxies/norg2proxy/StatusController.java +++ b/proxies/norg2-proxy/src/main/java/no/nav/testnav/proxies/norg2proxy/StatusController.java @@ -1,5 +1,6 @@ package no.nav.testnav.proxies.norg2proxy; +import no.nav.testnav.libs.dto.status.v1.TestnavStatusResponse; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -7,33 +8,39 @@ import reactor.core.publisher.Mono; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; @RestController public class StatusController { private static final String TEAM = "norg2"; @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - public Map> getStatus() { + public Map getStatus() { var statusWebClient = WebClient.builder().build(); var pensjonStatus = checkConsumerStatus( "http://norg2.org.svc.nais.local/norg2/internal/isAlive", "http://norg2.org.svc.nais.local/norg2/internal/isReady", statusWebClient); - pensjonStatus.put("team", TEAM); return Map.of( "norg2", pensjonStatus ); } - public Map checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - ConcurrentHashMap status = new ConcurrentHashMap<>(); + public TestnavStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + TestnavStatusResponse status = TestnavStatusResponse.builder().team(TEAM).build(); Thread blockingThread = new Thread(() -> { - status.put("alive", checkStatus(webClient, aliveUrl).block()); - status.put("ready", checkStatus(webClient, readyUrl).block()); + status.setAlive( + checkStatus(webClient, aliveUrl) + .blockOptional() + .orElse("Error: Empty response") + ); + status.setReady( + checkStatus(webClient, readyUrl) + .blockOptional() + .orElse("Error: Empty response") + ); }); blockingThread.start(); try { @@ -46,12 +53,12 @@ public Map checkConsumerStatus(String aliveUrl, String readyUrl, } private Mono checkStatus(WebClient webClient, String url) { - return webClient.get().uri(url) - .retrieve() - .bodyToMono(String.class) - .defaultIfEmpty("OK") - .onErrorResume(Exception.class, error -> Mono.just("Error: " + error.getMessage())) - .doOnSuccess(result -> Mono.just("OK")) - .map(result -> result.startsWith("Error:") ? result : "OK"); + return webClient.get().uri(url) + .retrieve() + .bodyToMono(String.class) + .defaultIfEmpty("OK") + .onErrorResume(Exception.class, error -> Mono.just("Error: " + error.getMessage())) + .doOnSuccess(result -> Mono.just("OK")) + .map(result -> result.startsWith("Error:") ? result : "OK"); } } diff --git a/proxies/pdl-proxy/src/main/java/no/nav/testnav/proxies/pdlproxy/StatusController.java b/proxies/pdl-proxy/src/main/java/no/nav/testnav/proxies/pdlproxy/StatusController.java index e904f0aa4f6..127551635ec 100644 --- a/proxies/pdl-proxy/src/main/java/no/nav/testnav/proxies/pdlproxy/StatusController.java +++ b/proxies/pdl-proxy/src/main/java/no/nav/testnav/proxies/pdlproxy/StatusController.java @@ -1,6 +1,6 @@ package no.nav.testnav.proxies.pdlproxy; -import no.nav.testnav.libs.dto.status.v1.DollyStatusResponse; +import no.nav.testnav.libs.dto.status.v1.TestnavStatusResponse; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -14,7 +14,7 @@ public class StatusController { private static final String TEAM_PDL = "Team Persondata"; @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - public Map getStatus() { + public Map getStatus() { var pdlTestdataStatus = checkConsumerStatus( "https://pdl-testdata.dev.intern.nav.no/internal/health/liveness", @@ -50,8 +50,8 @@ public Map getStatus() { ); } - public DollyStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - DollyStatusResponse status = DollyStatusResponse.builder().team(TEAM_PDL).build(); + public TestnavStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + TestnavStatusResponse status = TestnavStatusResponse.builder().team(TEAM_PDL).build(); Thread blockingThread = new Thread(() -> { status.setAlive(checkStatus(webClient, aliveUrl).block()); diff --git a/proxies/pensjon-testdata-facade-proxy/build.gradle b/proxies/pensjon-testdata-facade-proxy/build.gradle index 07bb79a6609..373abc66a22 100644 --- a/proxies/pensjon-testdata-facade-proxy/build.gradle +++ b/proxies/pensjon-testdata-facade-proxy/build.gradle @@ -53,6 +53,7 @@ dependencies { implementation 'no.nav.testnav.libs:reactive-core' implementation 'no.nav.testnav.libs:reactive-proxy' implementation 'no.nav.testnav.libs:reactive-security' + implementation 'no.nav.testnav.libs:data-transfer-objects' implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' implementation 'org.springframework.boot:spring-boot-starter-webflux' diff --git a/proxies/pensjon-testdata-facade-proxy/settings.gradle b/proxies/pensjon-testdata-facade-proxy/settings.gradle index 8926eff3167..15bcb0c695a 100644 --- a/proxies/pensjon-testdata-facade-proxy/settings.gradle +++ b/proxies/pensjon-testdata-facade-proxy/settings.gradle @@ -9,6 +9,7 @@ includeBuild '../../libs/reactive-core' includeBuild '../../libs/reactive-proxy' includeBuild '../../libs/security-core' includeBuild '../../libs/reactive-security' +includeBuild '../../libs/data-transfer-objects' gradleEnterprise { buildScan { diff --git a/proxies/pensjon-testdata-facade-proxy/src/main/java/no/nav/testnav/proxies/pensjontestdatafacadeproxy/StatusController.java b/proxies/pensjon-testdata-facade-proxy/src/main/java/no/nav/testnav/proxies/pensjontestdatafacadeproxy/StatusController.java index 9196eeaee3c..497bef923ca 100644 --- a/proxies/pensjon-testdata-facade-proxy/src/main/java/no/nav/testnav/proxies/pensjontestdatafacadeproxy/StatusController.java +++ b/proxies/pensjon-testdata-facade-proxy/src/main/java/no/nav/testnav/proxies/pensjontestdatafacadeproxy/StatusController.java @@ -1,5 +1,6 @@ package no.nav.testnav.proxies.pensjontestdatafacadeproxy; +import no.nav.testnav.libs.dto.status.v1.TestnavStatusResponse; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -14,55 +15,34 @@ public class StatusController { private static final String TEAM_PENSJON_TESTDATA = "Team Pentek (pensjontestdata)"; @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - public Map> getStatus() { + public Map getStatus() { var statusWebClient = WebClient.builder().build(); var pensjonStatus = checkConsumerStatus( "https://pensjon-testdata-facade.dev.adeo.no/isAlive", "https://pensjon-testdata-facade.dev.adeo.no/isReady", statusWebClient); - pensjonStatus.put("team", TEAM_PENSJON_TESTDATA); - var additionalStatus = additionalConsumerStatus( - "https://pensjon-testdata-facade.pensjontestdata.svc.nais.local/api/v1/status", statusWebClient); - - var statusMap = new ConcurrentHashMap>(); + var statusMap = new ConcurrentHashMap(); statusMap.put("pensjon-testdata", pensjonStatus); - statusMap.putAll(additionalStatus); return statusMap; } - public Map> additionalConsumerStatus(String url, WebClient webClient) { - ConcurrentHashMap> status = new ConcurrentHashMap<>(); - - Thread blockingThread = new Thread(() -> { - try { - Map response = webClient.get() - .uri(url) - .retrieve() - .bodyToMono(Map.class) - .block(); - status.putAll(response); - } catch (Exception e) { - } - }); - blockingThread.start(); - try { - blockingThread.join(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - - return status; - } - - public Map checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - ConcurrentHashMap status = new ConcurrentHashMap<>(); + public TestnavStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + TestnavStatusResponse status = TestnavStatusResponse.builder().team(TEAM_PENSJON_TESTDATA).build(); Thread blockingThread = new Thread(() -> { - status.put("alive", checkStatus(webClient, aliveUrl).block()); - status.put("ready", checkStatus(webClient, readyUrl).block()); + status.setAlive( + checkStatus(webClient, aliveUrl) + .blockOptional() + .orElse("Error: Empty response") + ); + status.setReady( + checkStatus(webClient, readyUrl) + .blockOptional() + .orElse("Error: Empty response") + ); }); blockingThread.start(); try { @@ -75,11 +55,11 @@ public Map checkConsumerStatus(String aliveUrl, String readyUrl, } private Mono checkStatus(WebClient webClient, String url) { - return webClient.get().uri(url) - .retrieve() - .bodyToMono(String.class) - .defaultIfEmpty("OK") - .onErrorResume(Exception.class, error -> Mono.just("Error: " + error.getMessage())) - .map(result -> result.startsWith("Error:") ? result : "OK"); + return webClient.get().uri(url) + .retrieve() + .bodyToMono(String.class) + .defaultIfEmpty("OK") + .onErrorResume(Exception.class, error -> Mono.just("Error: " + error.getMessage())) + .map(result -> result.startsWith("Error:") ? result : "OK"); } -} +} \ No newline at end of file diff --git a/proxies/saf-proxy/src/main/java/no/nav/testnav/proxies/safproxy/StatusController.java b/proxies/saf-proxy/src/main/java/no/nav/testnav/proxies/safproxy/StatusController.java index c02ad9d79a8..97110f2743c 100644 --- a/proxies/saf-proxy/src/main/java/no/nav/testnav/proxies/safproxy/StatusController.java +++ b/proxies/saf-proxy/src/main/java/no/nav/testnav/proxies/safproxy/StatusController.java @@ -1,6 +1,6 @@ package no.nav.testnav.proxies.safproxy; -import no.nav.testnav.libs.dto.status.v1.DollyStatusResponse; +import no.nav.testnav.libs.dto.status.v1.TestnavStatusResponse; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -16,7 +16,7 @@ public class StatusController { private static final String TEAM = "teamdokumenthandtering"; @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - public Map getStatus() { + public Map getStatus() { var statusWebClient = WebClient.builder().build(); return Stream.of("q1", "q2", "q4", "q5", "t3") @@ -34,8 +34,8 @@ public Map getStatus() { .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); } - public DollyStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - DollyStatusResponse status = DollyStatusResponse.builder().team(TEAM).build(); + public TestnavStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + TestnavStatusResponse status = TestnavStatusResponse.builder().team(TEAM).build(); Thread blockingThread = new Thread(() -> { status.setAlive(checkStatus(webClient, aliveUrl).block()); diff --git a/proxies/sigrunstub-proxy/build.gradle b/proxies/sigrunstub-proxy/build.gradle index 8018f2aae7d..bdc539611aa 100644 --- a/proxies/sigrunstub-proxy/build.gradle +++ b/proxies/sigrunstub-proxy/build.gradle @@ -51,6 +51,7 @@ dependencies { implementation 'no.nav.testnav.libs:reactive-core' implementation 'no.nav.testnav.libs:reactive-proxy' + implementation 'no.nav.testnav.libs:data-transfer-objects' implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' implementation 'org.springframework.boot:spring-boot-starter-webflux' diff --git a/proxies/sigrunstub-proxy/settings.gradle b/proxies/sigrunstub-proxy/settings.gradle index 947630925f0..f575987ded5 100644 --- a/proxies/sigrunstub-proxy/settings.gradle +++ b/proxies/sigrunstub-proxy/settings.gradle @@ -7,6 +7,7 @@ rootProject.name = 'sigrunstub-proxy' includeBuild '../../libs/reactive-core' includeBuild '../../libs/reactive-proxy' +includeBuild '../../libs/data-transfer-objects' gradleEnterprise { buildScan { diff --git a/proxies/sigrunstub-proxy/src/main/java/no/nav/testnav/proxies/sigrunstubproxy/StatusController.java b/proxies/sigrunstub-proxy/src/main/java/no/nav/testnav/proxies/sigrunstubproxy/StatusController.java index f3598329cba..9c49b6887c8 100644 --- a/proxies/sigrunstub-proxy/src/main/java/no/nav/testnav/proxies/sigrunstubproxy/StatusController.java +++ b/proxies/sigrunstub-proxy/src/main/java/no/nav/testnav/proxies/sigrunstubproxy/StatusController.java @@ -1,5 +1,6 @@ package no.nav.testnav.proxies.sigrunstubproxy; +import no.nav.testnav.libs.dto.status.v1.TestnavStatusResponse; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -7,33 +8,39 @@ import reactor.core.publisher.Mono; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; @RestController public class StatusController { private static final String TEAM_INNTEKT = "Team Inntekt"; @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - public Map> getStatus() { + public Map getStatus() { var statusWebClient = WebClient.builder().build(); var pensjonStatus = checkConsumerStatus( "http://sigrun-skd-stub.team-inntekt.svc.nais.local/internal/isAlive", "http://sigrun-skd-stub.team-inntekt.svc.nais.local/internal/isAlive", // samme url brukes for begge statusWebClient); - pensjonStatus.put("team", TEAM_INNTEKT); return Map.of( "sigrun-skd-stub", pensjonStatus ); } - public Map checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - ConcurrentHashMap status = new ConcurrentHashMap<>(); + public TestnavStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + TestnavStatusResponse status = TestnavStatusResponse.builder().team(TEAM_INNTEKT).build(); Thread blockingThread = new Thread(() -> { - status.put("alive", checkStatus(webClient, aliveUrl).block()); - status.put("ready", checkStatus(webClient, readyUrl).block()); + status.setAlive( + checkStatus(webClient, aliveUrl) + .blockOptional() + .orElse("Error: Empty response") + ); + status.setReady( + checkStatus(webClient, readyUrl) + .blockOptional() + .orElse("Error: Empty response") + ); }); blockingThread.start(); try { @@ -54,4 +61,4 @@ private Mono checkStatus(WebClient webClient, String url) { .doOnSuccess(result -> Mono.just("OK")) .map(result -> result.startsWith("Error:") ? result : "OK"); } -} +} \ No newline at end of file diff --git a/proxies/skjermingsregister-proxy/build.gradle b/proxies/skjermingsregister-proxy/build.gradle index 8a7840726b6..788fc3cd5d2 100644 --- a/proxies/skjermingsregister-proxy/build.gradle +++ b/proxies/skjermingsregister-proxy/build.gradle @@ -54,6 +54,7 @@ dependencies { implementation 'no.nav.testnav.libs:reactive-core' implementation 'no.nav.testnav.libs:reactive-proxy' implementation 'no.nav.testnav.libs:security-token-service' + implementation 'no.nav.testnav.libs:data-transfer-objects' implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' implementation 'org.springframework.boot:spring-boot-starter-webflux' diff --git a/proxies/skjermingsregister-proxy/settings.gradle b/proxies/skjermingsregister-proxy/settings.gradle index 7dfa1b1fdff..6a11731d7c1 100644 --- a/proxies/skjermingsregister-proxy/settings.gradle +++ b/proxies/skjermingsregister-proxy/settings.gradle @@ -8,6 +8,7 @@ rootProject.name = 'skjermingsregister-proxy' includeBuild '../../libs/reactive-core' includeBuild '../../libs/reactive-proxy' includeBuild '../../libs/security-token-service' +includeBuild '../../libs/data-transfer-objects' gradleEnterprise { buildScan { diff --git a/proxies/skjermingsregister-proxy/src/main/java/no/nav/testnav/proxies/skjermingsregisterproxy/StatusController.java b/proxies/skjermingsregister-proxy/src/main/java/no/nav/testnav/proxies/skjermingsregisterproxy/StatusController.java index 9bdcf6ae5d2..5fcaa1b4ac8 100644 --- a/proxies/skjermingsregister-proxy/src/main/java/no/nav/testnav/proxies/skjermingsregisterproxy/StatusController.java +++ b/proxies/skjermingsregister-proxy/src/main/java/no/nav/testnav/proxies/skjermingsregisterproxy/StatusController.java @@ -1,5 +1,6 @@ package no.nav.testnav.proxies.skjermingsregisterproxy; +import no.nav.testnav.libs.dto.status.v1.TestnavStatusResponse; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -7,33 +8,39 @@ import reactor.core.publisher.Mono; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; @RestController public class StatusController { private static final String TEAM = "Team Org (NOM)"; @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - public Map> getStatus() { + public Map getStatus() { var statusWebClient = WebClient.builder().build(); var status = checkConsumerStatus( "http://skjermede-personer.nom.svc.nais.local" + "/internal/isAlive", "http://skjermede-personer.nom.svc.nais.local" + "/internal/isReady", statusWebClient); - status.put("team", TEAM); return Map.of( "skjermede-personer", status ); } - public Map checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - ConcurrentHashMap status = new ConcurrentHashMap<>(); + public TestnavStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + TestnavStatusResponse status = TestnavStatusResponse.builder().team(TEAM).build(); Thread blockingThread = new Thread(() -> { - status.put("alive", checkStatus(webClient, aliveUrl).block()); - status.put("ready", checkStatus(webClient, readyUrl).block()); + status.setAlive( + checkStatus(webClient, aliveUrl) + .blockOptional() + .orElse("Error: Empty response") + ); + status.setReady( + checkStatus(webClient, readyUrl) + .blockOptional() + .orElse("Error: Empty response") + ); }); blockingThread.start(); try { diff --git a/proxies/statisk-data-forvalter-proxy/build.gradle b/proxies/statisk-data-forvalter-proxy/build.gradle index 54247a1d4df..efdb343cb30 100644 --- a/proxies/statisk-data-forvalter-proxy/build.gradle +++ b/proxies/statisk-data-forvalter-proxy/build.gradle @@ -54,6 +54,7 @@ dependencies { implementation 'no.nav.testnav.libs:reactive-core' implementation 'no.nav.testnav.libs:reactive-proxy' implementation 'no.nav.testnav.libs:reactive-security' + implementation 'no.nav.testnav.libs:data-transfer-objects' implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' implementation 'org.springframework.boot:spring-boot-starter-webflux' diff --git a/proxies/statisk-data-forvalter-proxy/settings.gradle b/proxies/statisk-data-forvalter-proxy/settings.gradle index 28be8cd20bf..05588c69ea3 100644 --- a/proxies/statisk-data-forvalter-proxy/settings.gradle +++ b/proxies/statisk-data-forvalter-proxy/settings.gradle @@ -9,6 +9,7 @@ includeBuild '../../libs/security-core' includeBuild '../../libs/reactive-core' includeBuild '../../libs/reactive-proxy' includeBuild '../../libs/reactive-security' +includeBuild '../../libs/data-transfer-objects' gradleEnterprise { buildScan { diff --git a/proxies/statisk-data-forvalter-proxy/src/main/java/no/nav/testnav/proxies/statiskdataforvalterproxy/StatusController.java b/proxies/statisk-data-forvalter-proxy/src/main/java/no/nav/testnav/proxies/statiskdataforvalterproxy/StatusController.java index 1040260149f..e73d70ea184 100644 --- a/proxies/statisk-data-forvalter-proxy/src/main/java/no/nav/testnav/proxies/statiskdataforvalterproxy/StatusController.java +++ b/proxies/statisk-data-forvalter-proxy/src/main/java/no/nav/testnav/proxies/statiskdataforvalterproxy/StatusController.java @@ -1,5 +1,6 @@ package no.nav.testnav.proxies.statiskdataforvalterproxy; +import no.nav.testnav.libs.dto.status.v1.TestnavStatusResponse; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -7,33 +8,39 @@ import reactor.core.publisher.Mono; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; @RestController public class StatusController { private static final String TEAM = "Team Dolly"; @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - public Map> getStatus() { + public Map getStatus() { var statusWebClient = WebClient.builder().build(); var status = checkConsumerStatus( "http://testnorge-statisk-data-forvalter.dolly.svc.nais.local" + "/internal/isAlive", "http://testnorge-statisk-data-forvalter.dolly.svc.nais.local" + "/internal/isReady", statusWebClient); - status.put("team", TEAM); return Map.of( "testnorge-statisk-data-forvalter", status ); } - public Map checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - ConcurrentHashMap status = new ConcurrentHashMap<>(); + public TestnavStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + TestnavStatusResponse status = TestnavStatusResponse.builder().team(TEAM).build(); Thread blockingThread = new Thread(() -> { - status.put("alive", checkStatus(webClient, aliveUrl).block()); - status.put("ready", checkStatus(webClient, readyUrl).block()); + status.setAlive( + checkStatus(webClient, aliveUrl) + .blockOptional() + .orElse("Error: Empty response") + ); + status.setReady( + checkStatus(webClient, readyUrl) + .blockOptional() + .orElse("Error: Empty response") + ); }); blockingThread.start(); try { diff --git a/proxies/sykemelding-api-proxy/build.gradle b/proxies/sykemelding-api-proxy/build.gradle index faeadb3c20d..8d19a592e24 100644 --- a/proxies/sykemelding-api-proxy/build.gradle +++ b/proxies/sykemelding-api-proxy/build.gradle @@ -54,6 +54,7 @@ dependencies { implementation 'no.nav.testnav.libs:reactive-core' implementation 'no.nav.testnav.libs:reactive-proxy' implementation 'no.nav.testnav.libs:reactive-security' + implementation 'no.nav.testnav.libs:data-transfer-objects' implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' implementation 'org.springframework.boot:spring-boot-starter-webflux' diff --git a/proxies/sykemelding-api-proxy/settings.gradle b/proxies/sykemelding-api-proxy/settings.gradle index 34953ff76d4..ae470f88015 100644 --- a/proxies/sykemelding-api-proxy/settings.gradle +++ b/proxies/sykemelding-api-proxy/settings.gradle @@ -9,6 +9,7 @@ includeBuild '../../libs/reactive-core' includeBuild '../../libs/reactive-proxy' includeBuild '../../libs/reactive-security' includeBuild '../../libs/security-core' +includeBuild '../../libs/data-transfer-objects' gradleEnterprise { buildScan { diff --git a/proxies/sykemelding-api-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingapiproxy/StatusController.java b/proxies/sykemelding-api-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingapiproxy/StatusController.java index 8b191956e8f..a0b0f2d6dbc 100644 --- a/proxies/sykemelding-api-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingapiproxy/StatusController.java +++ b/proxies/sykemelding-api-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingapiproxy/StatusController.java @@ -1,5 +1,6 @@ package no.nav.testnav.proxies.sykemeldingapiproxy; +import no.nav.testnav.libs.dto.status.v1.TestnavStatusResponse; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -7,33 +8,39 @@ import reactor.core.publisher.Mono; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; @RestController public class StatusController { private static final String TEAM = "Team Dolly"; @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - public Map> getStatus() { + public Map getStatus() { var statusWebClient = WebClient.builder().build(); var status = checkConsumerStatus( "http://testnorge-sykemelding-api.dolly.svc.nais.local" + "/internal/isAlive", "http://testnorge-sykemelding-api.dolly.svc.nais.local" + "/internal/isReady", statusWebClient); - status.put("team", TEAM); return Map.of( "testnorge-sykemelding-api", status ); } - public Map checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - ConcurrentHashMap status = new ConcurrentHashMap<>(); + public TestnavStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + TestnavStatusResponse status = TestnavStatusResponse.builder().team(TEAM).build(); Thread blockingThread = new Thread(() -> { - status.put("alive", checkStatus(webClient, aliveUrl).block()); - status.put("ready", checkStatus(webClient, readyUrl).block()); + status.setAlive( + checkStatus(webClient, aliveUrl) + .blockOptional() + .orElse("Error: Empty response") + ); + status.setReady( + checkStatus(webClient, readyUrl) + .blockOptional() + .orElse("Error: Empty response") + ); }); blockingThread.start(); try { diff --git a/proxies/synthdata-meldekort-proxy/build.gradle b/proxies/synthdata-meldekort-proxy/build.gradle index b49aa37e9b1..e88298bf237 100644 --- a/proxies/synthdata-meldekort-proxy/build.gradle +++ b/proxies/synthdata-meldekort-proxy/build.gradle @@ -59,6 +59,7 @@ dependencies { implementation 'no.nav.testnav.libs:reactive-core' implementation 'no.nav.testnav.libs:reactive-proxy' implementation 'no.nav.testnav.libs:reactive-security' + implementation 'no.nav.testnav.libs:data-transfer-objects' implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' implementation 'org.springframework.boot:spring-boot-starter-webflux' diff --git a/proxies/synthdata-meldekort-proxy/settings.gradle b/proxies/synthdata-meldekort-proxy/settings.gradle index a4c6d065f66..2dfd6fc6538 100644 --- a/proxies/synthdata-meldekort-proxy/settings.gradle +++ b/proxies/synthdata-meldekort-proxy/settings.gradle @@ -9,6 +9,7 @@ includeBuild '../../libs/reactive-core' includeBuild '../../libs/reactive-proxy' includeBuild '../../libs/security-core' includeBuild '../../libs/reactive-security' +includeBuild '../../libs/data-transfer-objects' gradleEnterprise { buildScan { diff --git a/proxies/synthdata-meldekort-proxy/src/main/java/no/nav/testnav/proxies/synthdatameldekortproxy/StatusController.java b/proxies/synthdata-meldekort-proxy/src/main/java/no/nav/testnav/proxies/synthdatameldekortproxy/StatusController.java index eef5b06e854..d95f8c267ec 100644 --- a/proxies/synthdata-meldekort-proxy/src/main/java/no/nav/testnav/proxies/synthdatameldekortproxy/StatusController.java +++ b/proxies/synthdata-meldekort-proxy/src/main/java/no/nav/testnav/proxies/synthdatameldekortproxy/StatusController.java @@ -1,7 +1,7 @@ package no.nav.testnav.proxies.synthdatameldekortproxy; +import no.nav.testnav.libs.dto.status.v1.TestnavStatusResponse; import no.nav.testnav.proxies.synthdatameldekortproxy.config.credentials.SyntMeldekortProperties; -import org.springframework.beans.factory.annotation.Value; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -9,7 +9,6 @@ import reactor.core.publisher.Mono; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; @RestController public class StatusController { @@ -22,26 +21,33 @@ public StatusController(SyntMeldekortProperties properties) { } @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - public Map> getStatus() { + public Map getStatus() { var statusWebClient = WebClient.builder().build(); var status = checkConsumerStatus( url + "/internal/isAlive", url + "/internal/isReady", statusWebClient); - status.put("team", TEAM); return Map.of( "synthdata-arena-meldekort", status ); } - public Map checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - ConcurrentHashMap status = new ConcurrentHashMap<>(); + public TestnavStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + TestnavStatusResponse status = TestnavStatusResponse.builder().team(TEAM).build(); Thread blockingThread = new Thread(() -> { - status.put("alive", checkStatus(webClient, aliveUrl).block()); - status.put("ready", checkStatus(webClient, readyUrl).block()); + status.setAlive( + checkStatus(webClient, aliveUrl) + .blockOptional() + .orElse("Error: Empty response") + ); + status.setReady( + checkStatus(webClient, readyUrl) + .blockOptional() + .orElse("Error: Empty response") + ); }); blockingThread.start(); try { diff --git a/proxies/tps-forvalteren-proxy/build.gradle b/proxies/tps-forvalteren-proxy/build.gradle index 9e30241ab83..8cfda235d5d 100644 --- a/proxies/tps-forvalteren-proxy/build.gradle +++ b/proxies/tps-forvalteren-proxy/build.gradle @@ -54,6 +54,7 @@ dependencies { implementation 'no.nav.testnav.libs:reactive-core' implementation 'no.nav.testnav.libs:reactive-proxy' + implementation 'no.nav.testnav.libs:data-transfer-objects' implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' implementation 'org.springframework.boot:spring-boot-starter-webflux' diff --git a/proxies/tps-forvalteren-proxy/settings.gradle b/proxies/tps-forvalteren-proxy/settings.gradle index 74055895c70..d839ff76aef 100644 --- a/proxies/tps-forvalteren-proxy/settings.gradle +++ b/proxies/tps-forvalteren-proxy/settings.gradle @@ -7,6 +7,7 @@ rootProject.name = 'tps-forvalteren-proxy' includeBuild '../../libs/reactive-core' includeBuild '../../libs/reactive-proxy' +includeBuild '../../libs/data-transfer-objects' gradleEnterprise { buildScan { diff --git a/proxies/tps-forvalteren-proxy/src/main/java/no/nav/testnav/proxies/tpsforvalterenproxy/StatusController.java b/proxies/tps-forvalteren-proxy/src/main/java/no/nav/testnav/proxies/tpsforvalterenproxy/StatusController.java index e83f7a408de..4f52169606d 100644 --- a/proxies/tps-forvalteren-proxy/src/main/java/no/nav/testnav/proxies/tpsforvalterenproxy/StatusController.java +++ b/proxies/tps-forvalteren-proxy/src/main/java/no/nav/testnav/proxies/tpsforvalterenproxy/StatusController.java @@ -1,5 +1,6 @@ package no.nav.testnav.proxies.tpsforvalterenproxy; +import no.nav.testnav.libs.dto.status.v1.TestnavStatusResponse; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; @@ -8,7 +9,6 @@ import reactor.core.publisher.Mono; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; @RestController public class StatusController { @@ -18,26 +18,33 @@ public class StatusController { private String url; @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - public Map> getStatus() { + public Map getStatus() { var statusWebClient = WebClient.builder().build(); var status = checkConsumerStatus( url + "/internal/isAlive", url + "/internal/isReady", statusWebClient); - status.put("team", TEAM); return Map.of( "tps-forvalteren", status ); } - public Map checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - ConcurrentHashMap status = new ConcurrentHashMap<>(); + public TestnavStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + TestnavStatusResponse status = TestnavStatusResponse.builder().team(TEAM).build(); Thread blockingThread = new Thread(() -> { - status.put("alive", checkStatus(webClient, aliveUrl).block()); - status.put("ready", checkStatus(webClient, readyUrl).block()); + status.setAlive( + checkStatus(webClient, aliveUrl) + .blockOptional() + .orElse("Error: Empty response") + ); + status.setReady( + checkStatus(webClient, readyUrl) + .blockOptional() + .orElse("Error: Empty response") + ); }); blockingThread.start(); try { diff --git a/proxies/udistub-proxy/build.gradle b/proxies/udistub-proxy/build.gradle index b308b1480b6..b9232ecd085 100644 --- a/proxies/udistub-proxy/build.gradle +++ b/proxies/udistub-proxy/build.gradle @@ -54,6 +54,7 @@ dependencies { implementation 'no.nav.testnav.libs:reactive-core' implementation 'no.nav.testnav.libs:reactive-proxy' implementation 'no.nav.testnav.libs:reactive-security' + implementation 'no.nav.testnav.libs:data-transfer-objects' implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' implementation 'org.springframework.boot:spring-boot-starter-webflux' diff --git a/proxies/udistub-proxy/settings.gradle b/proxies/udistub-proxy/settings.gradle index c4825f0c989..37bbb98f5f7 100644 --- a/proxies/udistub-proxy/settings.gradle +++ b/proxies/udistub-proxy/settings.gradle @@ -9,6 +9,7 @@ includeBuild '../../libs/reactive-core' includeBuild '../../libs/reactive-proxy' includeBuild '../../libs/security-core' includeBuild '../../libs/reactive-security' +includeBuild '../../libs/data-transfer-objects' gradleEnterprise { buildScan { diff --git a/proxies/udistub-proxy/src/main/java/no/nav/testnav/proxies/udistubproxy/StatusController.java b/proxies/udistub-proxy/src/main/java/no/nav/testnav/proxies/udistubproxy/StatusController.java index 9d81e42229b..9fe7f992076 100644 --- a/proxies/udistub-proxy/src/main/java/no/nav/testnav/proxies/udistubproxy/StatusController.java +++ b/proxies/udistub-proxy/src/main/java/no/nav/testnav/proxies/udistubproxy/StatusController.java @@ -1,5 +1,6 @@ package no.nav.testnav.proxies.udistubproxy; +import no.nav.testnav.libs.dto.status.v1.TestnavStatusResponse; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -7,33 +8,39 @@ import reactor.core.publisher.Mono; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; @RestController public class StatusController { private static final String TEAM = "orkestrator"; @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - public Map> getStatus() { + public Map getStatus() { var statusWebClient = WebClient.builder().build(); var status = checkConsumerStatus( "http://udi-stub.dev.intern.nav.no/internal/isAlive", "http://udi-stub.dev.intern.nav.no/internal/isReady", statusWebClient); - status.put("team", TEAM); return Map.of( "udi-stub", status ); } - public Map checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { - ConcurrentHashMap status = new ConcurrentHashMap<>(); + public TestnavStatusResponse checkConsumerStatus(String aliveUrl, String readyUrl, WebClient webClient) { + TestnavStatusResponse status = TestnavStatusResponse.builder().team(TEAM).build(); Thread blockingThread = new Thread(() -> { - status.put("alive", checkStatus(webClient, aliveUrl).block()); - status.put("ready", checkStatus(webClient, readyUrl).block()); + status.setAlive( + checkStatus(webClient, aliveUrl) + .blockOptional() + .orElse("Error: Empty response") + ); + status.setReady( + checkStatus(webClient, readyUrl) + .blockOptional() + .orElse("Error: Empty response") + ); }); blockingThread.start(); try { From 28e5cf5e610a7891640022240299a352097a4f4d Mon Sep 17 00:00:00 2001 From: Betsy Carina Traran Date: Thu, 17 Aug 2023 08:54:30 +0200 Subject: [PATCH 11/22] Fix bostedskommune --- .../kriterier/BestillingKriterieMapper.tsx | 8 +++-- .../pdlf/visning/partials/UkjentBosted.tsx | 4 ++- .../ui/form/inputs/select/Select.tsx | 32 +++++++++++++++---- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/apps/dolly-frontend/src/main/js/src/components/bestilling/sammendrag/kriterier/BestillingKriterieMapper.tsx b/apps/dolly-frontend/src/main/js/src/components/bestilling/sammendrag/kriterier/BestillingKriterieMapper.tsx index 10031aaa3b0..d8000437e6a 100644 --- a/apps/dolly-frontend/src/main/js/src/components/bestilling/sammendrag/kriterier/BestillingKriterieMapper.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/bestilling/sammendrag/kriterier/BestillingKriterieMapper.tsx @@ -438,7 +438,7 @@ const mapBostedsadresse = (bostedsadresse, data) => { return [ { numberHeader: `Bostedsadresse ${idx + 1}: Ukjent bosted` }, obj('Ukjent bosted', adresseVerdi(adresseData)), - obj('Bostedskommune', adresseData.bostedskommune), + obj('Bostedskommune', adresseData.bostedskommune, AdresseKodeverk.Kommunenummer), ...datoer(item), ...coAdresse(item.opprettCoAdresseNavn), ] @@ -643,7 +643,11 @@ const deltBosted = (personData, path) => { return [ expandable('DELT BOSTED', !isEmpty(deltBostedData), [ ...fellesVerdier, - obj('Bostedskommune', deltBostedData.ukjentBosted.bostedskommune), + obj( + 'Bostedskommune', + deltBostedData.ukjentBosted.bostedskommune, + AdresseKodeverk.Kommunenummer, + ), ]), ] } else { diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/UkjentBosted.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/UkjentBosted.tsx index 34a4b622ffa..d4dd6b6e818 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/UkjentBosted.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/visning/partials/UkjentBosted.tsx @@ -1,5 +1,6 @@ import { TitleValue } from '@/components/ui/titleValue/TitleValue' import { formatDate } from '@/utils/DataFormatter' +import { AdresseKodeverk } from '@/config/kodeverk' type AdresseData = { adresse: { @@ -24,7 +25,7 @@ export const UkjentBosted = ({ adresse, idx }: AdresseData) => { startdatoForKontrakt, sluttdatoForKontrakt, coAdressenavn, - metadata + metadata, } = adresse const master = metadata?.master @@ -36,6 +37,7 @@ export const UkjentBosted = ({ adresse, idx }: AdresseData) => { 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 72d6147195d..5adf5d7d8c2 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 @@ -9,6 +9,7 @@ import KodeverkConnector from '@/components/kodeverk/KodeverkConnector' import './Select.less' import MenuList from '@/components/ui/form/inputs/select/MenuList' import Option from '@/components/ui/form/inputs/select/Option' +import * as _ from 'lodash-es' type SelectProps = { id?: string @@ -83,13 +84,30 @@ export const Select = ({ ) } -export const SelectMedKodeverk = ({ kodeverk, isLoading, ...rest }: SelectProps) => ( - - {(kodeverkVerdier) => ( - + )} + + ) +} export const DollySelect = (props: SelectProps) => ( From 8e13aed3370a99ebd48c67cac880d4fcbdb10eb8 Mon Sep 17 00:00:00 2001 From: kristenhaerum Date: Thu, 17 Aug 2023 08:55:25 +0200 Subject: [PATCH 12/22] =?UTF-8?q?Fiks=20for=20=C3=A5=20lage=20ugyldig=20ad?= =?UTF-8?q?resse?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../consumer/AdresseServiceConsumer.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/consumer/AdresseServiceConsumer.java b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/consumer/AdresseServiceConsumer.java index 776d67395ab..8a6e4173bcc 100644 --- a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/consumer/AdresseServiceConsumer.java +++ b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/consumer/AdresseServiceConsumer.java @@ -9,9 +9,9 @@ import no.nav.testnav.libs.securitycore.domain.ServerProperties; import no.nav.testnav.libs.servletsecurity.exchange.TokenExchange; import org.springframework.stereotype.Service; - import org.springframework.web.reactive.function.client.WebClient; +import java.util.Arrays; import java.util.stream.Stream; import static java.lang.System.currentTimeMillis; @@ -20,6 +20,7 @@ @Service public class AdresseServiceConsumer { + private static final String UOPPGITT = "9999"; private final WebClient webClient; private final TokenExchange tokenExchange; private final ServerProperties properties; @@ -39,6 +40,21 @@ public no.nav.testnav.libs.dto.adresseservice.v1.VegadresseDTO getVegadresse(Veg var startTime = currentTimeMillis(); + if (UOPPGITT.equals(vegadresse.getKommunenummer())) { + var adresser = tokenExchange.exchange(properties) + .flatMap(token -> new VegadresseServiceCommand(webClient, new VegadresseDTO(), null, token.getTokenValue()).call()) + .block(); + + return no.nav.testnav.libs.dto.adresseservice.v1.VegadresseDTO.builder() + .postnummer(Arrays.stream(adresser) + .findFirst() + .orElse(no.nav.testnav.libs.dto.adresseservice.v1.VegadresseDTO.builder() + .postnummer("9999") + .build()) + .getPostnummer()) + .build(); + } + var adresser = tokenExchange.exchange(properties).flatMap( token -> new VegadresseServiceCommand(webClient, vegadresse, matrikkelId, token.getTokenValue()).call()) .block(); From 78fb63e493d6476ca0ac3e4d9cdeac7aa4d9efb2 Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 17 Aug 2023 13:23:17 +0200 Subject: [PATCH 13/22] Timezone fix for dato #deploy-test-frontend --- .../ui/form/inputs/datepicker/Datepicker.tsx | 10 +++++++- .../ui/form/inputs/timepicker/Timepicker.tsx | 23 ++++++++++++++++--- 2 files changed, 29 insertions(+), 4 deletions(-) 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 167c21f9c2d..3a2354d5c2a 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 @@ -17,6 +17,14 @@ function addHours(date, amount) { return date } +const fixTimezone = (date: Date) => { + if (!date) { + return null + } + const tzoffset = new Date().getTimezoneOffset() * 60000 //offset in milliseconds + return new Date(date.getTime() - tzoffset) +} + export const Datepicker = ({ name, value, @@ -69,7 +77,7 @@ const P_FormikDatepicker = ({ fastfield, addHour = false, ...props }) => ( form.setFieldTouched(props.name) // Need to trigger touched manually for Datepicker if (props.afterChange) props.afterChange(date) - let val = date + let val = fixTimezone(date).toISOString().substring(0, 19) if (addHour) { val = addHours(new Date(date), 1).toISOString().substring(0, 19) } diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/timepicker/Timepicker.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/timepicker/Timepicker.tsx index ff22095f6ed..f50170919d5 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/timepicker/Timepicker.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/timepicker/Timepicker.tsx @@ -11,6 +11,21 @@ import 'react-datepicker/dist/react-datepicker.css' registerLocale('nb', locale_nb) +const fixTimezone = (date: Date) => { + if (!date) { + return null + } + const tzoffset = new Date().getTimezoneOffset() * 60000 //offset in milliseconds + return new Date(date.getTime() - tzoffset) +} + +const displayTimeZone = (date: Date) => { + if (!date) { + return null + } + const tzoffset = new Date().getTimezoneOffset() * 60000 //offset in milliseconds + return new Date(date.getTime() + tzoffset) +} export const TimePicker = ({ name, value, @@ -23,12 +38,13 @@ export const TimePicker = ({ minDate, maxDate, }) => { + const displayTime = value && displayTimeZone(new Date(value)) return ( ( {({ field, form, meta }) => { const handleChange = (date) => { + const fixedDate = fixTimezone(date) form.setFieldTouched(props.name) // Need to trigger touched manually for Datepicker - if (props.afterChange) props.afterChange(date) + if (props.afterChange) props.afterChange(fixedDate) - return field.onChange(SyntEvent(field.name, date)) + return field.onChange(SyntEvent(field.name, fixedDate)) } const handleBlur = () => field.onBlur(SyntEvent(field.name, field.value)) From affc176a2a470212221ca990f69fdea09736d203 Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 17 Aug 2023 14:58:01 +0200 Subject: [PATCH 14/22] Timezone fix for dato #deploy-test-frontend --- .../aareg/form/partials/ameldingForm.tsx | 20 +++++++++++-------- .../form/partials/arbeidsforholdForm.tsx | 17 ++++++++++------ .../js/src/components/ui/form/formUtils.tsx | 9 +++++++++ .../ui/form/inputs/datepicker/Datepicker.tsx | 12 ++--------- .../ui/form/inputs/timepicker/Timepicker.tsx | 10 +--------- 5 files changed, 35 insertions(+), 33 deletions(-) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/aareg/form/partials/ameldingForm.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/aareg/form/partials/ameldingForm.tsx index 51c0d559ac9..ebeed941622 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/aareg/form/partials/ameldingForm.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/aareg/form/partials/ameldingForm.tsx @@ -2,7 +2,7 @@ import React, { useState } from 'react' import styled from 'styled-components' import useBoolean from '@/utils/hooks/useBoolean' import * as _ from 'lodash-es' -import { add, eachMonthOfInterval, format } from 'date-fns' +import { add, eachMonthOfInterval, format, isDate } from 'date-fns' import { DollySelect } from '@/components/ui/form/inputs/select/Select' import { ArbeidKodeverk } from '@/config/kodeverk' import NavButton from '@/components/ui/button/NavButton/NavButton' @@ -20,6 +20,7 @@ import KjedeIcon from '@/components/dollyKjede/KjedeIcon' import { useFormikContext } from 'formik' import { Amelding, KodeverkValue } from '@/components/fagsystem/aareg/AaregTypes' import { Hjelpetekst } from '@/components/hjelpetekst/Hjelpetekst' +import { fixTimezone } from '@/components/ui/form/formUtils' interface AmeldingFormProps { warningMessage?: any @@ -51,7 +52,9 @@ export const AmeldingForm = ({ warningMessage }: AmeldingFormProps): JSX.Element const arbeidsforholdstype = _.get(formikBag.values, paths.arbeidsforholdstype) const fom = _.get(formikBag.values, 'aareg[0].genererPeriode.fom') + const fomDate = isDate(fom) ? fixTimezone(fom) : fom const tom = _.get(formikBag.values, 'aareg[0].genererPeriode.tom') + const tomDate = isDate(tom) ? fixTimezone(tom) : tom const periode = _.get(formikBag.values, paths.periode) const ameldinger = _.get(formikBag.values, paths.amelding) @@ -59,14 +62,15 @@ export const AmeldingForm = ({ warningMessage }: AmeldingFormProps): JSX.Element const [selectedIndex, setSelectedIndex] = useState(0) const handlePeriodeChange = (dato: string, type: string) => { - formikBag.setFieldValue(`aareg[0].genererPeriode.${type}`, dato) + const fixedDato = fixTimezone(dato) + formikBag.setFieldValue(`aareg[0].genererPeriode.${type}`, fixedDato) if ((type === 'tom' && fom) || (type === 'fom' && tom)) { const maanederPrev: Array = _.get(formikBag.values, paths.amelding) const maaneder: Array = [] const maanederTmp = eachMonthOfInterval({ - start: new Date(type === 'fom' ? dato : fom), - end: new Date(type === 'tom' ? dato : tom), + start: new Date(type === 'fom' ? dato : fomDate), + end: new Date(type === 'tom' ? dato : tomDate), }) maanederTmp.forEach((maaned) => { maaneder.push(format(maaned, 'yyyy-MM')) @@ -79,7 +83,7 @@ export const AmeldingForm = ({ warningMessage }: AmeldingFormProps): JSX.Element } else { maaneder.forEach((mnd, idx) => { const currMaaned = _.get(formikBag.values, paths.amelding).find( - (element: Amelding) => element.maaned === mnd + (element: Amelding) => element.maaned === mnd, ) formikBag.setFieldValue(`${paths.amelding}[${idx}]`, { maaned: mnd, @@ -92,7 +96,7 @@ export const AmeldingForm = ({ warningMessage }: AmeldingFormProps): JSX.Element if (arbeidsforholdstype === 'maritimtArbeidsforhold') { formikBag.setFieldValue( `${paths.amelding}[${idx}].arbeidsforhold[0].fartoy`, - initialFartoy + initialFartoy, ) } }) @@ -135,7 +139,7 @@ export const AmeldingForm = ({ warningMessage }: AmeldingFormProps): JSX.Element } const currArbeidsforhold = _.get( formikBag.values, - `${paths.amelding}[${idMaaned}].arbeidsforhold` + `${paths.amelding}[${idMaaned}].arbeidsforhold`, ) const nyttArbeidsforhold = arbeidsforholdstype === 'forenkletOppgjoersordning' @@ -157,7 +161,7 @@ export const AmeldingForm = ({ warningMessage }: AmeldingFormProps): JSX.Element } const currArbeidsforhold = _.get( formikBag.values, - `${paths.amelding}[${idMaaned}].arbeidsforhold` + `${paths.amelding}[${idMaaned}].arbeidsforhold`, ) currArbeidsforhold?.splice(idArbeidsforhold, 1) formikBag.setFieldValue(`${paths.amelding}[${idMaaned}].arbeidsforhold`, currArbeidsforhold) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/aareg/form/partials/arbeidsforholdForm.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/aareg/form/partials/arbeidsforholdForm.tsx index bb5dabdaaea..86a568a430b 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/aareg/form/partials/arbeidsforholdForm.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/aareg/form/partials/arbeidsforholdForm.tsx @@ -25,6 +25,7 @@ import { BestillingsveilederContext } from '@/components/bestillingsveileder/Bes import { FormikErrors, FormikTouched, FormikValues, useFormikContext } from 'formik' import * as _ from 'lodash-es' import { Monthpicker } from '@/components/ui/form/inputs/monthpicker/Monthpicker' +import { fixTimezone } from '@/components/ui/form/formUtils' type Arbeidsforhold = { isOppdatering?: boolean @@ -73,7 +74,7 @@ export const ArbeidsforholdForm = ({ return _.uniqWith( aaregBestillinger, (best1: Arbeidsforhold, best2) => - best1?.arbeidsgiver?.orgnummer === best2?.arbeidsgiver?.orgnummer + best1?.arbeidsgiver?.orgnummer === best2?.arbeidsgiver?.orgnummer, ) } @@ -112,7 +113,7 @@ export const ArbeidsforholdForm = ({ tidligereAaregBestillinger.map((aaregBestilling) => { aaregBestilling.isOppdatering = true return aaregBestilling - }) + }), ) }, [values.aareg]) @@ -125,19 +126,23 @@ export const ArbeidsforholdForm = ({ const onChangeLenket = (fieldPath: string) => { if (arbeidsgiverType !== ArbeidsgiverTyper.egen) { return (field) => { - const value = isDate(field) ? field : field?.value || field?.target?.value || null + const value = isDate(field) + ? fixTimezone(field) + : field?.value || field?.target?.value || null setFieldValue(`${path}.${fieldPath}`, value) } } else { return (field) => { - const value = isDate(field) ? field : field?.value || field?.target?.value || null + const value = isDate(field) + ? fixTimezone(field) + : field?.value || field?.target?.value || null const amelding = _.get(values, 'aareg[0].amelding') || [] amelding.forEach((_maaned, idx) => { if (!erLenket && idx < ameldingIndex) { return null } else { const arbeidsforholdClone = _.cloneDeep( - amelding[idx].arbeidsforhold[arbeidsforholdIndex] + amelding[idx].arbeidsforhold[arbeidsforholdIndex], ) _.set(arbeidsforholdClone, fieldPath, value) _.set(amelding[idx], `arbeidsforhold[${arbeidsforholdIndex}]`, arbeidsforholdClone) @@ -205,7 +210,7 @@ export const ArbeidsforholdForm = ({ year: navArbeidsforholdPeriode.getFullYear(), monthValue: navArbeidsforholdPeriode.getMonth(), } - : undefined + : undefined, ) }, [navArbeidsforholdPeriode]) 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 ac37c6c5a3f..701e8de1259 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,5 +1,6 @@ import * as _ from 'lodash-es' import { runningCypressE2E } from '@/service/services/Request' +import { isDate } from 'date-fns' export const fieldError = (meta) => { return !!meta.touched && !!meta.error ? { feilmelding: meta.error } : null @@ -17,6 +18,14 @@ export const panelError = (formikBag, attributtPath) => { export const SyntEvent = (name, value) => ({ target: { name, value } }) +export const fixTimezone = (date: Date) => { + if (!isDate(date) || date.getUTCHours() === 0) { + return date + } + const tzoffset = new Date().getTimezoneOffset() * 60000 //offset in milliseconds + return new Date(date.getTime() - tzoffset) +} + const getValgteAttributter = (values) => { const rootPaths = [ 'pdldata.opprettNyPerson.alder', 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 3a2354d5c2a..fe0881d347f 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 @@ -6,7 +6,7 @@ import { TextInput } from '@/components/ui/form/inputs/textInput/TextInput' import { Label } from '@/components/ui/form/inputs/label/Label' import { InputWrapper } from '@/components/ui/form/inputWrapper/InputWrapper' import { Vis } from '@/components/bestillingsveileder/VisAttributt' -import { fieldError, SyntEvent } from '@/components/ui/form/formUtils' +import { fieldError, fixTimezone, SyntEvent } from '@/components/ui/form/formUtils' import 'react-datepicker/dist/react-datepicker.css' import './Datepicker.less' @@ -17,14 +17,6 @@ function addHours(date, amount) { return date } -const fixTimezone = (date: Date) => { - if (!date) { - return null - } - const tzoffset = new Date().getTimezoneOffset() * 60000 //offset in milliseconds - return new Date(date.getTime() - tzoffset) -} - export const Datepicker = ({ name, value, @@ -77,7 +69,7 @@ const P_FormikDatepicker = ({ fastfield, addHour = false, ...props }) => ( form.setFieldTouched(props.name) // Need to trigger touched manually for Datepicker if (props.afterChange) props.afterChange(date) - let val = fixTimezone(date).toISOString().substring(0, 19) + let val = fixTimezone(date)?.toISOString().substring(0, 19) if (addHour) { val = addHours(new Date(date), 1).toISOString().substring(0, 19) } diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/timepicker/Timepicker.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/timepicker/Timepicker.tsx index f50170919d5..17d92d0a4de 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/timepicker/Timepicker.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/timepicker/Timepicker.tsx @@ -6,19 +6,11 @@ import { TextInput } from '@/components/ui/form/inputs/textInput/TextInput' import { Label } from '@/components/ui/form/inputs/label/Label' import { InputWrapper } from '@/components/ui/form/inputWrapper/InputWrapper' import { Vis } from '@/components/bestillingsveileder/VisAttributt' -import { fieldError, SyntEvent } from '@/components/ui/form/formUtils' +import { fieldError, fixTimezone, SyntEvent } from '@/components/ui/form/formUtils' import 'react-datepicker/dist/react-datepicker.css' registerLocale('nb', locale_nb) -const fixTimezone = (date: Date) => { - if (!date) { - return null - } - const tzoffset = new Date().getTimezoneOffset() * 60000 //offset in milliseconds - return new Date(date.getTime() - tzoffset) -} - const displayTimeZone = (date: Date) => { if (!date) { return null From 7547c4d5617083d39968eb080435360b9c6a2444 Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 17 Aug 2023 15:29:33 +0200 Subject: [PATCH 15/22] Fix on fix --- .../src/components/fagsystem/aareg/form/initialValues.tsx | 8 ++++---- .../src/components/fagsystem/pdlf/form/initialValues.tsx | 6 ++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/aareg/form/initialValues.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/aareg/form/initialValues.tsx index 8623b69005d..96fcd080a8f 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/aareg/form/initialValues.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/aareg/form/initialValues.tsx @@ -6,7 +6,7 @@ export const initialForenkletOppgjoersordningOrg = { orgnummer: '', }, ansettelsesPeriode: { - fom: subYears(new Date().setHours(0, 0, 0, 0), 20), + fom: subYears(new Date(), 20), tom: null, sluttaarsak: null, }, @@ -22,7 +22,7 @@ export const initialForenkletOppgjoersordningPers = { ident: '', }, ansettelsesPeriode: { - fom: subYears(new Date().setHours(0, 0, 0, 0), 20), + fom: subYears(new Date(), 20), tom: null, sluttaarsak: null, }, @@ -39,7 +39,7 @@ export const initialArbeidsforholdOrg = { orgnummer: '', }, ansettelsesPeriode: { - fom: subYears(new Date().setHours(0, 0, 0, 0), 20), + fom: subYears(new Date(), 20), tom: null, sluttaarsak: null, }, @@ -62,7 +62,7 @@ export const initialArbeidsforholdPers = { }, arbeidsforholdID: '', ansettelsesPeriode: { - fom: subYears(new Date().setHours(0, 0, 0, 0), 20), + fom: subYears(new Date(), 20), tom: null, sluttaarsak: null, }, diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/initialValues.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/initialValues.tsx index dfb6c520dd8..30e721ac9c4 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/initialValues.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/initialValues.tsx @@ -1,5 +1,3 @@ -import { startOfToday } from 'date-fns' - const navn = { fornavn: undefined as unknown as string, mellomnavn: undefined as unknown as string, @@ -121,7 +119,7 @@ export const initialSikkerhetstiltak = { personident: '', enhet: '', }, - gyldigFraOgMed: startOfToday(), + gyldigFraOgMed: new Date(), gyldigTilOgMed: null as unknown as string, kilde: 'Dolly', master: 'PDL', @@ -176,7 +174,7 @@ export const initialMedlAvgangssystem = { export const initialTpsSikkerhetstiltak = { tiltakstype: '', beskrivelse: '', - gyldigFraOgMed: startOfToday(), + gyldigFraOgMed: new Date(), gyldigTilOgMed: null as unknown as string, } From 1ba5d3ed483d7b62e5d720804719e7dfb11a5fd8 Mon Sep 17 00:00:00 2001 From: stigus Date: Fri, 18 Aug 2023 10:06:25 +0200 Subject: [PATCH 16/22] =?UTF-8?q?Mindre=20oppdatering=20av=20pakker=20og?= =?UTF-8?q?=20fix=20p=C3=A5=20opphold=20timepicker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/js/package-lock.json | 1198 ++++++++--------- .../form/partials/OppholdSammeVilkaar.tsx | 2 +- .../udistub/form/partials/Oppholdsstatus.tsx | 7 +- .../ui/form/inputs/datepicker/Datepicker.tsx | 4 +- 4 files changed, 572 insertions(+), 639 deletions(-) diff --git a/apps/dolly-frontend/src/main/js/package-lock.json b/apps/dolly-frontend/src/main/js/package-lock.json index fa6c2d0cf65..3fb7fd5b32c 100644 --- a/apps/dolly-frontend/src/main/js/package-lock.json +++ b/apps/dolly-frontend/src/main/js/package-lock.json @@ -2587,9 +2587,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz", - "integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -2618,9 +2618,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dependencies": { "type-fest": "^0.20.2" }, @@ -2654,9 +2654,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.46.0.tgz", - "integrity": "sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", + "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -2710,9 +2710,9 @@ "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" }, "node_modules/@grafana/faro-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@grafana/faro-core/-/faro-core-1.1.2.tgz", - "integrity": "sha512-bkDRivNUEjk2oOzsC+xJEr2hhFZDsHBoXqGbZiR2rQ4BT3qN5Mm4Eb3GOaHrRBLXp82HeV6ZXP0Gfsv3+YMEQA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@grafana/faro-core/-/faro-core-1.1.3.tgz", + "integrity": "sha512-3PIutCx6cd8RR083jCm2yLIYAZxymhKe26FWIIs4IaHF9CgzLuA6NIutEWrHVSCBU86dMuQDpRJxvaoL70O4ZA==", "dependencies": { "@opentelemetry/api": "^1.4.1", "@opentelemetry/api-metrics": "^0.33.0", @@ -2721,12 +2721,12 @@ } }, "node_modules/@grafana/faro-react": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@grafana/faro-react/-/faro-react-1.1.2.tgz", - "integrity": "sha512-JqqL01Z8dAVNo8sCK+XzBwf7q/kIylarkagGjDU0GsVIwCL2GOxjx3F5w0euAb5M5+P/C1t2zfwvguouf4dvoQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@grafana/faro-react/-/faro-react-1.1.3.tgz", + "integrity": "sha512-3dO8cVnY71PSGxIDdNCr7FH1KkfqCz+mvtfeJw5jnzHPSUXWg/IHKPRf25I+1RcTK2A2W1Zlgc2OQK/9UowWnA==", "dependencies": { - "@grafana/faro-web-sdk": "^1.1.2", - "@grafana/faro-web-tracing": "^1.1.2", + "@grafana/faro-web-sdk": "^1.1.3", + "@grafana/faro-web-tracing": "^1.1.3", "hoist-non-react-statics": "^3.3.2" }, "peerDependencies": { @@ -2735,65 +2735,69 @@ } }, "node_modules/@grafana/faro-web-sdk": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@grafana/faro-web-sdk/-/faro-web-sdk-1.1.2.tgz", - "integrity": "sha512-WH3xBlb33+pLeiPzV9id2ZUjlJR4nOmsGH/g+Uvosp9S2YQV+hL6LiWpP/jjC0KCROhCUgl8luly8UlssFMNDA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@grafana/faro-web-sdk/-/faro-web-sdk-1.1.3.tgz", + "integrity": "sha512-bVHNbelwj/WFdRpW//m0nCcUM0yGQKtPmUMjAeBTZNkogALt3D+ILQVwQSiXz5Ci4aXEPJXUgZoM9ibNHVE6AQ==", "dependencies": { - "@grafana/faro-core": "^1.1.2", + "@grafana/faro-core": "^1.1.3", "ua-parser-js": "^1.0.32", "web-vitals": "^3.1.1" } }, "node_modules/@grafana/faro-web-tracing": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@grafana/faro-web-tracing/-/faro-web-tracing-1.1.2.tgz", - "integrity": "sha512-KvtTglGQv11GWGYPvmdOzPHNntjcyj1ybmudekNz+CeUBVvSv0yaW90RoRuAWuFA6EYDy15F2fXspA2Rxel3FQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@grafana/faro-web-tracing/-/faro-web-tracing-1.1.3.tgz", + "integrity": "sha512-dLpQacpHdBhZ3tVB+0flbo0G1XkYzui6omxJdJIQybjhygxECeHZURBgHkaLpgpu/y1uFI7U0DArtY5RWR7edw==", "dependencies": { - "@grafana/faro-web-sdk": "^1.1.2", - "@grpc/grpc-js": "^1.8.17", + "@grafana/faro-web-sdk": "^1.1.3", "@opentelemetry/api": "^1.4.1", - "@opentelemetry/context-zone": "^1.11.0", - "@opentelemetry/core": "^1.11.0", - "@opentelemetry/exporter-trace-otlp-http": "^0.37.0", - "@opentelemetry/instrumentation": "^0.37.0", - "@opentelemetry/instrumentation-document-load": "^0.32.0", - "@opentelemetry/instrumentation-fetch": "^0.37.0", - "@opentelemetry/instrumentation-xml-http-request": "^0.37.0", - "@opentelemetry/otlp-transformer": "^0.37.0", - "@opentelemetry/resources": "^1.11.0", - "@opentelemetry/sdk-trace-base": "^1.11.0", - "@opentelemetry/sdk-trace-web": "^1.11.0", - "@opentelemetry/semantic-conventions": "^1.11.0" - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.0.tgz", - "integrity": "sha512-H8+iZh+kCE6VR/Krj6W28Y/ZlxoZ1fOzsNt77nrdE3knkbSelW1Uus192xOFCxHyeszLj8i4APQkSIXjAoOxXg==", - "dependencies": { - "@grpc/proto-loader": "^0.7.0", - "@types/node": ">=12.12.47" + "@opentelemetry/context-zone": "^1.15.2", + "@opentelemetry/core": "^1.15.2", + "@opentelemetry/exporter-trace-otlp-http": "^0.41.2", + "@opentelemetry/instrumentation": "^0.41.2", + "@opentelemetry/instrumentation-document-load": "^0.33.0", + "@opentelemetry/instrumentation-fetch": "^0.41.2", + "@opentelemetry/instrumentation-xml-http-request": "^0.41.2", + "@opentelemetry/otlp-transformer": "^0.41.2", + "@opentelemetry/resources": "^1.15.2", + "@opentelemetry/sdk-trace-base": "^1.15.2", + "@opentelemetry/sdk-trace-web": "^1.15.2", + "@opentelemetry/semantic-conventions": "^1.15.2" + } + }, + "node_modules/@grafana/faro-web-tracing/node_modules/@opentelemetry/otlp-transformer": { + "version": "0.41.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.41.2.tgz", + "integrity": "sha512-jJbPwB0tNu2v+Xi0c/v/R3YBLJKLonw1p+v3RVjT2VfzeUyzSp/tBeVdY7RZtL6dzZpA9XSmp8UEfWIFQo33yA==", + "dependencies": { + "@opentelemetry/api-logs": "0.41.2", + "@opentelemetry/core": "1.15.2", + "@opentelemetry/resources": "1.15.2", + "@opentelemetry/sdk-logs": "0.41.2", + "@opentelemetry/sdk-metrics": "1.15.2", + "@opentelemetry/sdk-trace-base": "1.15.2" }, "engines": { - "node": "^8.13.0 || >=10.10.0" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.5.0" } }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.8.tgz", - "integrity": "sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==", + "node_modules/@grafana/faro-web-tracing/node_modules/@opentelemetry/sdk-metrics": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.15.2.tgz", + "integrity": "sha512-9aIlcX8GnhcsAHW/Wl8bzk4ZnWTpNlLtud+fxUfBtFATu6OZ6TrGrF4JkT9EVrnoxwtPIDtjHdEsSjOqisY/iA==", "dependencies": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^7.2.4", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + "@opentelemetry/core": "1.15.2", + "@opentelemetry/resources": "1.15.2", + "lodash.merge": "^4.6.2" }, "engines": { - "node": ">=6" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.5.0" } }, "node_modules/@hapi/hoek": { @@ -2992,16 +2996,16 @@ "optional": true }, "node_modules/@navikt/aksel-icons": { - "version": "4.9.0", - "resolved": "https://npm.pkg.github.com/download/@navikt/aksel-icons/4.9.0/041744a25684a8cee8c3375c2f9b929ea1cdcb93", - "integrity": "sha512-WOTkelI+W1VR0VvC6DyTznHcgCcYq5BTWIHU3zmPJMi2ImfmOAP768kGW8imxQ600hN9bTwnjBZixAC5pFsM6A==", + "version": "4.12.1", + "resolved": "https://npm.pkg.github.com/download/@navikt/aksel-icons/4.12.1/1055d322e956e073b83dca8e8b3a6be62879e1f1", + "integrity": "sha512-OCCKfb3dtk2gUBKdzbJiMkM4PfYZZXL3tfNHKJLn8QDpt+x6zdsaJWwTPc/pyDrl/quVGN3oPBHZ+3+7r/YtVw==", "dev": true, "license": "MIT" }, "node_modules/@navikt/ds-css": { - "version": "4.9.0", - "resolved": "https://npm.pkg.github.com/download/@navikt/ds-css/4.9.0/bbe29245205e41026bebe4bbcfa1e682b1149e81", - "integrity": "sha512-jR3cpspyrt2XQVUcu26g0wEKwDEsMZw3BdE02PIiBa9ucULxv92lj/N+nEbzTSl4jK4Xf9waWUhuepvVPJu2tg==", + "version": "4.12.1", + "resolved": "https://npm.pkg.github.com/download/@navikt/ds-css/4.12.1/e2fa643caca8d998149ef56965d74dc646038ed2", + "integrity": "sha512-yBYFFgC749qtrlJddfmylaNyVI2++U7ZDduQWW0YAd6sYNURt5p2GkWJwFL78PdD+Rlc4bSi573LKJSmpw0/iw==", "dev": true, "license": "MIT" }, @@ -3023,14 +3027,14 @@ } }, "node_modules/@navikt/ds-react": { - "version": "4.9.0", - "resolved": "https://npm.pkg.github.com/download/@navikt/ds-react/4.9.0/15ffd74b3a4cf9edfbf88ae4ed67417bed1d26c1", - "integrity": "sha512-BlUFXT0AqWpj+SiOEsSujG5zvpZvm2+KIeBAaj7OneVwotaECVi9rkCpdpNQLKlmGIQatDSkSgrpCf4sNEEphw==", + "version": "4.12.1", + "resolved": "https://npm.pkg.github.com/download/@navikt/ds-react/4.12.1/75b4207b51213a3de620f9dd8b5b72095c741bbe", + "integrity": "sha512-fw3UcwLzq84fqFAgK0yZj6cADZy8uhHXK3mNnLJWXo8OxbVx3TEx5dR0Aa3mWASeTYFXdcp/n5Cj6Mu2ZnRlHw==", "dev": true, "license": "MIT", "dependencies": { "@floating-ui/react": "0.24.1", - "@navikt/aksel-icons": "^4.9.0", + "@navikt/aksel-icons": "^4.12.1", "@radix-ui/react-tabs": "1.0.0", "@radix-ui/react-toggle-group": "1.0.0", "clsx": "^1.2.1", @@ -3227,6 +3231,17 @@ "node": ">=8.0.0" } }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.41.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.41.2.tgz", + "integrity": "sha512-JEV2RAqijAFdWeT6HddYymfnkiRu2ASxoTBr4WsnGJhOjWZkEy6vp+Sx9ozr1NaIODOa2HUyckExIqQjn6qywQ==", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/api-metrics": { "version": "0.33.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.33.0.tgz", @@ -3278,15 +3293,15 @@ } }, "node_modules/@opentelemetry/exporter-trace-otlp-http": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.37.0.tgz", - "integrity": "sha512-+oVV/h6UTLMF4IRtCGkLk2kQImMgC0ARFCfz+XXGNksP+awh/NXsDtJ3mHrn8Gtudrf3+pKVe/FWptBRqicm5Q==", + "version": "0.41.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.41.2.tgz", + "integrity": "sha512-Y0fGLipjZXLMelWtlS1/MDtrPxf25oM408KukRdkN31a1MEFo4h/ZkNwS7ZfmqHGUa+4rWRt2bi6JBiqy7Ytgw==", "dependencies": { - "@opentelemetry/core": "1.11.0", - "@opentelemetry/otlp-exporter-base": "0.37.0", - "@opentelemetry/otlp-transformer": "0.37.0", - "@opentelemetry/resources": "1.11.0", - "@opentelemetry/sdk-trace-base": "1.11.0" + "@opentelemetry/core": "1.15.2", + "@opentelemetry/otlp-exporter-base": "0.41.2", + "@opentelemetry/otlp-transformer": "0.41.2", + "@opentelemetry/resources": "1.15.2", + "@opentelemetry/sdk-trace-base": "1.15.2" }, "engines": { "node": ">=14" @@ -3295,66 +3310,50 @@ "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/core": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.11.0.tgz", - "integrity": "sha512-aP1wHSb+YfU0pM63UAkizYPuS4lZxzavHHw5KJfFNN2oWQ79HSm6JR3CzwFKHwKhSzHN8RE9fgP1IdVJ8zmo1w==", + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/otlp-transformer": { + "version": "0.41.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.41.2.tgz", + "integrity": "sha512-jJbPwB0tNu2v+Xi0c/v/R3YBLJKLonw1p+v3RVjT2VfzeUyzSp/tBeVdY7RZtL6dzZpA9XSmp8UEfWIFQo33yA==", "dependencies": { - "@opentelemetry/semantic-conventions": "1.11.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.5.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/resources": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.11.0.tgz", - "integrity": "sha512-y0z2YJTqk0ag+hGT4EXbxH/qPhDe8PfwltYb4tXIEsozgEFfut/bqW7H7pDvylmCjBRMG4NjtLp57V1Ev++brA==", - "dependencies": { - "@opentelemetry/core": "1.11.0", - "@opentelemetry/semantic-conventions": "1.11.0" + "@opentelemetry/api-logs": "0.41.2", + "@opentelemetry/core": "1.15.2", + "@opentelemetry/resources": "1.15.2", + "@opentelemetry/sdk-logs": "0.41.2", + "@opentelemetry/sdk-metrics": "1.15.2", + "@opentelemetry/sdk-trace-base": "1.15.2" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.5.0" + "@opentelemetry/api": ">=1.3.0 <1.5.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.11.0.tgz", - "integrity": "sha512-DV8e5/Qo42V8FMBlQ0Y0Liv6Hl/Pp5bAZ73s7r1euX8w4bpRes1B7ACiA4yujADbWMJxBgSo4fGbi4yjmTMG2A==", + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/sdk-metrics": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.15.2.tgz", + "integrity": "sha512-9aIlcX8GnhcsAHW/Wl8bzk4ZnWTpNlLtud+fxUfBtFATu6OZ6TrGrF4JkT9EVrnoxwtPIDtjHdEsSjOqisY/iA==", "dependencies": { - "@opentelemetry/core": "1.11.0", - "@opentelemetry/resources": "1.11.0", - "@opentelemetry/semantic-conventions": "1.11.0" + "@opentelemetry/core": "1.15.2", + "@opentelemetry/resources": "1.15.2", + "lodash.merge": "^4.6.2" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.5.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.11.0.tgz", - "integrity": "sha512-fG4D0AktoHyHwGhFGv+PzKrZjxbKJfckJauTJdq2A+ej5cTazmNYjJVAODXXkYyrsI10muMl+B1iO2q1R6Lp+w==", - "engines": { - "node": ">=14" + "@opentelemetry/api": ">=1.3.0 <1.5.0" } }, "node_modules/@opentelemetry/instrumentation": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.37.0.tgz", - "integrity": "sha512-QAHIYTeVHcvP5NcI8r0WbvF5KCojZSzQLO9G73/OpiXLy/t8hIUXHq0nuuSB5zP5dKQ8h9sORi/3suGBNHnsjw==", + "version": "0.41.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.41.2.tgz", + "integrity": "sha512-rxU72E0pKNH6ae2w5+xgVYZLzc5mlxAbGzF4shxMVK8YC2QQsfN38B2GPbj0jvrKWWNUElfclQ+YTykkNg/grw==", "dependencies": { - "require-in-the-middle": "^6.0.0", - "semver": "^7.3.2", + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "1.4.2", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.1", "shimmer": "^1.2.1" }, "engines": { @@ -3365,14 +3364,14 @@ } }, "node_modules/@opentelemetry/instrumentation-document-load": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-document-load/-/instrumentation-document-load-0.32.3.tgz", - "integrity": "sha512-eK7ywJXlXsVYzAqpX8RikpEvJFIUOtKCybCdq68lsv2MVwx0Jev0Kycc+q+1mvKQBuhvEVk/5WEUSV9bbVn6qQ==", + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-document-load/-/instrumentation-document-load-0.33.1.tgz", + "integrity": "sha512-FyLe5i85likVEp36ZewtM8jIZ8/7w55yz9tVoBBJHlTRCVZutff2EhVVCnGHx4etnMvuF+Es8CU2tTsnlCtl5g==", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.40.0", + "@opentelemetry/instrumentation": "^0.41.2", "@opentelemetry/sdk-trace-base": "^1.0.0", - "@opentelemetry/sdk-trace-web": "^1.8.0", + "@opentelemetry/sdk-trace-web": "^1.15.0", "@opentelemetry/semantic-conventions": "^1.0.0" }, "engines": { @@ -3382,76 +3381,15 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-document-load/node_modules/@opentelemetry/instrumentation": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.40.0.tgz", - "integrity": "sha512-23TzBKPflUS1uEq5SXymnQKQDSda35KvHjnvxdcDQGE+wg6hwDHgScUCWiBmZW4sxAaPcANfs+Wc9B7yDuyT6Q==", - "dependencies": { - "@types/shimmer": "^1.0.2", - "import-in-the-middle": "1.3.5", - "require-in-the-middle": "^7.1.0", - "semver": "^7.3.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-document-load/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-document-load/node_modules/require-in-the-middle": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.2.0.tgz", - "integrity": "sha512-3TLx5TGyAY6AOqLBoXmHkNql0HIf2RGbuMgCDT2WO/uGVAPJs6h7Kl+bN6TIZGd9bWhWPwnDnTHGtW8Iu77sdw==", - "dependencies": { - "debug": "^4.1.1", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@opentelemetry/instrumentation-document-load/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-document-load/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/@opentelemetry/instrumentation-fetch": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fetch/-/instrumentation-fetch-0.37.0.tgz", - "integrity": "sha512-PXAbRPOpVGxxH3kOd5j8D6AK7l8Gk8pPDNZGoBijYPbAIBg8SvefGXZlHtrzbTmBjy71IjnIxpl0rAl7QH6IPA==", + "version": "0.41.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fetch/-/instrumentation-fetch-0.41.2.tgz", + "integrity": "sha512-L4jx7kq0R5XWAf5YcekSQ3Zm/6PE/+p/6rZe4NdtC+gp9u1lrQ/Vr0lwexxubS1odghbUSFo6PXKrqc25c+2hA==", "dependencies": { - "@opentelemetry/core": "1.11.0", - "@opentelemetry/instrumentation": "0.37.0", - "@opentelemetry/sdk-trace-web": "1.11.0", - "@opentelemetry/semantic-conventions": "1.11.0" + "@opentelemetry/core": "1.15.2", + "@opentelemetry/instrumentation": "0.41.2", + "@opentelemetry/sdk-trace-web": "1.15.2", + "@opentelemetry/semantic-conventions": "1.15.2" }, "engines": { "node": ">=14" @@ -3460,84 +3398,15 @@ "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/instrumentation-fetch/node_modules/@opentelemetry/core": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.11.0.tgz", - "integrity": "sha512-aP1wHSb+YfU0pM63UAkizYPuS4lZxzavHHw5KJfFNN2oWQ79HSm6JR3CzwFKHwKhSzHN8RE9fgP1IdVJ8zmo1w==", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.11.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.5.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fetch/node_modules/@opentelemetry/resources": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.11.0.tgz", - "integrity": "sha512-y0z2YJTqk0ag+hGT4EXbxH/qPhDe8PfwltYb4tXIEsozgEFfut/bqW7H7pDvylmCjBRMG4NjtLp57V1Ev++brA==", - "dependencies": { - "@opentelemetry/core": "1.11.0", - "@opentelemetry/semantic-conventions": "1.11.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.5.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fetch/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.11.0.tgz", - "integrity": "sha512-DV8e5/Qo42V8FMBlQ0Y0Liv6Hl/Pp5bAZ73s7r1euX8w4bpRes1B7ACiA4yujADbWMJxBgSo4fGbi4yjmTMG2A==", - "dependencies": { - "@opentelemetry/core": "1.11.0", - "@opentelemetry/resources": "1.11.0", - "@opentelemetry/semantic-conventions": "1.11.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.5.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fetch/node_modules/@opentelemetry/sdk-trace-web": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-web/-/sdk-trace-web-1.11.0.tgz", - "integrity": "sha512-lZwZ7S3aJQLCfsp47LGIu0amceefniPBbVoAX3n1QHng/ld1P4cYIrE4+Lil39xhq8DvyUKEgGO+iazugAUtog==", - "dependencies": { - "@opentelemetry/core": "1.11.0", - "@opentelemetry/sdk-trace-base": "1.11.0", - "@opentelemetry/semantic-conventions": "1.11.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.5.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fetch/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.11.0.tgz", - "integrity": "sha512-fG4D0AktoHyHwGhFGv+PzKrZjxbKJfckJauTJdq2A+ej5cTazmNYjJVAODXXkYyrsI10muMl+B1iO2q1R6Lp+w==", - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/instrumentation-xml-http-request": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-xml-http-request/-/instrumentation-xml-http-request-0.37.0.tgz", - "integrity": "sha512-W1wzAQccxPKdnfW9t1K2QjRW7VDUXF/FP3CJQOW/J6V2VB1vWs1K5QHZHTB3Uq4vZ51mG+N9Y0Ks5I83k+4vcw==", + "version": "0.41.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-xml-http-request/-/instrumentation-xml-http-request-0.41.2.tgz", + "integrity": "sha512-lRj9JPSVoE/lReUQ8afekoCyEAGdIWNrzF42Kv63cf5CCMqB/aoHH+NdnSXZ5ANsOvNQ9H65qTsqCbwkzn1x6g==", "dependencies": { - "@opentelemetry/core": "1.11.0", - "@opentelemetry/instrumentation": "0.37.0", - "@opentelemetry/sdk-trace-web": "1.11.0", - "@opentelemetry/semantic-conventions": "1.11.0" + "@opentelemetry/core": "1.15.2", + "@opentelemetry/instrumentation": "0.41.2", + "@opentelemetry/sdk-trace-web": "1.15.2", + "@opentelemetry/semantic-conventions": "1.15.2" }, "engines": { "node": ">=14" @@ -3546,75 +3415,6 @@ "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/instrumentation-xml-http-request/node_modules/@opentelemetry/core": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.11.0.tgz", - "integrity": "sha512-aP1wHSb+YfU0pM63UAkizYPuS4lZxzavHHw5KJfFNN2oWQ79HSm6JR3CzwFKHwKhSzHN8RE9fgP1IdVJ8zmo1w==", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.11.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.5.0" - } - }, - "node_modules/@opentelemetry/instrumentation-xml-http-request/node_modules/@opentelemetry/resources": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.11.0.tgz", - "integrity": "sha512-y0z2YJTqk0ag+hGT4EXbxH/qPhDe8PfwltYb4tXIEsozgEFfut/bqW7H7pDvylmCjBRMG4NjtLp57V1Ev++brA==", - "dependencies": { - "@opentelemetry/core": "1.11.0", - "@opentelemetry/semantic-conventions": "1.11.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.5.0" - } - }, - "node_modules/@opentelemetry/instrumentation-xml-http-request/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.11.0.tgz", - "integrity": "sha512-DV8e5/Qo42V8FMBlQ0Y0Liv6Hl/Pp5bAZ73s7r1euX8w4bpRes1B7ACiA4yujADbWMJxBgSo4fGbi4yjmTMG2A==", - "dependencies": { - "@opentelemetry/core": "1.11.0", - "@opentelemetry/resources": "1.11.0", - "@opentelemetry/semantic-conventions": "1.11.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.5.0" - } - }, - "node_modules/@opentelemetry/instrumentation-xml-http-request/node_modules/@opentelemetry/sdk-trace-web": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-web/-/sdk-trace-web-1.11.0.tgz", - "integrity": "sha512-lZwZ7S3aJQLCfsp47LGIu0amceefniPBbVoAX3n1QHng/ld1P4cYIrE4+Lil39xhq8DvyUKEgGO+iazugAUtog==", - "dependencies": { - "@opentelemetry/core": "1.11.0", - "@opentelemetry/sdk-trace-base": "1.11.0", - "@opentelemetry/semantic-conventions": "1.11.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.5.0" - } - }, - "node_modules/@opentelemetry/instrumentation-xml-http-request/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.11.0.tgz", - "integrity": "sha512-fG4D0AktoHyHwGhFGv+PzKrZjxbKJfckJauTJdq2A+ej5cTazmNYjJVAODXXkYyrsI10muMl+B1iO2q1R6Lp+w==", - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/instrumentation/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -3646,11 +3446,11 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.37.0.tgz", - "integrity": "sha512-dLbv7nr7d14xrHzd+S1eW+RpXh7IC0onktc23pwzETh6J7Ytzf0+QwLV5iRatoNtwPU2hX1VGOipwEnC/BjXxg==", + "version": "0.41.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.41.2.tgz", + "integrity": "sha512-pfwa6d+Dax3itZcGWiA0AoXeVaCuZbbqUTsCtOysd2re8C2PWXNxDONUfBWsn+KgxAdi+ljwTjJGiaVLDaIEvQ==", "dependencies": { - "@opentelemetry/core": "1.11.0" + "@opentelemetry/core": "1.15.2" }, "engines": { "node": ">=14" @@ -3659,28 +3459,6 @@ "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.11.0.tgz", - "integrity": "sha512-aP1wHSb+YfU0pM63UAkizYPuS4lZxzavHHw5KJfFNN2oWQ79HSm6JR3CzwFKHwKhSzHN8RE9fgP1IdVJ8zmo1w==", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.11.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.5.0" - } - }, - "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.11.0.tgz", - "integrity": "sha512-fG4D0AktoHyHwGhFGv+PzKrZjxbKJfckJauTJdq2A+ej5cTazmNYjJVAODXXkYyrsI10muMl+B1iO2q1R6Lp+w==", - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/otlp-transformer": { "version": "0.37.0", "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.37.0.tgz", @@ -3766,6 +3544,22 @@ "@opentelemetry/api": ">=1.0.0 <1.5.0" } }, + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.41.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.41.2.tgz", + "integrity": "sha512-smqKIw0tTW15waj7BAPHFomii5c3aHnSE4LQYTszGoK5P9nZs8tEAIpu15UBxi3aG31ZfsLmm4EUQkjckdlFrw==", + "dependencies": { + "@opentelemetry/core": "1.15.2", + "@opentelemetry/resources": "1.15.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.5.0", + "@opentelemetry/api-logs": ">=0.39.1" + } + }, "node_modules/@opentelemetry/sdk-metrics": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.11.0.tgz", @@ -3863,6 +3657,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, "dependencies": { "cross-spawn": "^7.0.3", "fast-glob": "^3.3.0", @@ -3882,6 +3677,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, "engines": { "node": ">=12" }, @@ -3893,6 +3689,7 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, "dependencies": { "default-browser": "^4.0.0", "define-lazy-prop": "^3.0.0", @@ -3915,60 +3712,6 @@ "url": "https://opencollective.com/popperjs" } }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, "node_modules/@radix-ui/primitive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz", @@ -4204,9 +3947,9 @@ } }, "node_modules/@rc-component/trigger": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-1.15.3.tgz", - "integrity": "sha512-C25WdL8PxX9UrE9S4vZsB2zU920S+pihN9S9mGd/DgfjM5XWYZBonLZfTWAZz54w9cYr5dt/Ln8futCesoBSZA==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-1.15.5.tgz", + "integrity": "sha512-HFjeco/gRGAHN3sBl5ZO44o0W6Y3i8sqCQEYcFT1RJJUb91p/uSIWejPDMzHd3DKAdTbRCM3T45jxs7Kwm17kA==", "dependencies": { "@babel/runtime": "^7.18.3", "@rc-component/portal": "^1.1.0", @@ -4272,11 +4015,11 @@ } }, "node_modules/@remix-run/router": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.7.2.tgz", - "integrity": "sha512-7Lcn7IqGMV+vizMPoEl5F0XDshcdDYtMI6uJLQdQz5CfZAwy3vvGKYSUk789qndt5dEC4HfSjviSYlSoHGL2+A==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.8.0.tgz", + "integrity": "sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg==", "engines": { - "node": ">=14" + "node": ">=14.0.0" } }, "node_modules/@rollup/plugin-terser": { @@ -4328,9 +4071,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", - "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.3.tgz", + "integrity": "sha512-hfllNN4a80rwNQ9QCxhxuHCGHMAvabXqxNdaChUSSadMre7t4iEUI6fFAhBOn/eIYTgYVhBv7vCLsAJ4u3lf3g==", "dev": true, "dependencies": { "@types/estree": "^1.0.0", @@ -4668,9 +4411,9 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" }, "node_modules/@types/lodash": { - "version": "4.14.196", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.196.tgz", - "integrity": "sha512-22y3o88f4a94mKljsZcanlNWPzO0uBsBdzLAngf2tp533LzZcQzb6+eZPJ+vCTt+bqF2XnvT9gejTLsAcJAJyQ==", + "version": "4.14.197", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.197.tgz", + "integrity": "sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==", "dev": true }, "node_modules/@types/lodash-es": { @@ -4680,17 +4423,13 @@ "dev": true, "dependencies": { "@types/lodash": "*" - } - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + } }, "node_modules/@types/node": { - "version": "20.4.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.9.tgz", - "integrity": "sha512-8e2HYcg7ohnTUbHk8focoklEQYvemQmu9M/f43DZVx43kHn0tE3BY/6gSDxS7k0SprtS0NHvj+L80cGLnoOUcQ==" + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.0.tgz", + "integrity": "sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==", + "dev": true }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -4703,9 +4442,9 @@ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "node_modules/@types/react": { - "version": "18.2.19", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.19.tgz", - "integrity": "sha512-e2S8wmY1ePfM517PqCG80CcE48Xs5k0pwJzuDZsfE8IZRRBfOMCF+XqnFxu6mWtyivum1MQm4aco+WIt6Coimw==", + "version": "18.2.20", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.20.tgz", + "integrity": "sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -4862,21 +4601,20 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.3.0.tgz", - "integrity": "sha512-IZYjYZ0ifGSLZbwMqIip/nOamFiWJ9AH+T/GYNZBWkVcyNQOFGtSMoWV7RvY4poYCMZ/4lHzNl796WOSNxmk8A==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.4.0.tgz", + "integrity": "sha512-62o2Hmc7Gs3p8SLfbXcipjWAa6qk2wZGChXG2JbBtYpwSRmti/9KHLqfbLs9uDigOexG+3PaQ9G2g3201FWLKg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.3.0", - "@typescript-eslint/type-utils": "6.3.0", - "@typescript-eslint/utils": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0", + "@typescript-eslint/scope-manager": "6.4.0", + "@typescript-eslint/type-utils": "6.4.0", + "@typescript-eslint/utils": "6.4.0", + "@typescript-eslint/visitor-keys": "6.4.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", - "natural-compare-lite": "^1.4.0", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, @@ -4931,15 +4669,15 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.3.0.tgz", - "integrity": "sha512-ibP+y2Gr6p0qsUkhs7InMdXrwldjxZw66wpcQq9/PzAroM45wdwyu81T+7RibNCh8oc0AgrsyCwJByncY0Ongg==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.4.0.tgz", + "integrity": "sha512-I1Ah1irl033uxjxO9Xql7+biL3YD7w9IU8zF+xlzD/YxY6a4b7DYA08PXUUCbm2sEljwJF6ERFy2kTGAGcNilg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.3.0", - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/typescript-estree": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0", + "@typescript-eslint/scope-manager": "6.4.0", + "@typescript-eslint/types": "6.4.0", + "@typescript-eslint/typescript-estree": "6.4.0", + "@typescript-eslint/visitor-keys": "6.4.0", "debug": "^4.3.4" }, "engines": { @@ -4959,13 +4697,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.3.0.tgz", - "integrity": "sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.4.0.tgz", + "integrity": "sha512-TUS7vaKkPWDVvl7GDNHFQMsMruD+zhkd3SdVW0d7b+7Zo+bd/hXJQ8nsiUZMi1jloWo6c9qt3B7Sqo+flC1nig==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0" + "@typescript-eslint/types": "6.4.0", + "@typescript-eslint/visitor-keys": "6.4.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -4976,13 +4714,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.3.0.tgz", - "integrity": "sha512-7Oj+1ox1T2Yc8PKpBvOKWhoI/4rWFd1j7FA/rPE0lbBPXTKjdbtC+7Ev0SeBjEKkIhKWVeZSP+mR7y1Db1CdfQ==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.4.0.tgz", + "integrity": "sha512-TvqrUFFyGY0cX3WgDHcdl2/mMCWCDv/0thTtx/ODMY1QhEiyFtv/OlLaNIiYLwRpAxAtOLOY9SUf1H3Q3dlwAg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.3.0", - "@typescript-eslint/utils": "6.3.0", + "@typescript-eslint/typescript-estree": "6.4.0", + "@typescript-eslint/utils": "6.4.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -5003,9 +4741,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.3.0.tgz", - "integrity": "sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.4.0.tgz", + "integrity": "sha512-+FV9kVFrS7w78YtzkIsNSoYsnOtrYVnKWSTVXoL1761CsCRv5wpDOINgsXpxD67YCLZtVQekDDyaxfjVWUJmmg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -5016,13 +4754,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.3.0.tgz", - "integrity": "sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.4.0.tgz", + "integrity": "sha512-iDPJArf/K2sxvjOR6skeUCNgHR/tCQXBsa+ee1/clRKr3olZjZ/dSkXPZjG6YkPtnW6p5D1egeEPMCW6Gn4yLA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0", + "@typescript-eslint/types": "6.4.0", + "@typescript-eslint/visitor-keys": "6.4.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -5076,17 +4814,17 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.3.0.tgz", - "integrity": "sha512-hLLg3BZE07XHnpzglNBG8P/IXq/ZVXraEbgY7FM0Cnc1ehM8RMdn9mat3LubJ3KBeYXXPxV1nugWbQPjGeJk6Q==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.4.0.tgz", + "integrity": "sha512-BvvwryBQpECPGo8PwF/y/q+yacg8Hn/2XS+DqL/oRsOPK+RPt29h5Ui5dqOKHDlbXrAeHUTnyG3wZA0KTDxRZw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.3.0", - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/typescript-estree": "6.3.0", + "@typescript-eslint/scope-manager": "6.4.0", + "@typescript-eslint/types": "6.4.0", + "@typescript-eslint/typescript-estree": "6.4.0", "semver": "^7.5.4" }, "engines": { @@ -5134,12 +4872,12 @@ "dev": true }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.3.0.tgz", - "integrity": "sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.4.0.tgz", + "integrity": "sha512-yJSfyT+uJm+JRDWYRYdCm2i+pmvXJSMtPR9Cq5/XQs4QIgNoLcoRtDdzsLbLsFM/c6um6ohQkg/MLxWvoIndJA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/types": "6.4.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -5190,6 +4928,14 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -5545,6 +5291,15 @@ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -5724,6 +5479,7 @@ "version": "1.6.51", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, "engines": { "node": ">=0.6" } @@ -5753,6 +5509,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, "dependencies": { "big-integer": "^1.6.44" }, @@ -5854,6 +5611,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, "dependencies": { "run-applescript": "^5.0.0" }, @@ -5914,9 +5672,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001519", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz", - "integrity": "sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==", + "version": "1.0.30001521", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001521.tgz", + "integrity": "sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ==", "funding": [ { "type": "opencollective", @@ -6065,6 +5823,11 @@ "node": ">=8" } }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" + }, "node_modules/classnames": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", @@ -6122,10 +5885,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "dev": true + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -6386,13 +6156,13 @@ "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "node_modules/cypress": { - "version": "12.17.3", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.17.3.tgz", - "integrity": "sha512-/R4+xdIDjUSLYkiQfwJd630S81KIgicmQOLXotFxVXkl+eTeVO+3bHXxdi5KBh/OgC33HWN33kHX+0tQR/ZWpg==", + "version": "12.17.4", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.17.4.tgz", + "integrity": "sha512-gAN8Pmns9MA5eCDFSDJXWKUpaL3IDd89N9TtIupjYnzLSmlpVr+ZR+vb4U/qaMp+lB6tBvAmt7504c3Z4RU5KQ==", "dev": true, "hasInstallScript": true, "dependencies": { - "@cypress/request": "^2.88.11", + "@cypress/request": "2.88.12", "@cypress/xvfb": "^1.2.4", "@types/node": "^16.18.39", "@types/sinonjs__fake-timers": "8.1.1", @@ -6427,6 +6197,7 @@ "minimist": "^1.2.8", "ospath": "^1.2.2", "pretty-bytes": "^5.6.0", + "process": "^0.11.10", "proxy-from-env": "1.0.0", "request-progress": "^3.0.0", "semver": "^7.5.3", @@ -6467,9 +6238,9 @@ } }, "node_modules/cypress/node_modules/@types/node": { - "version": "16.18.40", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.40.tgz", - "integrity": "sha512-+yno3ItTEwGxXiS/75Q/aHaa5srkpnJaH+kdkTVJ3DtJEwv92itpKbxU+FjPoh2m/5G9zmUQfrL4A4C13c+iGA==", + "version": "16.18.41", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.41.tgz", + "integrity": "sha512-YZJjn+Aaw0xihnpdImxI22jqGbp0DCgTFKRycygjGx/Y27NnWFJa5FJ7P+MRT3u07dogEeMVh70pWpbIQollTA==", "dev": true }, "node_modules/cypress/node_modules/ansi-styles": { @@ -6700,6 +6471,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, "dependencies": { "bundle-name": "^3.0.0", "default-browser-id": "^3.0.0", @@ -6717,6 +6489,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, "dependencies": { "bplist-parser": "^0.2.0", "untildify": "^4.0.0" @@ -6732,6 +6505,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", @@ -6754,6 +6528,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, "engines": { "node": ">=10" }, @@ -6765,6 +6540,7 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, "engines": { "node": ">=14.18.0" } @@ -6773,6 +6549,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -6784,6 +6561,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, "engines": { "node": ">=12" }, @@ -6795,6 +6573,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, "dependencies": { "path-key": "^4.0.0" }, @@ -6809,6 +6588,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, "dependencies": { "mimic-fn": "^4.0.0" }, @@ -6823,6 +6603,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, "engines": { "node": ">=12" }, @@ -6834,6 +6615,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, "engines": { "node": ">=12" }, @@ -6909,6 +6691,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, "dependencies": { "path-type": "^4.0.0" }, @@ -6973,9 +6756,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.488", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.488.tgz", - "integrity": "sha512-Dv4sTjiW7t/UWGL+H8ZkgIjtUAVZDgb/PwGWvMsCT7jipzUV/u5skbLXPFKb6iV0tiddVi/bcS2/kUrczeWgIQ==" + "version": "1.4.495", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.495.tgz", + "integrity": "sha512-mwknuemBZnoOCths4GtpU/SDuVMp3uQHKa2UNJT9/aVD6WVRjGpXOxRGX7lm6ILIenTdGXPSTCTDaWos5tEU8Q==" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -7109,6 +6892,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-iterator-helpers": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.13.tgz", + "integrity": "sha512-LK3VGwzvaPWobO8xzXXGRUOGw8Dcjyfk62CsY/wfHN75CwsJPbuypOYJxK6g5RyEL8YDjIWcl6jgd8foO6mmrA==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.3", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.0", + "safe-array-concat": "^1.0.0" + } + }, "node_modules/es-set-tostringtag": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", @@ -7200,14 +7005,14 @@ } }, "node_modules/eslint": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz", - "integrity": "sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", + "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.1", - "@eslint/js": "^8.46.0", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "^8.47.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -7218,7 +7023,7 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.2", + "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", @@ -7283,18 +7088,17 @@ } }, "node_modules/eslint-import-resolver-typescript": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz", - "integrity": "sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.0.tgz", + "integrity": "sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg==", "dependencies": { "debug": "^4.3.4", "enhanced-resolve": "^5.12.0", "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", "get-tsconfig": "^4.5.0", - "globby": "^13.1.3", "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "synckit": "^0.8.5" + "is-glob": "^4.0.3" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -7307,35 +7111,6 @@ "eslint-plugin-import": "*" } }, - "node_modules/eslint-import-resolver-typescript/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-import-resolver-typescript/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint-module-utils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", @@ -7509,15 +7284,16 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.33.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.1.tgz", - "integrity": "sha512-L093k0WAMvr6VhNwReB8VgOq5s2LesZmrpPdKz/kZElQDzqS7G7+DnKoqT+w4JwuiGeAhAvHO0fvy0Eyk4ejDA==", + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", "dev": true, "dependencies": { "array-includes": "^3.1.6", "array.prototype.flatmap": "^1.3.1", "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", @@ -7604,9 +7380,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", - "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -7680,9 +7456,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dependencies": { "type-fest": "^0.20.2" }, @@ -8300,6 +8076,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -8349,9 +8126,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.6.2.tgz", - "integrity": "sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.0.tgz", + "integrity": "sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -8805,10 +8582,13 @@ } }, "node_modules/import-in-the-middle": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.3.5.tgz", - "integrity": "sha512-yzHlBqi1EBFrkieAnSt8eTgO5oLSl+YJ7qaOpUH/PMqQOMZoQ/RmDlwnTLQrwYto+gHYjRG+i/IbsB1eDx32NQ==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.4.2.tgz", + "integrity": "sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw==", "dependencies": { + "acorn": "^8.8.2", + "acorn-import-assertions": "^1.9.0", + "cjs-module-lexer": "^1.2.2", "module-details-from-path": "^1.0.3" } }, @@ -8914,6 +8694,21 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -9013,6 +8808,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, "bin": { "is-docker": "cli.js" }, @@ -9031,14 +8827,42 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "devOptional": true, "engines": { "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -9063,6 +8887,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, "dependencies": { "is-docker": "^3.0.0" }, @@ -9080,6 +8905,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, "bin": { "is-docker": "cli.js" }, @@ -9106,6 +8932,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -9162,6 +8997,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", @@ -9177,6 +9021,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, "engines": { "node": ">=8" }, @@ -9244,6 +9089,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -9255,6 +9109,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-what": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", @@ -9265,6 +9132,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, "dependencies": { "is-docker": "^2.0.0" }, @@ -9298,6 +9166,19 @@ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, + "node_modules/iterator.prototype": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.0.tgz", + "integrity": "sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "has-tostringtag": "^1.0.0", + "reflect.getprototypeof": "^1.0.3" + } + }, "node_modules/joi": { "version": "17.9.2", "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", @@ -9564,11 +9445,6 @@ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -9770,11 +9646,6 @@ "node": ">=8" } }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -9899,7 +9770,8 @@ "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "node_modules/merge2": { "version": "1.4.1", @@ -9957,6 +9829,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, "engines": { "node": ">=6" } @@ -10110,12 +9983,6 @@ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "node_modules/needle": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", @@ -10206,6 +10073,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, "dependencies": { "path-key": "^3.0.0" }, @@ -10347,6 +10215,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -10595,9 +10464,9 @@ } }, "node_modules/postcss": { - "version": "8.4.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", - "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", + "version": "8.4.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", + "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", "funding": [ { "type": "opencollective", @@ -10635,9 +10504,9 @@ } }, "node_modules/prettier": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.1.tgz", - "integrity": "sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", + "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -10681,6 +10550,15 @@ "node": ">=6" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -10713,34 +10591,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/protobufjs": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", - "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/protobufjs/node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -11054,11 +10904,10 @@ } }, "node_modules/react-inlinesvg": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/react-inlinesvg/-/react-inlinesvg-4.0.0.tgz", - "integrity": "sha512-b/pnbmuluXkTs+URnyAePI9h1UyjwCVWipCgy7x6K8OuX98JLk7WgQ/cp3gVcGgaHwg7IVSqHKCoKpHzYRpjsw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/react-inlinesvg/-/react-inlinesvg-4.0.2.tgz", + "integrity": "sha512-JHYNAABfVsFe6RXJtwS4q38XRVm75GCAof6fVvOJ+AwXi15SVWK1Ow6ZXbI/azbaZ6vjD/4gnjag2VnDoD2NvA==", "dependencies": { - "exenv": "^1.2.2", "react-from-dom": "^0.6.2" }, "peerDependencies": { @@ -11239,29 +11088,29 @@ } }, "node_modules/react-router": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.14.2.tgz", - "integrity": "sha512-09Zss2dE2z+T1D03IheqAFtK4UzQyX8nFPWx6jkwdYzGLXd5ie06A6ezS2fO6zJfEb/SpG6UocN2O1hfD+2urQ==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.15.0.tgz", + "integrity": "sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==", "dependencies": { - "@remix-run/router": "1.7.2" + "@remix-run/router": "1.8.0" }, "engines": { - "node": ">=14" + "node": ">=14.0.0" }, "peerDependencies": { "react": ">=16.8" } }, "node_modules/react-router-dom": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.14.2.tgz", - "integrity": "sha512-5pWX0jdKR48XFZBuJqHosX3AAHjRAzygouMTyimnBPOLdY3WjzUSKhus2FVMihUFWzeLebDgr4r8UeQFAct7Bg==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.15.0.tgz", + "integrity": "sha512-aR42t0fs7brintwBGAv2+mGlCtgtFQeOzK0BM1/OiqEzRejOZtpMZepvgkscpMUnKb8YO84G7s3LsHnnDNonbQ==", "dependencies": { - "@remix-run/router": "1.7.2", - "react-router": "6.14.2" + "@remix-run/router": "1.8.0", + "react-router": "6.15.0" }, "engines": { - "node": ">=14" + "node": ">=14.0.0" }, "peerDependencies": { "react": ">=16.8", @@ -11471,6 +11320,26 @@ "redux": "^4" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.3.tgz", + "integrity": "sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.1", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/refractor": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", @@ -11586,14 +11455,15 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/require-in-the-middle": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-6.0.0.tgz", - "integrity": "sha512-+dtWQ7l2lqQDxheaG3jjyN1QI37gEwvzACSgjYi4/C2y+ZTUMeRW8BIOm+9NBKvwaMBUSZfPXVOt1skB0vBkRw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.2.0.tgz", + "integrity": "sha512-3TLx5TGyAY6AOqLBoXmHkNql0HIf2RGbuMgCDT2WO/uGVAPJs6h7Kl+bN6TIZGd9bWhWPwnDnTHGtW8Iu77sdw==", "dependencies": { "debug": "^4.1.1", "module-details-from-path": "^1.0.3", @@ -11783,6 +11653,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, "dependencies": { "execa": "^5.0.0" }, @@ -11797,6 +11668,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -11819,6 +11691,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, "engines": { "node": ">=10" }, @@ -11830,6 +11703,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, "engines": { "node": ">=10.17.0" } @@ -11922,9 +11796,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.64.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.2.tgz", - "integrity": "sha512-TnDlfc+CRnUAgLO9D8cQLFu/GIjJIzJCGkE7o4ekIGQOH7T3GetiRR/PsTWJUHhkzcSPrARkPI+gNWn5alCzDg==", + "version": "1.66.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.66.0.tgz", + "integrity": "sha512-C3U+RgpAAlTXULZkWwzfysgbbBBo8IZudNAOJAVBLslFbIaZv4MBPkTqhuvpK4lqgdoFiWhnOGMoV4L1FyOBag==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -12061,7 +11935,8 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "devOptional": true }, "node_modules/simple-concat": { "version": "1.0.1", @@ -12364,6 +12239,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "devOptional": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -12376,7 +12252,8 @@ "node_modules/string-width/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "devOptional": true }, "node_modules/string.prototype.matchall": { "version": "4.0.8", @@ -12462,6 +12339,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, "engines": { "node": ">=6" } @@ -12568,11 +12446,12 @@ "dev": true }, "node_modules/swr": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/swr/-/swr-2.2.0.tgz", - "integrity": "sha512-AjqHOv2lAhkuUdIiBu9xbuettzAzWXmCEcLONNKJRba87WAefz8Ca9d6ds/SzrPc235n1IxWYdhJ2zF3MNUaoQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.2.1.tgz", + "integrity": "sha512-KJVA7dGtOBeZ+2sycEuzUfVIP5lZ/cd0xjevv85n2YG0x1uHJQicjAtahVZL6xG3+TjqhbBqimwYzVo3saeVXQ==", "dev": true, "dependencies": { + "client-only": "^0.0.1", "use-sync-external-store": "^1.2.0" }, "peerDependencies": { @@ -12583,6 +12462,7 @@ "version": "0.8.5", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, "dependencies": { "@pkgr/utils": "^2.3.1", "tslib": "^2.5.0" @@ -12699,6 +12579,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, "engines": { "node": ">=12" }, @@ -13086,6 +12967,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, "engines": { "node": ">=8" } @@ -13409,6 +13291,47 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-typed-array": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", @@ -13440,6 +13363,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -13456,6 +13380,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -13470,6 +13395,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -13480,7 +13406,8 @@ "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/wrappy": { "version": "1.0.2", @@ -13499,6 +13426,7 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, "engines": { "node": ">=10" } @@ -13520,6 +13448,7 @@ "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -13537,6 +13466,7 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, "engines": { "node": ">=12" } diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/udistub/form/partials/OppholdSammeVilkaar.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/udistub/form/partials/OppholdSammeVilkaar.tsx index 87dabe7bddd..833d87dd0d2 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/udistub/form/partials/OppholdSammeVilkaar.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/udistub/form/partials/OppholdSammeVilkaar.tsx @@ -29,7 +29,7 @@ export const OppholdSammeVilkaar = ({ formikBag }: { formikBag: FormikProps afterChange={(option: Option) => formikBag.setFieldValue( `${pdlBasePath}[0].type`, - option ? option.value : 'OPPLYSNING_MANGLER' + option ? option.value : 'OPPLYSNING_MANGLER', ) } options={Options('oppholdstillatelseType')} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/udistub/form/partials/Oppholdsstatus.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/udistub/form/partials/Oppholdsstatus.tsx index 2864ff92f6f..312566b6366 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/udistub/form/partials/Oppholdsstatus.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/udistub/form/partials/Oppholdsstatus.tsx @@ -6,6 +6,7 @@ import { OppholdSammeVilkaar } from '@/components/fagsystem/udistub/form/partial import { IkkeOppholdSammeVilkaar } from '@/components/fagsystem/udistub/form/partials/IkkeOppholdSammeVilkaar' import { Option } from '@/service/SelectOptionsOppslag' import { FormikProps } from 'formik' +import { fixTimezone } from '@/components/ui/form/formUtils' const basePath = 'udistub.oppholdStatus' const pdlBasePath = 'pdldata.person.opphold' @@ -14,7 +15,7 @@ const harOppholdsTillatelsePath = 'udistub.harOppholdsTillatelse' const findInitialStatus = (formikBag: FormikProps) => { const oppholdsstatusObj = formikBag.values.udistub.oppholdStatus const eosEllerEFTAOpphold = Object.keys(oppholdsstatusObj).some((key) => - key.includes('eosEllerEFTA') + key.includes('eosEllerEFTA'), ) if (eosEllerEFTAOpphold) { if (oppholdsstatusObj.eosEllerEFTABeslutningOmOppholdsrettPeriode) { @@ -137,14 +138,14 @@ export const Oppholdsstatus = ({ formikBag }: { formikBag: FormikProps }) = - formikBag.setFieldValue(`${pdlBasePath}[0].oppholdFra`, dato) + formikBag.setFieldValue(`${pdlBasePath}[0].oppholdFra`, fixTimezone(dato)) } label="Oppholdstillatelse fra dato" /> - formikBag.setFieldValue(`${pdlBasePath}[0].oppholdTil`, dato) + formikBag.setFieldValue(`${pdlBasePath}[0].oppholdTil`, fixTimezone(dato)) } label="Oppholdstillatelse til dato" /> 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 fe0881d347f..fcc6e5fc13d 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 @@ -71,7 +71,9 @@ const P_FormikDatepicker = ({ fastfield, addHour = false, ...props }) => ( if (props.afterChange) props.afterChange(date) let val = fixTimezone(date)?.toISOString().substring(0, 19) if (addHour) { - val = addHours(new Date(date), 1).toISOString().substring(0, 19) + val = addHours(new Date(fixTimezone(date)), 3) + .toISOString() + .substring(0, 19) } return field.onChange(SyntEvent(field.name, val)) } From b948ed7ee0ada9657b11ca529dc358d2bb66334f Mon Sep 17 00:00:00 2001 From: kristenhaerum Date: Fri, 18 Aug 2023 12:45:08 +0200 Subject: [PATCH 17/22] Fiks for sivilstand ugift --- .../PensjonAlderspensjonMappingStrategy.java | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/mapper/PensjonAlderspensjonMappingStrategy.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/mapper/PensjonAlderspensjonMappingStrategy.java index 0ee81b4a380..766446f2e1f 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/mapper/PensjonAlderspensjonMappingStrategy.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/mapper/PensjonAlderspensjonMappingStrategy.java @@ -11,7 +11,9 @@ import org.springframework.stereotype.Component; import java.time.LocalDate; +import java.util.Collection; import java.util.List; +import java.util.Objects; import java.util.concurrent.atomic.AtomicReference; import static java.util.Objects.isNull; @@ -68,10 +70,30 @@ public void mapAtoB(PensjonData.Alderspensjon alderspensjon, AlderspensjonReques request.setMiljoer((List) context.getProperty("miljoer")); request.setStatsborgerskap("NOR"); - var relasjoner = (List) context.getProperty("relasjoner"); + var personer = (List) context.getProperty("relasjoner"); + request.setSivilstand(personer.stream() + .filter(person -> hovedperson.equals(person.getIdent())) + .map(PdlPersonBolk.PersonBolk::getPerson) + .map(PdlPerson.Person::getSivilstand) + .flatMap(Collection::stream) + .map(PdlPerson.Sivilstand::getType) + .map(PensjonAlderspensjonMappingStrategy::mapSivilstand) + .filter(Objects::nonNull) + .findFirst() + .orElse(null)); + + request.setSivilstandDatoFom(personer.stream() + .filter(person -> hovedperson.equals(person.getIdent())) + .map(PdlPersonBolk.PersonBolk::getPerson) + .map(PdlPerson.Person::getSivilstand) + .flatMap(Collection::stream) + .map(PdlPerson.Sivilstand::getGyldigFraOgMed) + .filter(Objects::nonNull) + .findFirst() + .orElse(null)); var partner = new AtomicReference(); - relasjoner.stream() + personer.stream() .filter(person -> person.getIdent().equals(hovedperson)) .forEach(personBolk -> personBolk.getPerson().getSivilstand().stream() .filter(PdlPerson.Sivilstand::isGift) @@ -82,11 +104,11 @@ public void mapAtoB(PensjonData.Alderspensjon alderspensjon, AlderspensjonReques partner.set(sivilstand.getRelatertVedSivilstand()); })); - if (relasjoner.stream().anyMatch(person -> person.getIdent().equals(partner.get())) && + if (personer.stream().anyMatch(person -> person.getIdent().equals(partner.get())) && !alderspensjon.getRelasjoner().isEmpty()) { request.setRelasjonListe(mapperFacade.mapAsList(alderspensjon.getRelasjoner(), AlderspensjonRequest.SkjemaRelasjon.class)); - relasjoner.stream() + personer.stream() .filter(personBolk -> personBolk.getIdent().equals(partner.get())) .forEach(partnerPerson -> { request.getRelasjonListe().get(0).setFnr(partnerPerson.getIdent()); @@ -111,7 +133,7 @@ public void mapAtoB(PensjonData.Alderspensjon alderspensjon, AlderspensjonReques partnerPerson.getPerson().getForelderBarnRelasjon().stream() .filter(PdlPerson.ForelderBarnRelasjon::isBarn) .map(PdlPerson.ForelderBarnRelasjon::getRelatertPersonsIdent) - .anyMatch(barnAvPartner -> relasjoner.stream() + .anyMatch(barnAvPartner -> personer.stream() .filter(person -> hovedperson.equals(person.getIdent())) .map(PdlPersonBolk.PersonBolk::getPerson) .anyMatch(person -> person.getForelderBarnRelasjon().stream() From 2adbfdcbeb70b00fa448772faef0a4226503aa5f Mon Sep 17 00:00:00 2001 From: stigus Date: Mon, 21 Aug 2023 10:04:13 +0200 Subject: [PATCH 18/22] Deploy analyse service for ny key --- .../AppTilgangAnalyseServiceApplicationStarter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/app-tilgang-analyse-service/src/main/java/no/nav/testnav/apps/apptilganganalyseservice/AppTilgangAnalyseServiceApplicationStarter.java b/apps/app-tilgang-analyse-service/src/main/java/no/nav/testnav/apps/apptilganganalyseservice/AppTilgangAnalyseServiceApplicationStarter.java index 9c51de93593..293c2c8931f 100644 --- a/apps/app-tilgang-analyse-service/src/main/java/no/nav/testnav/apps/apptilganganalyseservice/AppTilgangAnalyseServiceApplicationStarter.java +++ b/apps/app-tilgang-analyse-service/src/main/java/no/nav/testnav/apps/apptilganganalyseservice/AppTilgangAnalyseServiceApplicationStarter.java @@ -18,4 +18,4 @@ public class AppTilgangAnalyseServiceApplicationStarter { public static void main(String[] args) { SpringApplication.run(AppTilgangAnalyseServiceApplicationStarter.class, args); } -} +} \ No newline at end of file From b30bd4d597443938fdd81d023fdb19086152c556 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristen=20H=C3=A6rum?= Date: Tue, 22 Aug 2023 08:18:00 +0200 Subject: [PATCH 19/22] Bugfix/database multiple objekter (#3246) * Refaktorert + equals/hashcode/toString #deploy-test-dolly-backend * Benytter opplysningId ved synkronisiering av person --- .../dolly/DollyBackendApplicationStarter.java | 2 +- .../PensjonforvalterClient.java | 15 +- .../command/GetMiljoerCommand.java | 3 +- .../personservice/PersonServiceClient.java | 100 +++- .../personservice/PersonServiceConsumer.java | 15 +- .../command/PersonServiceExistCommand.java | 4 + .../command/PersonServiceSyncCommand.java | 40 -- .../service/GjenopprettGruppeService.java | 13 + .../no/nav/dolly/domain/jpa/Bestilling.java | 84 ++++ .../dolly/domain/jpa/BestillingKontroll.java | 35 ++ .../nav/dolly/domain/jpa/BestillingMal.java | 48 +- .../dolly/domain/jpa/BestillingProgress.java | 110 ++++- .../java/no/nav/dolly/domain/jpa/Bruker.java | 61 ++- .../dolly/domain/jpa/BrukerFavoritter.java | 35 +- .../no/nav/dolly/domain/jpa/InfoStripe.java | 41 ++ .../domain/jpa/OrganisasjonBestilling.java | 53 +++ .../domain/jpa/OrganisasjonBestillingMal.java | 48 +- .../jpa/OrganisasjonBestillingProgress.java | 38 ++ .../no/nav/dolly/domain/jpa/Testgruppe.java | 77 ++-- .../no/nav/dolly/domain/jpa/Testident.java | 66 ++- .../dolly/domain/jpa/TransaksjonMapping.java | 47 ++ .../service/TransaksjonIdMappingStrategy.java | 3 +- .../pdlperson/pdl-api-schema.graphql | 11 +- .../consumer/PdlApiConsumer.java | 61 ++- .../consumer/command/GetPdlAktoerCommand.java | 5 +- .../dto/pdl/graphql/Bostedsadresse.java | 2 +- .../consumer/dto/pdl/graphql/Foedsel.java | 3 +- .../graphql/Folkeregisteridentifikator.java | 2 +- .../graphql/Folkeregisterpersonstatus.java | 14 + .../consumer/dto/pdl/graphql/HentPerson.java | 48 +- .../consumer/dto/pdl/graphql/MetadataDTO.java | 21 + .../consumer/dto/pdl/graphql/Navn.java | 2 +- .../consumer/dto/pdl/graphql/PdlAktoer.java | 3 + .../controller/PersonController.java | 16 +- .../personservice/service/PdlSyncService.java | 125 ----- .../personservice/service/PersonService.java | 6 +- .../src/main/resources/pdl/.graphqlconfig | 23 +- .../main/resources/pdl/pdl-api-schema.graphql | 429 +++++++++++++++--- .../main/resources/pdl/pdlPersonQuery.graphql | 37 ++ 39 files changed, 1340 insertions(+), 406 deletions(-) delete mode 100644 apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/personservice/command/PersonServiceSyncCommand.java create mode 100644 apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/Folkeregisterpersonstatus.java create mode 100644 apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/MetadataDTO.java delete mode 100644 apps/person-service/src/main/java/no/nav/testnav/apps/personservice/service/PdlSyncService.java create mode 100644 apps/person-service/src/main/resources/pdl/pdlPersonQuery.graphql diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/DollyBackendApplicationStarter.java b/apps/dolly-backend/src/main/java/no/nav/dolly/DollyBackendApplicationStarter.java index 317d2b3da4a..39fb82ea036 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/DollyBackendApplicationStarter.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/DollyBackendApplicationStarter.java @@ -9,4 +9,4 @@ public static void main(String[] args) { SpringApplication.run(DollyBackendApplicationStarter.class, args); } -} +} \ No newline at end of file diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClient.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClient.java index 2edbdd9028d..df640cdb18e 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClient.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClient.java @@ -126,8 +126,13 @@ public Flux gjenopprett(RsDollyUtvidetBestilling bestilling, Dolly .collectList() .map(this::getPersonData) .flatMapMany(Flux::collectList) - .map(relasjoner -> Flux.concat( - opprettPersoner(dollyPerson.getIdent(), tilgjengeligeMiljoer, relasjoner) + .doOnNext(persondata -> { + if (persondata.isEmpty()) { + log.warn("Persondata for {} gir tom response fra PDL", dollyPerson.getIdent()); + } + }) + .map(persondata -> Flux.concat( + opprettPersoner(dollyPerson.getIdent(), tilgjengeligeMiljoer, persondata) .map(response -> PENSJON_FORVALTER + decodeStatus(response, dollyPerson.getIdent())), lagreTpForhold(bestilling.getPensjonforvalter(), dollyPerson, bestilteMiljoer.get()) @@ -135,7 +140,7 @@ public Flux gjenopprett(RsDollyUtvidetBestilling bestilling, Dolly lagreAlderspensjon( bestilling1.getPensjonforvalter(), - relasjoner, + persondata, dollyPerson.getIdent(), bestilteMiljoer.get(), isOpprettEndre, @@ -210,9 +215,9 @@ public void release(List identer) { } private Flux opprettPersoner(String hovedperson, Set miljoer, - List relasjoner) { + List personer) { - return Flux.fromIterable(relasjoner) + return Flux.fromIterable(personer) .map(person -> mapperFacade.map(person, PensjonPersonRequest.class)) .flatMap(request -> pensjonforvalterConsumer.opprettPerson(request, miljoer) .filter(response -> hovedperson.equals(request.getFnr()))); diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/command/GetMiljoerCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/command/GetMiljoerCommand.java index ee585be13e4..9dd85e76b1f 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/command/GetMiljoerCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/command/GetMiljoerCommand.java @@ -46,6 +46,7 @@ public Mono> call() { .doOnError(WebClientFilter::logErrorMessage) .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) .filter(WebClientFilter::is5xxException)) - .onErrorResume(throwable -> Mono.just(emptySet())); + .onErrorResume(throwable -> Mono.just(emptySet())) + .cache(Duration.ofHours(1)); } } \ No newline at end of file diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/personservice/PersonServiceClient.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/personservice/PersonServiceClient.java index ed9878bbbf7..ee476d8d548 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/personservice/PersonServiceClient.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/personservice/PersonServiceClient.java @@ -1,9 +1,11 @@ package no.nav.dolly.bestilling.personservice; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.dolly.bestilling.ClientFuture; -import no.nav.dolly.bestilling.pdldata.PdlDataConsumer; import no.nav.dolly.bestilling.personservice.dto.PersonServiceResponse; import no.nav.dolly.consumer.pdlperson.PdlPersonConsumer; import no.nav.dolly.domain.PdlPerson; @@ -12,20 +14,27 @@ import no.nav.dolly.domain.jpa.Testident; import no.nav.dolly.domain.resultset.dolly.DollyPerson; import no.nav.dolly.errorhandling.ErrorStatusDecoder; +import no.nav.dolly.exceptions.DollyFunctionalException; import no.nav.dolly.util.TransactionHelperService; -import no.nav.testnav.libs.dto.pdlforvalter.v1.FullPersonDTO; import no.nav.testnav.libs.dto.pdlforvalter.v1.FullmaktDTO; -import no.nav.testnav.libs.dto.pdlforvalter.v1.PersonDTO; -import no.nav.testnav.libs.dto.pdlforvalter.v1.RelasjonType; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.util.StringUtil; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; import java.time.Duration; import java.time.LocalTime; +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.function.Function; +import java.util.stream.Collectors; import java.util.stream.Stream; +import java.util.stream.StreamSupport; import static java.util.Objects.nonNull; import static org.apache.commons.lang3.BooleanUtils.isNotTrue; @@ -37,13 +46,13 @@ public class PersonServiceClient { private static final String PDL_SYNC_START = "Info: Synkronisering mot PDL startet ..."; - private static final int TIMEOUT = 100; + private static final int TIMEOUT = 500; private static final int MAX_SEKUNDER = 30; private final PersonServiceConsumer personServiceConsumer; private final ErrorStatusDecoder errorStatusDecoder; private final TransactionHelperService transactionHelperService; - private final PdlDataConsumer pdlDataConsumer; private final PdlPersonConsumer pdlPersonConsumer; + private final ObjectMapper objectMapper; public Flux syncPerson(DollyPerson dollyPerson, BestillingProgress progress) { @@ -51,28 +60,70 @@ public Flux syncPerson(DollyPerson dollyPerson, BestillingProgress transactionHelperService.persister(progress, BestillingProgress::setPdlPersonStatus, PDL_SYNC_START); } var startTime = System.currentTimeMillis(); - return Flux.from(getIdentWithRelasjoner(dollyPerson) - .flatMap(ident -> getPersonService(LocalTime.now().plusSeconds(MAX_SEKUNDER), LocalTime.now(), - new PersonServiceResponse(), ident)) - .doOnNext(status -> logStatus(status, startTime)) - .collectList() - .map(status -> futurePersist(dollyPerson, progress, status))); + + return Flux.from(getIdentWithRelasjoner(dollyPerson, progress) + .flatMap(status -> getPersonService(LocalTime.now().plusSeconds(MAX_SEKUNDER), LocalTime.now(), + new PersonServiceResponse(), status)) + .doOnNext(status -> logStatus(status, startTime)) + .collectList() + .map(status -> futurePersist(dollyPerson, progress, status))); + } + + private Map> getHendelseIder(BestillingProgress progress) { + + var json = transactionHelperService.getProgress(progress, BestillingProgress::getPdlOrdreStatus); + try { + var tree = objectMapper.readTree(json); + + var hovedperson = Map.of(tree.path("hovedperson").path("ident").asText(), + toStream(tree.path("hovedperson").path("ordrer")) + .map(entry -> toStream(entry.path("hendelser")) + .map(hendelse -> hendelse.path("hendelseId").asText()) + .collect(Collectors.toSet())) + .flatMap(Collection::stream) + .filter(StringUtil::isNotBlank) + .collect(Collectors.toSet())); + + var relasjoner = toStream(tree.path("relasjoner")) + .collect(Collectors.toMap(relasjon -> relasjon.path("ident").asText(), + relasjon -> toStream(relasjon.path("ordrer")) + .map(entry -> toStream(entry.path("hendelser")) + .map(hendelse -> hendelse.path("hendelseId").asText()) + .collect(Collectors.toSet())) + .flatMap(Collection::stream) + .filter(StringUtils::isNotBlank) + .collect(Collectors.toSet()))); + + return Stream.of(hovedperson, relasjoner) + .map(Map::entrySet) + .flatMap(Collection::stream) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + } catch (JsonProcessingException e) { + + throw new DollyFunctionalException("Feilet å hente hendelseId fra opprettinng.", e); + } + } + + private Stream toStream(JsonNode node) { + + return StreamSupport.stream(getIterable(node.elements()).spliterator(), false); + } + + private Iterable getIterable(Iterator iterator) { + + return () -> iterator; } - private Flux getIdentWithRelasjoner(DollyPerson dollyPerson) { + private Flux>> getIdentWithRelasjoner(DollyPerson dollyPerson, BestillingProgress progress) { if (dollyPerson.getMaster() == Testident.Master.PDLF) { - return Flux.concat(Flux.just(dollyPerson.getIdent()), - pdlDataConsumer.getPersoner(List.of(dollyPerson.getIdent())) - .map(FullPersonDTO::getRelasjoner) - .flatMap(Flux::fromIterable) - .filter(relasjonType -> RelasjonType.GAMMEL_IDENTITET != relasjonType.getRelasjonType()) - .map(FullPersonDTO.RelasjonDTO::getRelatertPerson) - .map(PersonDTO::getIdent)); + return Flux.fromIterable(getHendelseIder(progress).entrySet()); + } else { - return Flux.concat(Flux.just(dollyPerson.getIdent()), + return Flux.concat(Flux.just(Map.entry(dollyPerson.getIdent(), new HashSet<>())), pdlPersonConsumer.getPdlPersoner(List.of(dollyPerson.getIdent())) .filter(pdlPersonBolk -> nonNull(pdlPersonBolk.getData())) .map(PdlPersonBolk::getData) @@ -88,7 +139,8 @@ private Flux getIdentWithRelasjoner(DollyPerson dollyPerson) { .filter(Objects::nonNull), person.getPerson().getFullmakt().stream() .map(FullmaktDTO::getMotpartsPersonident)) - .flatMap(Function.identity())))); + .flatMap(Function.identity()))) + .map(ident -> Map.entry(ident, new HashSet<>()))); } } @@ -131,7 +183,7 @@ private void logStatus(PersonServiceResponse status, long startTime) { } private Flux getPersonService(LocalTime tidSlutt, LocalTime tidNo, PersonServiceResponse - response, String ident) { + response, Map.Entry> ident) { if (isTrue(response.getExists()) || tidNo.isAfter(tidSlutt) || nonNull(response.getStatus()) && !response.getStatus().is2xxSuccessful()) { @@ -140,7 +192,7 @@ private Flux getPersonService(LocalTime tidSlutt, LocalTi } else { return Flux.just(1) .delayElements(Duration.ofMillis(TIMEOUT)) - .flatMap(delayed -> personServiceConsumer.isPerson(ident) + .flatMap(delayed -> personServiceConsumer.isPerson(ident.getKey(), ident.getValue()) .flatMapMany(resultat -> getPersonService(tidSlutt, LocalTime.now(), resultat, ident))); } } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/personservice/PersonServiceConsumer.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/personservice/PersonServiceConsumer.java index 5f20d5b6711..06bbf0c1fd6 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/personservice/PersonServiceConsumer.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/personservice/PersonServiceConsumer.java @@ -2,7 +2,6 @@ import no.nav.dolly.bestilling.ConsumerStatus; import no.nav.dolly.bestilling.personservice.command.PersonServiceExistCommand; -import no.nav.dolly.bestilling.personservice.command.PersonServiceSyncCommand; import no.nav.dolly.bestilling.personservice.dto.PersonServiceResponse; import no.nav.dolly.config.credentials.PersonServiceProperties; import no.nav.dolly.metrics.Timed; @@ -10,9 +9,10 @@ import no.nav.testnav.libs.standalone.servletsecurity.exchange.TokenExchange; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.util.Set; + @Service public class PersonServiceConsumer implements ConsumerStatus { @@ -33,17 +33,10 @@ public PersonServiceConsumer( } @Timed(name = "providers", tags = {"operation", "personService_isPerson"}) - public Mono isPerson(String ident) { - - return tokenService.exchange(serviceProperties) - .flatMap(token -> new PersonServiceExistCommand(webClient, ident, token.getTokenValue()).call()); - } - - @Timed(name = "providers", tags = {"operation", "personService_pdlSyncReady"}) - public Flux getPdlSyncReady(String ident) { + public Mono isPerson(String ident, Set opplysningId) { return tokenService.exchange(serviceProperties) - .flatMapMany(token -> new PersonServiceSyncCommand(webClient, ident, token.getTokenValue()).call()); + .flatMap(token -> new PersonServiceExistCommand(webClient, ident, opplysningId, token.getTokenValue()).call()); } @Override diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/personservice/command/PersonServiceExistCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/personservice/command/PersonServiceExistCommand.java index 0894b2f0b93..8a82a206ab6 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/personservice/command/PersonServiceExistCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/personservice/command/PersonServiceExistCommand.java @@ -11,6 +11,8 @@ import reactor.util.retry.Retry; import java.time.Duration; +import java.util.Optional; +import java.util.Set; import java.util.concurrent.Callable; import static no.nav.dolly.util.TokenXUtil.getUserJwt; @@ -20,6 +22,7 @@ public class PersonServiceExistCommand implements Callable opplysningId; private final String token; private static final String PERSON_URL = "/api/v1/personer/{ident}/exists"; @@ -29,6 +32,7 @@ public Mono call() { return webClient.get() .uri(uriBuilder -> uriBuilder.path(PERSON_URL) + .queryParamIfPresent("opplysningId", Optional.ofNullable(opplysningId.isEmpty() ? null : opplysningId)) .build(ident)) .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) .header(UserConstant.USER_HEADER_JWT, getUserJwt()) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/personservice/command/PersonServiceSyncCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/personservice/command/PersonServiceSyncCommand.java deleted file mode 100644 index 018c075a613..00000000000 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/personservice/command/PersonServiceSyncCommand.java +++ /dev/null @@ -1,40 +0,0 @@ -package no.nav.dolly.bestilling.personservice.command; - -import lombok.RequiredArgsConstructor; -import no.nav.dolly.util.WebClientFilter; -import no.nav.testnav.libs.securitycore.config.UserConstant; -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; -import java.util.concurrent.Callable; - -import static no.nav.dolly.util.TokenXUtil.getUserJwt; - -@RequiredArgsConstructor -public class PersonServiceSyncCommand implements Callable> { - - private static final String PERSON_URL = "/api/v1/personer/{ident}/sync"; - private final WebClient webClient; - private final String ident; - private final String token; - - @Override - public Flux call() { - - return webClient.get() - .uri(uriBuilder -> uriBuilder.path(PERSON_URL) - .build(ident)) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) - .header(UserConstant.USER_HEADER_JWT, getUserJwt()) - .retrieve() - .bodyToFlux(Boolean.class) - .doOnError(WebClientFilter::logErrorMessage) - .onErrorResume(Mono::error) - .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) - .filter(WebClientFilter::is5xxException)); - } -} \ No newline at end of file diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/service/GjenopprettGruppeService.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/service/GjenopprettGruppeService.java index 0f6845cfe6c..43854168ad6 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/service/GjenopprettGruppeService.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/service/GjenopprettGruppeService.java @@ -9,6 +9,7 @@ import no.nav.dolly.bestilling.personservice.PersonServiceClient; import no.nav.dolly.domain.jpa.Bestilling; import no.nav.dolly.domain.jpa.BestillingProgress; +import no.nav.dolly.domain.resultset.RsDollyBestilling; import no.nav.dolly.errorhandling.ErrorStatusDecoder; import no.nav.dolly.metrics.CounterCustomRegistry; import no.nav.dolly.repository.IdentRepository.GruppeBestillingIdent; @@ -99,6 +100,9 @@ public void executeAsync(Bestilling bestilling) { .concatMap(bestilling1 -> Flux.just(bestilling1) .filter(cobestilling -> ident.equals(cobestilling.getIdent())) .flatMapSequential(cobestilling -> createBestilling(bestilling, cobestilling) + .filter(bestillingRequest -> bestillingRequest.getId() == + isFirstBestilling(coBestillinger, cobestilling.getIdent()) || + RsDollyBestilling.isNonEmpty(bestillingRequest)) .doOnNext(request -> log.info("Startet gjenopprett bestilling {} for ident: {}", request.getId(), testident.getIdent())) .flatMapSequential(bestillingRequest -> Flux.concat( @@ -122,4 +126,13 @@ public void executeAsync(Bestilling bestilling) { .subscribe(); } } + + private long isFirstBestilling(List coBestillinger, String ident) { + + return coBestillinger.stream() + .filter(bestilling -> ident.equals(bestilling.getIdent())) + .min(Comparator.comparing(GruppeBestillingIdent::getBestillingid)) + .map(GruppeBestillingIdent::getBestillingid) + .orElse(0L); + } } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Bestilling.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Bestilling.java index 8cf7ab22147..044def7f833 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Bestilling.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Bestilling.java @@ -17,6 +17,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; import org.hibernate.annotations.UpdateTimestamp; import java.io.Serializable; @@ -109,4 +111,86 @@ public class Bestilling implements Serializable { @Transient private String beskrivelse; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + + if (o == null || getClass() != o.getClass()) return false; + + Bestilling that = (Bestilling) o; + + return new EqualsBuilder() + .append(ferdig, that.ferdig) + .append(stoppet, that.stoppet) + .append(id, that.id) + .append(versjon, that.versjon) + .append(gruppe, that.gruppe) + .append(miljoer, that.miljoer) + .append(antallIdenter, that.antallIdenter) + .append(sistOppdatert, that.sistOppdatert) + .append(feil, that.feil) + .append(opprettetFraId, that.opprettetFraId) + .append(bestKriterier, that.bestKriterier) + .append(opprettFraIdenter, that.opprettFraIdenter) + .append(ident, that.ident) + .append(opprettetFraGruppeId, that.opprettetFraGruppeId) + .append(gjenopprettetFraIdent, that.gjenopprettetFraIdent) + .append(bruker, that.bruker) + .append(pdlImport, that.pdlImport) + .append(kildeMiljoe, that.kildeMiljoe) + .append(navSyntetiskIdent, that.navSyntetiskIdent) + .append(beskrivelse, that.beskrivelse) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(id) + .append(versjon) + .append(gruppe) + .append(ferdig) + .append(miljoer).append(antallIdenter) + .append(sistOppdatert) + .append(stoppet).append(feil) + .append(opprettetFraId) + .append(bestKriterier) + .append(opprettFraIdenter) + .append(ident) + .append(opprettetFraGruppeId) + .append(gjenopprettetFraIdent) + .append(bruker) + .append(pdlImport) + .append(kildeMiljoe) + .append(navSyntetiskIdent) + .append(beskrivelse) + .toHashCode(); + } + + @Override + public String toString() { + return "Bestilling{" + + "id=" + id + + ", versjon=" + versjon + + ", gruppe=" + gruppe + + ", ferdig=" + ferdig + + ", miljoer='" + miljoer + '\'' + + ", antallIdenter=" + antallIdenter + + ", sistOppdatert=" + sistOppdatert + + ", stoppet=" + stoppet + + ", feil='" + feil + '\'' + + ", opprettetFraId=" + opprettetFraId + + ", bestKriterier='" + bestKriterier + '\'' + + ", opprettFraIdenter='" + opprettFraIdenter + '\'' + + ", ident='" + ident + '\'' + + ", opprettetFraGruppeId=" + opprettetFraGruppeId + + ", gjenopprettetFraIdent='" + gjenopprettetFraIdent + '\'' + + ", bruker=" + bruker + + ", pdlImport='" + pdlImport + '\'' + + ", kildeMiljoe='" + kildeMiljoe + '\'' + + ", navSyntetiskIdent=" + navSyntetiskIdent + + ", beskrivelse='" + beskrivelse + '\'' + + '}'; + } } \ No newline at end of file diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/BestillingKontroll.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/BestillingKontroll.java index 739fbee5d6d..d4ac100b4d9 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/BestillingKontroll.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/BestillingKontroll.java @@ -10,6 +10,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Parameter; @@ -40,4 +42,37 @@ public class BestillingKontroll implements Serializable { @Column(name = "STOPPET", nullable = false) private boolean stoppet; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + + if (o == null || getClass() != o.getClass()) return false; + + BestillingKontroll that = (BestillingKontroll) o; + + return new EqualsBuilder() + .append(stoppet, that.stoppet) + .append(id, that.id) + .append(bestillingId, that.bestillingId) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(id) + .append(bestillingId) + .append(stoppet) + .toHashCode(); + } + + @Override + public String toString() { + return "BestillingKontroll{" + + "id=" + id + + ", bestillingId=" + bestillingId + + ", stoppet=" + stoppet + + '}'; + } } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/BestillingMal.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/BestillingMal.java index 6b2e5541500..61fb545a0fa 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/BestillingMal.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/BestillingMal.java @@ -14,13 +14,12 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import lombok.ToString; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; import org.hibernate.annotations.UpdateTimestamp; -import org.hibernate.proxy.HibernateProxy; import java.io.Serializable; import java.time.LocalDateTime; -import java.util.Objects; @Entity @Getter @@ -28,7 +27,6 @@ @Builder @NoArgsConstructor @AllArgsConstructor -@ToString @Table(name = "BESTILLING_MAL") public class BestillingMal implements Serializable { @@ -55,18 +53,44 @@ public class BestillingMal implements Serializable { private LocalDateTime sistOppdatert; @Override - public final boolean equals(Object o) { + public boolean equals(Object o) { if (this == o) return true; - if (o == null) return false; - Class oEffectiveClass = o instanceof HibernateProxy ? ((HibernateProxy) o).getHibernateLazyInitializer().getPersistentClass() : o.getClass(); - Class thisEffectiveClass = this instanceof HibernateProxy ? ((HibernateProxy) this).getHibernateLazyInitializer().getPersistentClass() : this.getClass(); - if (thisEffectiveClass != oEffectiveClass) return false; + + if (o == null || getClass() != o.getClass()) return false; + BestillingMal that = (BestillingMal) o; - return getId() != null && Objects.equals(getId(), that.getId()); + + return new EqualsBuilder() + .append(id, that.id) + .append(bestKriterier, that.bestKriterier) + .append(miljoer, that.miljoer) + .append(malNavn, that.malNavn) + .append(bruker, that.bruker) + .append(sistOppdatert, that.sistOppdatert) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(id) + .append(bestKriterier) + .append(miljoer) + .append(malNavn) + .append(bruker) + .append(sistOppdatert) + .toHashCode(); } @Override - public final int hashCode() { - return getClass().hashCode(); + public String toString() { + return "BestillingMal{" + + "id=" + id + + ", bestKriterier='" + bestKriterier + '\'' + + ", miljoer='" + miljoer + '\'' + + ", malNavn='" + malNavn + '\'' + + ", bruker=" + bruker + + ", sistOppdatert=" + sistOppdatert + + '}'; } } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/BestillingProgress.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/BestillingProgress.java index d42ac7b56ac..e29e3783542 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/BestillingProgress.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/BestillingProgress.java @@ -15,17 +15,21 @@ import jakarta.persistence.Version; import lombok.AllArgsConstructor; import lombok.Builder; -import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; import no.nav.dolly.domain.jpa.Testident.Master; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; import java.io.Serializable; import static org.apache.logging.log4j.util.Strings.isNotBlank; @Entity -@Data +@Getter +@Setter @NoArgsConstructor @AllArgsConstructor @Table(name = "BESTILLING_PROGRESS") @@ -150,4 +154,106 @@ public boolean isIdentGyldig() { public void setDokarkivStatus(String dokarkivStatus) { this.dokarkivStatus = StringUtils.left(dokarkivStatus, MAX_DOKARKIV_STATUS_LENGTH); } + + //Husk å regenerere disse når nye systemer legges til + @Override + public boolean equals(Object o) { + if (this == o) return true; + + if (o == null || getClass() != o.getClass()) return false; + + BestillingProgress that = (BestillingProgress) o; + + return new EqualsBuilder().append(id, that.id) + .append(versjon, that.versjon) + .append(bestilling, that.bestilling) + .append(ident, that.ident) + .append(sigrunstubStatus, that.sigrunstubStatus) + .append(krrstubStatus, that.krrstubStatus) + .append(medlStatus, that.medlStatus) + .append(udistubStatus, that.udistubStatus) + .append(aaregStatus, that.aaregStatus) + .append(arenaforvalterStatus, that.arenaforvalterStatus) + .append(instdataStatus, that.instdataStatus) + .append(inntektstubStatus, that.inntektstubStatus) + .append(pensjonforvalterStatus, that.pensjonforvalterStatus) + .append(inntektsmeldingStatus, that.inntektsmeldingStatus) + .append(brregstubStatus, that.brregstubStatus) + .append(dokarkivStatus, that.dokarkivStatus) + .append(histarkStatus, that.histarkStatus) + .append(sykemeldingStatus, that.sykemeldingStatus) + .append(skjermingsregisterStatus, that.skjermingsregisterStatus) + .append(tpsMessagingStatus, that.tpsMessagingStatus) + .append(pdlImportStatus, that.pdlImportStatus) + .append(pdlForvalterStatus, that.pdlForvalterStatus) + .append(pdlOrdreStatus, that.pdlOrdreStatus) + .append(kontoregisterStatus, that.kontoregisterStatus) + .append(pdlPersonStatus, that.pdlPersonStatus) + .append(arbeidsplassenCVStatus, that.arbeidsplassenCVStatus) + .append(master, that.master) + .append(feil, that.feil) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(id) + .append(versjon) + .append(bestilling) + .append(ident).append(sigrunstubStatus).append(krrstubStatus) + .append(medlStatus) + .append(udistubStatus).append(aaregStatus) + .append(arenaforvalterStatus).append(instdataStatus) + .append(inntektstubStatus) + .append(pensjonforvalterStatus) + .append(inntektsmeldingStatus).append(brregstubStatus) + .append(dokarkivStatus) + .append(histarkStatus) + .append(sykemeldingStatus) + .append(skjermingsregisterStatus) + .append(tpsMessagingStatus) + .append(pdlImportStatus) + .append(pdlForvalterStatus) + .append(pdlOrdreStatus) + .append(kontoregisterStatus) + .append(pdlPersonStatus).append(arbeidsplassenCVStatus) + .append(master).append(feil).toHashCode(); + } + + @Override + public String toString() { + return "BestillingProgress{" + + "id=" + id + + ", versjon=" + versjon + + ", bestilling=" + bestilling.getId() + + ", gruppe=" + bestilling.getGruppe().getId() + + ", ident='" + ident + '\'' + + ", sigrunstubStatus='" + sigrunstubStatus + '\'' + + ", krrstubStatus='" + krrstubStatus + '\'' + + ", medlStatus='" + medlStatus + '\'' + + ", udistubStatus='" + udistubStatus + '\'' + + ", aaregStatus='" + aaregStatus + '\'' + + ", arenaforvalterStatus='" + arenaforvalterStatus + '\'' + + ", instdataStatus='" + instdataStatus + '\'' + + ", inntektstubStatus='" + inntektstubStatus + '\'' + + ", pensjonforvalterStatus='" + pensjonforvalterStatus + '\'' + + ", inntektsmeldingStatus='" + inntektsmeldingStatus + '\'' + + ", brregstubStatus='" + brregstubStatus + '\'' + + ", dokarkivStatus='" + dokarkivStatus + '\'' + + ", histarkStatus='" + histarkStatus + '\'' + + ", sykemeldingStatus='" + sykemeldingStatus + '\'' + + ", skjermingsregisterStatus='" + skjermingsregisterStatus + '\'' + + ", tpsMessagingStatus='" + tpsMessagingStatus + '\'' + + ", pdlImportStatus='" + pdlImportStatus + '\'' + + ", pdlForvalterStatus='" + pdlForvalterStatus + '\'' + + ", pdlOrdreStatus='" + pdlOrdreStatus + '\'' + + ", kontoregisterStatus='" + kontoregisterStatus + '\'' + + ", pdlPersonStatus='" + pdlPersonStatus + '\'' + + ", arbeidsplassenCVStatus='" + arbeidsplassenCVStatus + '\'' + + ", master=" + master + + ", isPdlSync=" + isPdlSync + + ", feil='" + feil + '\'' + + '}'; + } } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Bruker.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Bruker.java index 89e8b691528..c1b4eece927 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Bruker.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Bruker.java @@ -53,23 +53,31 @@ public class Bruker implements Serializable { @Column(name = "BRUKER_ID", unique = true) private String brukerId; + @Column(name = "BRUKERNAVN") private String brukernavn; + @Column(name = "EPOST") private String epost; + @Column(name = "NAV_IDENT", length = 10) private String navIdent; + @Column(name = "MIGRERT") private Boolean migrert; + @Column(name = "BRUKERTYPE") @Enumerated(EnumType.STRING) private Brukertype brukertype; + @ManyToOne @JoinColumn(name = "EID_AV_ID") private Bruker eidAv; + @OneToMany(mappedBy = "opprettetAv") @Builder.Default private Set testgrupper = new HashSet<>(); + @ManyToMany @Builder.Default @JoinTable(name = "BRUKER_FAVORITTER", @@ -79,33 +87,54 @@ public class Bruker implements Serializable { @Override public boolean equals(Object o) { - if (this == o) - return true; + if (this == o) return true; + + if (o == null || getClass() != o.getClass()) return false; - if (!(o instanceof Bruker bruker)) - return false; + Bruker bruker = (Bruker) o; return new EqualsBuilder() - .append(getId(), bruker.getId()) - .append(getBrukerId(), bruker.getBrukerId()) - .append(getBrukernavn(), bruker.getBrukernavn()) - .append(getEpost(), bruker.getEpost()) - .append(getNavIdent(), bruker.getNavIdent()) - .append(getMigrert(), bruker.getMigrert()) + .append(id, bruker.id) + .append(versjon, bruker.versjon) + .append(brukerId, bruker.brukerId) + .append(brukernavn, bruker.brukernavn) + .append(epost, bruker.epost) + .append(navIdent, bruker.navIdent) + .append(migrert, bruker.migrert) + .append(brukertype, bruker.brukertype) + .append(eidAv, bruker.eidAv) .isEquals(); } @Override public int hashCode() { return new HashCodeBuilder(17, 37) - .append(getId()) - .append(getBrukerId()) - .append(getBrukernavn()) - .append(getEpost()) - .append(getNavIdent()) - .append(getMigrert()) + .append(id) + .append(versjon) + .append(brukerId) + .append(brukernavn) + .append(epost) + .append(navIdent) + .append(migrert) + .append(brukertype) + .append(eidAv) .toHashCode(); } + @Override + public String toString() { + return "Bruker{" + + "id=" + id + + ", versjon=" + versjon + + ", brukerId='" + brukerId + '\'' + + ", brukernavn='" + brukernavn + '\'' + + ", epost='" + epost + '\'' + + ", navIdent='" + navIdent + '\'' + + ", migrert=" + migrert + + ", brukertype=" + brukertype + + ", eidAv=" + eidAv + + '}'; + } + public enum Brukertype {AZURE, BANKID, BASIC} } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/BrukerFavoritter.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/BrukerFavoritter.java index 108bcc3a691..23df6d3801c 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/BrukerFavoritter.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/BrukerFavoritter.java @@ -8,12 +8,17 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; import java.io.Serializable; @Entity -@Data +@Getter +@Setter @Builder @NoArgsConstructor @AllArgsConstructor @@ -36,4 +41,32 @@ public static class BrukerFavoritterId implements Serializable { @Column(name= "GRUPPE_ID") private Long gruppeId; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + + if (o == null || getClass() != o.getClass()) return false; + + BrukerFavoritter that = (BrukerFavoritter) o; + + return new EqualsBuilder() + .append(id, that.id) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(id) + .toHashCode(); + } + + @Override + public String + toString() { + return "BrukerFavoritter{" + + "id=" + id + + '}'; + } } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/InfoStripe.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/InfoStripe.java index 6aec8b774c9..60f0b0c54b2 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/InfoStripe.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/InfoStripe.java @@ -10,6 +10,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Parameter; @@ -47,4 +49,43 @@ public class InfoStripe implements Serializable { @Column private LocalDateTime expires; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + + if (o == null || getClass() != o.getClass()) return false; + + InfoStripe that = (InfoStripe) o; + + return new EqualsBuilder() + .append(id, that.id) + .append(type, that.type) + .append(message, that.message) + .append(start, that.start) + .append(expires, that.expires) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(id) + .append(type) + .append(message) + .append(start) + .append(expires) + .toHashCode(); + } + + @Override + public String toString() { + return "InfoStripe{" + + "id=" + id + + ", type='" + type + '\'' + + ", message='" + message + '\'' + + ", start=" + start + + ", expires=" + expires + + '}'; + } } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/OrganisasjonBestilling.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/OrganisasjonBestilling.java index d12922293cb..9f622afcae8 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/OrganisasjonBestilling.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/OrganisasjonBestilling.java @@ -14,6 +14,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Parameter; import org.hibernate.annotations.UpdateTimestamp; @@ -71,4 +73,55 @@ public class OrganisasjonBestilling { @OneToMany(mappedBy = "bestilling", fetch = FetchType.LAZY) @Builder.Default private List progresser = new ArrayList<>(); + + @Override + public boolean equals(Object o) { + if (this == o) return true; + + if (o == null || getClass() != o.getClass()) return false; + + OrganisasjonBestilling that = (OrganisasjonBestilling) o; + + return new EqualsBuilder() + .append(id, that.id) + .append(miljoer, that.miljoer) + .append(antall, that.antall) + .append(sistOppdatert, that.sistOppdatert) + .append(feil, that.feil) + .append(ferdig, that.ferdig) + .append(opprettetFraId, that.opprettetFraId) + .append(bestKriterier, that.bestKriterier) + .append(bruker, that.bruker) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(id) + .append(miljoer) + .append(antall) + .append(sistOppdatert) + .append(feil) + .append(ferdig) + .append(opprettetFraId) + .append(bestKriterier) + .append(bruker) + .toHashCode(); + } + + @Override + public String toString() { + return "OrganisasjonBestilling{" + + "id=" + id + + ", miljoer='" + miljoer + '\'' + + ", antall=" + antall + + ", sistOppdatert=" + sistOppdatert + + ", feil='" + feil + '\'' + + ", ferdig=" + ferdig + + ", opprettetFraId=" + opprettetFraId + + ", bestKriterier='" + bestKriterier + '\'' + + ", bruker=" + bruker + + '}'; + } } \ No newline at end of file diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/OrganisasjonBestillingMal.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/OrganisasjonBestillingMal.java index 3ecf72bb39f..439be339844 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/OrganisasjonBestillingMal.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/OrganisasjonBestillingMal.java @@ -14,13 +14,12 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import lombok.ToString; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; import org.hibernate.annotations.UpdateTimestamp; -import org.hibernate.proxy.HibernateProxy; import java.io.Serializable; import java.time.LocalDateTime; -import java.util.Objects; @Entity @Getter @@ -28,7 +27,6 @@ @Builder @NoArgsConstructor @AllArgsConstructor -@ToString @Table(name = "ORGANISASJON_BESTILLING_MAL") public class OrganisasjonBestillingMal implements Serializable { @@ -55,18 +53,44 @@ public class OrganisasjonBestillingMal implements Serializable { private LocalDateTime sistOppdatert; @Override - public final boolean equals(Object o) { + public boolean equals(Object o) { if (this == o) return true; - if (o == null) return false; - Class oEffectiveClass = o instanceof HibernateProxy ? ((HibernateProxy) o).getHibernateLazyInitializer().getPersistentClass() : o.getClass(); - Class thisEffectiveClass = this instanceof HibernateProxy ? ((HibernateProxy) this).getHibernateLazyInitializer().getPersistentClass() : this.getClass(); - if (thisEffectiveClass != oEffectiveClass) return false; + + if (o == null || getClass() != o.getClass()) return false; + OrganisasjonBestillingMal that = (OrganisasjonBestillingMal) o; - return getId() != null && Objects.equals(getId(), that.getId()); + + return new EqualsBuilder() + .append(id, that.id) + .append(bestKriterier, that.bestKriterier) + .append(miljoer, that.miljoer) + .append(malNavn, that.malNavn) + .append(bruker, that.bruker) + .append(sistOppdatert, that.sistOppdatert) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(id) + .append(bestKriterier) + .append(miljoer) + .append(malNavn) + .append(bruker) + .append(sistOppdatert) + .toHashCode(); } @Override - public final int hashCode() { - return getClass().hashCode(); + public String toString() { + return "OrganisasjonBestillingMal{" + + "id=" + id + + ", bestKriterier='" + bestKriterier + '\'' + + ", miljoer='" + miljoer + '\'' + + ", malNavn='" + malNavn + '\'' + + ", bruker=" + bruker + + ", sistOppdatert=" + sistOppdatert + + '}'; } } \ No newline at end of file diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/OrganisasjonBestillingProgress.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/OrganisasjonBestillingProgress.java index 4b42a336a51..0d41c8969b2 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/OrganisasjonBestillingProgress.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/OrganisasjonBestillingProgress.java @@ -12,6 +12,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Parameter; @@ -44,4 +46,40 @@ public class OrganisasjonBestillingProgress { @ManyToOne @JoinColumn(name = "bestilling_id", nullable = false) private OrganisasjonBestilling bestilling; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + + if (o == null || getClass() != o.getClass()) return false; + + OrganisasjonBestillingProgress that = (OrganisasjonBestillingProgress) o; + + return new EqualsBuilder() + .append(id, that.id) + .append(organisasjonsnummer, that.organisasjonsnummer) + .append(organisasjonsforvalterStatus, that.organisasjonsforvalterStatus) + .append(bestilling, that.bestilling) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(id) + .append(organisasjonsnummer) + .append(organisasjonsforvalterStatus) + .append(bestilling) + .toHashCode(); + } + + @Override + public String toString() { + return "OrganisasjonBestillingProgress{" + + "id=" + id + + ", organisasjonsnummer='" + organisasjonsnummer + '\'' + + ", organisasjonsforvalterStatus='" + organisasjonsforvalterStatus + '\'' + + ", bestilling=" + bestilling + + '}'; + } } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Testgruppe.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Testgruppe.java index 7a6e3fe30c1..b8503ce7d2f 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Testgruppe.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Testgruppe.java @@ -14,10 +14,9 @@ import jakarta.persistence.Version; import lombok.AllArgsConstructor; import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.ToString; +import lombok.Setter; import no.nav.dolly.domain.resultset.Tags; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; @@ -36,7 +35,8 @@ import static org.apache.commons.lang3.StringUtils.isBlank; @Entity -@Data +@Getter +@Setter @Builder @NoArgsConstructor @AllArgsConstructor @@ -75,23 +75,17 @@ public class Testgruppe implements Serializable { @OneToMany(mappedBy = "testgruppe", fetch = FetchType.EAGER) @Column(unique = true) - @EqualsAndHashCode.Exclude @Builder.Default - @ToString.Exclude @OrderBy("id DESC") private List testidenter = new ArrayList<>(); @ManyToMany(mappedBy = "favoritter", fetch = FetchType.EAGER) @Builder.Default - @EqualsAndHashCode.Exclude - @ToString.Exclude private Set favorisertAv = new HashSet<>(); @OrderBy("id") @OneToMany(mappedBy = "gruppe", fetch = FetchType.LAZY) @Builder.Default - @EqualsAndHashCode.Exclude - @ToString.Exclude private Set bestillinger = new HashSet<>(); @Column(name = "ER_LAAST") @@ -114,36 +108,59 @@ public List getTags() { @Override public boolean equals(Object o) { - if (this == o) - return true; + if (this == o) return true; - if (!(o instanceof Testgruppe that)) - return false; + if (o == null || getClass() != o.getClass()) return false; + + Testgruppe that = (Testgruppe) o; return new EqualsBuilder() - .append(getId(), that.getId()) - .append(getNavn(), that.getNavn()) - .append(getHensikt(), that.getHensikt()) - .append(getOpprettetAv(), that.getOpprettetAv()) - .append(getSistEndretAv(), that.getSistEndretAv()) - .append(getDatoEndret(), that.getDatoEndret()) - .append(getErLaast(), that.getErLaast()) - .append(getLaastBeskrivelse(), that.getLaastBeskrivelse()) + .append(id, that.id) + .append(versjon, that.versjon) + .append(navn, that.navn) + .append(hensikt, that.hensikt) + .append(opprettetAv, that.opprettetAv) + .append(sistEndretAv, that.sistEndretAv) + .append(datoEndret, that.datoEndret) + .append(erLaast, that.erLaast) + .append(laastBeskrivelse, that.laastBeskrivelse) + .append(tags, that.tags) .isEquals(); } @Override public int hashCode() { return new HashCodeBuilder(17, 37) - .append(getId()) - .append(getNavn()) - .append(getHensikt()) - .append(getOpprettetAv()) - .append(getSistEndretAv()) - .append(getDatoEndret()) - .append(getErLaast()) - .append(getLaastBeskrivelse()) + .append(id) + .append(versjon) + .append(navn) + .append(hensikt) + .append(opprettetAv) + .append(sistEndretAv) + .append(datoEndret) + .append(erLaast) + .append(laastBeskrivelse) + .append(tags) .toHashCode(); } + + @Override + public String toString() { + return "Testgruppe{" + + "id=" + id + + ", versjon=" + versjon + + ", navn='" + navn + '\'' + + ", hensikt='" + hensikt + '\'' + + ", opprettetAv=" + opprettetAv + + ", sistEndretAv=" + sistEndretAv + + ", datoEndret=" + datoEndret + + ", testidenter=" + testidenter + + ", favorisertAv=" + favorisertAv + + ", bestillinger=" + bestillinger + + ", erLaast=" + erLaast + + ", laastBeskrivelse='" + laastBeskrivelse + '\'' + + ", tags='" + tags + '\'' + + '}'; + } } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Testident.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Testident.java index b4087616cc8..8ae72b6e4cc 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Testident.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Testident.java @@ -15,10 +15,11 @@ import jakarta.persistence.Version; import lombok.AllArgsConstructor; import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.ToString; +import lombok.Setter; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Parameter; @@ -29,7 +30,8 @@ import static no.nav.dolly.domain.jpa.HibernateConstants.SEQUENCE_STYLE_GENERATOR; @Entity -@Data +@Getter +@Setter @Builder @AllArgsConstructor @NoArgsConstructor @@ -45,28 +47,31 @@ public class Testident implements Serializable { }) @Column(name = "ID") private Long id; + @Version @Column(name = "VERSJON") private Long versjon; + @Column(name = "IDENT") private String ident; + @Column(name = "IBRUK") private Boolean iBruk; + @Column(name = "BESKRIVELSE") private String beskrivelse; + @ManyToOne @JoinColumn(name = "TILHOERER_GRUPPE", nullable = false) - @EqualsAndHashCode.Exclude - @ToString.Exclude private Testgruppe testgruppe; + @Column(name = "MASTER") @Enumerated(EnumType.STRING) private Master master; + @OneToMany(fetch = FetchType.LAZY) @Builder.Default @JoinColumn(name = "IDENT", referencedColumnName = "ident", insertable = false, updatable = false) - @EqualsAndHashCode.Exclude - @ToString.Exclude private List bestillingProgress = new ArrayList<>(); @JsonIgnore @@ -80,4 +85,49 @@ public boolean isPdlf() { } public enum Master {PDL, PDLF} + + @Override + public boolean equals(Object o) { + if (this == o) return true; + + if (o == null || getClass() != o.getClass()) return false; + + Testident testident = (Testident) o; + + return new EqualsBuilder() + .append(id, testident.id) + .append(versjon, testident.versjon) + .append(ident, testident.ident) + .append(iBruk, testident.iBruk) + .append(beskrivelse, testident.beskrivelse) + .append(testgruppe, testident.testgruppe) + .append(master, testident.master) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(id) + .append(versjon) + .append(ident) + .append(iBruk) + .append(beskrivelse) + .append(testgruppe) + .append(master) + .toHashCode(); + } + + @Override + public String toString() { + return "Testident{" + + "id=" + id + + ", versjon=" + versjon + + ", ident='" + ident + '\'' + + ", iBruk=" + iBruk + + ", beskrivelse='" + beskrivelse + '\'' + + ", testgruppe=" + testgruppe + + ", master=" + master + + '}'; + } } \ No newline at end of file diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/TransaksjonMapping.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/TransaksjonMapping.java index 0cd4e0657a5..ebf77fdd9a1 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/TransaksjonMapping.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/TransaksjonMapping.java @@ -10,6 +10,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Parameter; @@ -53,4 +55,49 @@ public class TransaksjonMapping implements Serializable { @Column(name = "DATO_ENDRET") private LocalDateTime datoEndret; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + + if (o == null || getClass() != o.getClass()) return false; + + TransaksjonMapping that = (TransaksjonMapping) o; + + return new EqualsBuilder() + .append(id, that.id) + .append(bestillingId, that.bestillingId) + .append(ident, that.ident) + .append(system, that.system) + .append(miljoe, that.miljoe) + .append(transaksjonId, that.transaksjonId) + .append(datoEndret, that.datoEndret) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(id) + .append(bestillingId) + .append(ident) + .append(system) + .append(miljoe) + .append(transaksjonId) + .append(datoEndret) + .toHashCode(); + } + + @Override + public String toString() { + return "TransaksjonMapping{" + + "id=" + id + + ", bestillingId=" + bestillingId + + ", ident='" + ident + '\'' + + ", system='" + system + '\'' + + ", miljoe='" + miljoe + '\'' + + ", transaksjonId='" + transaksjonId + '\'' + + ", datoEndret=" + datoEndret + + '}'; + } } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/service/TransaksjonIdMappingStrategy.java b/apps/dolly-backend/src/main/java/no/nav/dolly/service/TransaksjonIdMappingStrategy.java index a0ee71e6495..65d5fdd8788 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/service/TransaksjonIdMappingStrategy.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/service/TransaksjonIdMappingStrategy.java @@ -1,9 +1,7 @@ package no.nav.dolly.service; -import org.springframework.stereotype.Component; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; - import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import ma.glasnost.orika.CustomMapper; @@ -12,6 +10,7 @@ import no.nav.dolly.domain.jpa.TransaksjonMapping; import no.nav.dolly.mapper.MappingStrategy; import no.nav.dolly.service.RsTransaksjonMapping.TransaksjonId; +import org.springframework.stereotype.Component; @Slf4j @Component diff --git a/apps/dolly-backend/src/main/resources/pdlperson/pdl-api-schema.graphql b/apps/dolly-backend/src/main/resources/pdlperson/pdl-api-schema.graphql index d54e5b37f97..c2e292d752a 100644 --- a/apps/dolly-backend/src/main/resources/pdlperson/pdl-api-schema.graphql +++ b/apps/dolly-backend/src/main/resources/pdlperson/pdl-api-schema.graphql @@ -105,6 +105,8 @@ type FalskIdentitetIdentifiserendeInformasjon { statsborgerskap: [String!]! } +type Foedested + type Foedsel { foedekommune: String foedeland: String @@ -807,8 +809,11 @@ input CompletionParameters { } input Criterion { - " Feltnavn ikludert sti til ønsket felt (Eksempel: person.navn.fornavn)" - fieldName: String! + and: [Criterion] + " Feltnavn inkludert sti til ønsket felt (Eksempel: person.navn.fornavn)" + fieldName: String + not: [Criterion] + or: [Criterion] """ Søk i historiske data @@ -817,7 +822,7 @@ input Criterion { null = søke i både historiske og gjeldende data. """ searchHistorical: Boolean - searchRule: SearchRule! + searchRule: SearchRule } input Paging { diff --git a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/PdlApiConsumer.java b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/PdlApiConsumer.java index 3e1dd254065..c43c75e4714 100644 --- a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/PdlApiConsumer.java +++ b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/PdlApiConsumer.java @@ -2,10 +2,11 @@ import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; +import no.nav.testnav.apps.personservice.config.credentials.PdlServiceProperties; import no.nav.testnav.apps.personservice.consumer.command.GetPdlAktoerCommand; import no.nav.testnav.apps.personservice.consumer.command.GetPdlPersonCommand; +import no.nav.testnav.apps.personservice.consumer.dto.pdl.graphql.MetadataDTO; import no.nav.testnav.apps.personservice.consumer.dto.pdl.graphql.PdlAktoer; -import no.nav.testnav.apps.personservice.config.credentials.PdlServiceProperties; import no.nav.testnav.apps.personservice.domain.Person; import no.nav.testnav.libs.servletsecurity.exchange.TokenExchange; import org.springframework.http.MediaType; @@ -16,8 +17,12 @@ import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; +import java.util.Collection; import java.util.List; import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import static java.util.Collections.emptyList; import static java.util.Objects.nonNull; @@ -81,17 +86,45 @@ private boolean isGruppe(PdlAktoer.AktoerIdent ident, String gruppe) { return isNotBlank(ident.getIdent()) && !ident.getHistorisk() && gruppe.equals(ident.getGruppe()); } - private boolean isPresent(PdlAktoer pdlAktoer) { - - List identer = nonNull(pdlAktoer) && nonNull(pdlAktoer.getData()) && nonNull(pdlAktoer.getData().getHentIdenter()) ? - pdlAktoer.getData().getHentIdenter().getIdenter() : emptyList(); - - return nonNull(pdlAktoer) && - pdlAktoer.getErrors().stream().noneMatch(value -> value.getMessage().equals("Fant ikke person")) && - identer.stream() - .filter(ident -> identer.stream().anyMatch(ident2 -> isGruppe(ident2, "AKTORID"))) - .anyMatch(ident -> identer.stream().anyMatch(ident2 -> isGruppe(ident2, "FOLKEREGISTERIDENT")) || - identer.stream().anyMatch(ident2 -> isGruppe(ident2, "NPID"))); + private boolean isPresent(String ident, PdlAktoer pdlAktoer, Set opplysningId) { + + var person = pdlAktoer.getData().getHentPerson(); + log.info("Sjekker ident {} med PDL opplysningId {}, sjekkes for mottatt opplysningId {}", ident, + nonNull(person) ? + Stream.of(person.getNavn(), person.getFoedsel(), person.getFolkeregisteridentifikator(), person.getFolkeregisterpersonstatus(), person.getBostedsadresse()) + .flatMap(Collection::stream) + .map(MetadataDTO::getMetadata) + .map(MetadataDTO.Metadata::getOpplysningsId) + .collect(Collectors.joining(", ")) : null, + nonNull(opplysningId) ? + String.join(", ", opplysningId) : + null); + + boolean resultat; + if (nonNull(opplysningId)) { + + resultat = nonNull(person) && + Stream.of(person.getNavn(), person.getFoedsel(), person.getFolkeregisteridentifikator(), person.getFolkeregisterpersonstatus(), person.getBostedsadresse()) + .flatMap(Collection::stream) + .map(MetadataDTO::getMetadata) + .map(MetadataDTO.Metadata::getOpplysningsId) + .anyMatch(opplysningId::contains); + + } else { + + List identer = nonNull(pdlAktoer) && nonNull(pdlAktoer.getData()) && nonNull(pdlAktoer.getData().getHentIdenter()) ? + pdlAktoer.getData().getHentIdenter().getIdenter() : emptyList(); + + resultat = nonNull(pdlAktoer) && + pdlAktoer.getErrors().stream().noneMatch(value -> value.getMessage().equals("Fant ikke person")) && + identer.stream() + .filter(ident1 -> identer.stream().anyMatch(ident2 -> isGruppe(ident2, "AKTORID"))) + .anyMatch(ident1 -> identer.stream().anyMatch(ident2 -> isGruppe(ident2, "FOLKEREGISTERIDENT")) || + identer.stream().anyMatch(ident2 -> isGruppe(ident2, "NPID"))); + } + + log.info("Ident {}, isPresent() {}", ident, resultat); + return resultat; } public Mono> getAktoer(String ident) { @@ -109,13 +142,13 @@ public Mono> getAktoer(String ident) { })); } - public Mono isPerson(String ident) { + public Mono isPerson(String ident, Set opplysningId) { log.info("Henter ident {} fra PDL", ident); return tokenExchange .exchange(serviceProperties) .flatMap(token -> Mono.zip(new GetPdlAktoerCommand(webClient, PDL_URL, ident, token.getTokenValue()).call(), new GetPdlAktoerCommand(webClient, PDL_Q1_URL, ident, token.getTokenValue()).call()) - .map(tuple -> isPresent(tuple.getT1()) && isPresent(tuple.getT2()))); + .map(tuple -> isPresent(ident, tuple.getT1(), opplysningId) && isPresent(ident, tuple.getT2(), opplysningId))); } } diff --git a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/command/GetPdlAktoerCommand.java b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/command/GetPdlAktoerCommand.java index 8e865a69d88..b90b6504bf9 100644 --- a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/command/GetPdlAktoerCommand.java +++ b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/command/GetPdlAktoerCommand.java @@ -1,5 +1,6 @@ package no.nav.testnav.apps.personservice.consumer.command; +import com.fasterxml.jackson.databind.JsonNode; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.testnav.apps.personservice.consumer.dto.pdl.graphql.PdlAktoer; @@ -40,12 +41,12 @@ public class GetPdlAktoerCommand implements Callable> { public Mono call() { Map variables = new HashMap<>(); - variables.put("ident", ident); + variables.put("ident1", ident); String query = null; InputStream queryStream = Thread.currentThread() .getContextClassLoader() - .getResourceAsStream("pdl/pdlHentIdent.graphql"); + .getResourceAsStream("pdl/pdlPersonQuery.graphql"); try { query = new BufferedReader(new InputStreamReader(queryStream, StandardCharsets.UTF_8)) .lines().collect(Collectors.joining("\n")); diff --git a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/Bostedsadresse.java b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/Bostedsadresse.java index c26c06d2e95..941c87aaee1 100644 --- a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/Bostedsadresse.java +++ b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/Bostedsadresse.java @@ -7,6 +7,6 @@ @Value @AllArgsConstructor @NoArgsConstructor(force = true) -public class Bostedsadresse { +public class Bostedsadresse extends MetadataDTO { Vegadresse vegadresse; } diff --git a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/Foedsel.java b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/Foedsel.java index bcabd19f961..6bc385c224d 100644 --- a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/Foedsel.java +++ b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/Foedsel.java @@ -9,6 +9,7 @@ @Value @AllArgsConstructor @NoArgsConstructor(force = true) -public class Foedsel { +public class Foedsel extends MetadataDTO { + LocalDate foedselsdato; } diff --git a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/Folkeregisteridentifikator.java b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/Folkeregisteridentifikator.java index 7c32915b9ed..b1fdb996d63 100644 --- a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/Folkeregisteridentifikator.java +++ b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/Folkeregisteridentifikator.java @@ -7,7 +7,7 @@ @Value @AllArgsConstructor @NoArgsConstructor(force = true) -public class Folkeregisteridentifikator { +public class Folkeregisteridentifikator extends MetadataDTO { String identifikasjonsnummer; String status; String type; diff --git a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/Folkeregisterpersonstatus.java b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/Folkeregisterpersonstatus.java new file mode 100644 index 00000000000..2702a671046 --- /dev/null +++ b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/Folkeregisterpersonstatus.java @@ -0,0 +1,14 @@ +package no.nav.testnav.apps.personservice.consumer.dto.pdl.graphql; + +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Value; + +@Value +@AllArgsConstructor +@NoArgsConstructor(force = true) +public class Folkeregisterpersonstatus extends MetadataDTO { + String identifikasjonsnummer; + String status; + String type; +} diff --git a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/HentPerson.java b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/HentPerson.java index 6090cc2ea4a..a2445e83f4f 100644 --- a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/HentPerson.java +++ b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/HentPerson.java @@ -1,12 +1,15 @@ package no.nav.testnav.apps.personservice.consumer.dto.pdl.graphql; import lombok.AllArgsConstructor; +import lombok.Data; import lombok.NoArgsConstructor; -import lombok.Value; +import java.util.ArrayList; import java.util.List; -@Value +import static java.util.Objects.isNull; + +@Data @AllArgsConstructor @NoArgsConstructor(force = true) public class HentPerson { @@ -14,4 +17,45 @@ public class HentPerson { List foedsel; List bostedsadresse; List folkeregisteridentifikator; + List folkeregisterpersonstatus; + + public List getNavn() { + + if (isNull(navn)) { + navn = new ArrayList<>(); + } + return navn; + } + + public List getFoedsel() { + + if (isNull(foedsel)) { + foedsel = new ArrayList<>(); + } + return foedsel; + } + + public List getBostedsadresse() { + + if (isNull(bostedsadresse)) { + bostedsadresse = new ArrayList<>(); + } + return bostedsadresse; + } + + public List getFolkeregisteridentifikator() { + + if (isNull(folkeregisteridentifikator)) { + folkeregisteridentifikator = new ArrayList<>(); + } + return folkeregisteridentifikator; + } + + public List getFolkeregisterpersonstatus() { + + if (isNull(folkeregisterpersonstatus)) { + folkeregisterpersonstatus = new ArrayList<>(); + } + return folkeregisterpersonstatus; + } } diff --git a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/MetadataDTO.java b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/MetadataDTO.java new file mode 100644 index 00000000000..e76162c8fde --- /dev/null +++ b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/MetadataDTO.java @@ -0,0 +1,21 @@ +package no.nav.testnav.apps.personservice.consumer.dto.pdl.graphql; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor(force = true) +public class MetadataDTO { + + Metadata metadata; + + @Data + @AllArgsConstructor + @NoArgsConstructor(force = true) + public static class Metadata { + + String opplysningsId; + } +} diff --git a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/Navn.java b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/Navn.java index cee64af9aa0..07f6be365aa 100644 --- a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/Navn.java +++ b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/Navn.java @@ -7,7 +7,7 @@ @Value @AllArgsConstructor @NoArgsConstructor(force = true) -public class Navn { +public class Navn extends MetadataDTO { String fornavn; String mellomnavn; String etternavn; diff --git a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/PdlAktoer.java b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/PdlAktoer.java index 9f5b4ad76d6..7d60f6a2f4c 100644 --- a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/PdlAktoer.java +++ b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/consumer/dto/pdl/graphql/PdlAktoer.java @@ -2,6 +2,7 @@ import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; +import lombok.ToString; import lombok.Value; import java.util.ArrayList; @@ -22,6 +23,7 @@ public class PdlAktoer { @NoArgsConstructor(force = true) public static class Data { HentIdenter hentIdenter; + HentPerson hentPerson; } @lombok.Data @@ -39,6 +41,7 @@ public List getIdenter() { } @Value + @ToString @AllArgsConstructor @NoArgsConstructor(force = true) public static class AktoerIdent { diff --git a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/controller/PersonController.java b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/controller/PersonController.java index 826dbd6f629..1f9d8d6cbbb 100644 --- a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/controller/PersonController.java +++ b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/controller/PersonController.java @@ -5,7 +5,6 @@ import lombok.RequiredArgsConstructor; import no.nav.testnav.apps.personservice.consumer.dto.pdl.graphql.PdlAktoer.AktoerIdent; import no.nav.testnav.apps.personservice.domain.Person; -import no.nav.testnav.apps.personservice.service.PdlSyncService; import no.nav.testnav.apps.personservice.service.PersonService; import no.nav.testnav.libs.dto.personservice.v1.PersonDTO; import org.springframework.http.ResponseEntity; @@ -15,12 +14,14 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.util.UriComponentsBuilder; import org.webjars.NotFoundException; import reactor.core.publisher.Mono; import java.util.Optional; +import java.util.Set; import static java.lang.String.format; @@ -30,7 +31,6 @@ public class PersonController { private final PersonService personService; - private final PdlSyncService pdlSyncService; @PostMapping public ResponseEntity createPerson( @@ -62,16 +62,10 @@ public Mono getPerson( @GetMapping("/{ident}/exists") public Mono isPerson( - @PathVariable("ident") @Size(min = 11, max = 11, message = "Ident må ha 11 siffer") String ident) { - - return personService.isPerson(ident); - } - - @GetMapping("/{ident}/sync") - public Boolean syncPdlPersonReady( - @PathVariable("ident") @Size(min = 11, max = 11, message = "Ident må ha 11 siffer") String ident) { + @PathVariable("ident") @Size(min = 11, max = 11, message = "Ident må ha 11 siffer") String ident, + @RequestParam(value = "opplysningId", required = false) Set opplysningId) { - return pdlSyncService.syncPdlPersonReady(ident); + return personService.isPerson(ident, opplysningId); } @GetMapping("/{ident}/aktoerId") diff --git a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/service/PdlSyncService.java b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/service/PdlSyncService.java deleted file mode 100644 index 7834175ef2b..00000000000 --- a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/service/PdlSyncService.java +++ /dev/null @@ -1,125 +0,0 @@ -package no.nav.testnav.apps.personservice.service; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.RequiredArgsConstructor; -import lombok.Synchronized; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.apps.personservice.consumer.PdlApiConsumer; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.time.temporal.ChronoUnit; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import static java.time.LocalDateTime.now; -import static java.util.Objects.isNull; -import static java.util.Objects.nonNull; - -@Slf4j -@Service -@RequiredArgsConstructor -public class PdlSyncService { - - private static final long ELAPSED_S = 30; - private static final long TIME_TO_LIVE_S = 60; - private static final long SLEEP_MS = 100; - - private final PdlApiConsumer pdlApiConsumer; - private Map identerStatus = new ConcurrentHashMap<>(); - - public Boolean syncPdlPersonReady(String ident) { - - if (identerStatus.containsKey(ident) && - nonNull(identerStatus.get(ident).getAvailStartTime()) && - ChronoUnit.SECONDS.between(LocalDateTime.now(), - identerStatus.get(ident).getAvailStartTime()) < TIME_TO_LIVE_S) { - - log.info("Eksisterende ident {} isReady {}", ident, identerStatus.get(ident).isReady); - return identerStatus.get(ident).isReady; - } else { - - if (!identerStatus.containsKey(ident) || isNull(identerStatus.get(ident).getRequestStartTime())) { - checkAndUpdateIdenterStatus(ident); - } - synchronized (identerStatus.get(ident)) { - while (isNull(identerStatus.get(ident).getIsReady())) { - try { - identerStatus.get(ident).wait(); - } catch (InterruptedException e) { - log.error("Interrupted exception {}", e.getMessage(), e); - Thread.currentThread().interrupt(); - } - } - } - } - log.info("Eksisterende ident {} isReady {}", ident, identerStatus.get(ident).isReady); - return identerStatus.get(ident).isReady; - } - - @Synchronized - private void checkAndUpdateIdenterStatus(String ident) { - - if (!identerStatus.containsKey(ident) || isNull(identerStatus.get(ident).getRequestStartTime())) { - identerStatus.put(ident, IdentStatus.builder() - .requestStartTime(LocalDateTime.now()) - .build()); - - log.info("Synk av ident {} ble startet {}", ident, LocalDateTime.now()); - synchPdlPerson(ident); - } - } - - @Async - protected void synchPdlPerson(String ident) { - - var startTime = now(); - boolean isPerson = false; - try { - while (ChronoUnit.SECONDS.between(startTime, now()) < ELAPSED_S && - !(isPerson = pdlApiConsumer.isPerson(ident).block())) { - Thread.sleep(SLEEP_MS); - } - - } catch (InterruptedException e) { - log.error("Sync mot PersonService (isPerson) ble avbrutt.", e); - Thread.currentThread().interrupt(); - - } catch (RuntimeException e) { - log.error("Feilet å sjekke om person finnes for ident {}.", ident, e); - - } finally { - - synchronized (identerStatus.get(ident)) { - identerStatus.get(ident).setAvailStartTime(now()); - identerStatus.get(ident).setRequestStartTime(null); - identerStatus.get(ident).setIsReady(isPerson); - - identerStatus.get(ident).notifyAll(); - } - log.info("Synk av ident {} med status {} har klar tid {}", ident, isPerson, LocalDateTime.now()); - } - - if (ChronoUnit.SECONDS.between(startTime, now()) < ELAPSED_S) { - log.info("Synkronisering mot PDL (isPerson) tok {} ms.", ChronoUnit.MILLIS.between(startTime, now())); - } else { - log.error("Synkronisering mot PDL (isPerson) gitt opp etter {} ms.", - ChronoUnit.MILLIS.between(startTime, now())); - } - } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - private static class IdentStatus { - - private LocalDateTime requestStartTime; - private LocalDateTime availStartTime; - private Boolean isReady; - } -} diff --git a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/service/PersonService.java b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/service/PersonService.java index 8d4740ec71b..d4fe99eff23 100644 --- a/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/service/PersonService.java +++ b/apps/person-service/src/main/java/no/nav/testnav/apps/personservice/service/PersonService.java @@ -9,6 +9,7 @@ import reactor.core.publisher.Mono; import java.util.Optional; +import java.util.Set; @Service @RequiredArgsConstructor @@ -31,7 +32,8 @@ public Mono> getAktoerId(String ident) { return pdlApiConsumer.getAktoer(ident); } - public Mono isPerson(String ident) { - return pdlApiConsumer.isPerson(ident); + public Mono isPerson(String ident, Set opplysningId) { + + return pdlApiConsumer.isPerson(ident, opplysningId); } } \ No newline at end of file diff --git a/apps/person-service/src/main/resources/pdl/.graphqlconfig b/apps/person-service/src/main/resources/pdl/.graphqlconfig index 314b84b54bb..79df0e2a3ab 100644 --- a/apps/person-service/src/main/resources/pdl/.graphqlconfig +++ b/apps/person-service/src/main/resources/pdl/.graphqlconfig @@ -1,15 +1,8 @@ -{ - "name": "pdl-api", - "schemaPath": "pdl-api-schema.graphql", - "extensions": { - "endpoints": { - "PDL GraphQL Endpoint": { - "url": "https://pdl-api.dev.adeo.no/graphql", - "headers": { - "user-agent": "testnorge-person-api" - }, - "introspect": false - } - } - } -} \ No newline at end of file +schema: pdl-api-schema.graphql +extensions: + endpoints: + PDL GraphQL Endpoint: + url: https://pdl-api.dev.intern.nav.no/graphql + headers: + user-agent: '' + introspect: false \ No newline at end of file diff --git a/apps/person-service/src/main/resources/pdl/pdl-api-schema.graphql b/apps/person-service/src/main/resources/pdl/pdl-api-schema.graphql index 373fc526f31..c2e292d752a 100644 --- a/apps/person-service/src/main/resources/pdl/pdl-api-schema.graphql +++ b/apps/person-service/src/main/resources/pdl/pdl-api-schema.graphql @@ -1,12 +1,25 @@ -# This file was generated based on ".graphqlconfig". Do not edit manually. +# This file was generated. Do not edit manually. schema { query: Query } -type AdresseNode { - adressegradering: String - coAdressenavn: String +type AdresseCompletionResult { + addressFound: CompletionAdresse + suggestions: [String!]! +} + +type AdresseSearchHit { + matrikkeladresse: MatrikkeladresseResult + score: Float + vegadresse: VegadresseResult +} + +type AdresseSearchResult { + hits: [AdresseSearchHit!]! + pageNumber: Int + totalHits: Int + totalPages: Int } type Adressebeskyttelse { @@ -15,31 +28,33 @@ type Adressebeskyttelse { metadata: Metadata! } -type BolkResult { - code: String! - ident: String! - person: Person -} - type Bostedsadresse { angittFlyttedato: Date coAdressenavn: String - folkeregistermetadata: Folkeregistermetadata! + folkeregistermetadata: Folkeregistermetadata + gyldigFraOgMed: DateTime + gyldigTilOgMed: DateTime matrikkeladresse: Matrikkeladresse metadata: Metadata! ukjentBosted: UkjentBosted + utenlandskAdresse: UtenlandskAdresse vegadresse: Vegadresse } +type CompletionAdresse { + matrikkeladresse: MatrikkeladresseResult + vegadresse: VegadresseResult +} + type DeltBosted { - adresseNode: AdresseNode! coAdressenavn: String folkeregistermetadata: Folkeregistermetadata! matrikkeladresse: Matrikkeladresse metadata: Metadata! - sluttdatoForKontrakt: Date @deprecated(reason : "Flyttet til adresser rett under") + sluttdatoForKontrakt: Date startdatoForKontrakt: Date! ukjentBosted: UkjentBosted + utenlandskAdresse: UtenlandskAdresse vegadresse: Vegadresse } @@ -51,29 +66,32 @@ type DoedfoedtBarn { type Doedsfall { doedsdato: Date + folkeregistermetadata: Folkeregistermetadata metadata: Metadata! } -" Endring som har blitt utført pÃ¥ opplysningen. F.eks: Opprett -> Korriger -> Korriger" +" Endring som har blitt utført på opplysningen. F.eks: Opprett -> Korriger -> Korriger" type Endring { + hendelseId: String! """ Opphavet til informasjonen. I NAV blir dette satt i forbindelse med registrering (f.eks: Sykehuskassan). - Fra Folkeregisteret fÃ¥r vi opphaven til dems opplysning, altsÃ¥ NAV, UDI, Politiet, Skatteetaten o.l.. Fra Folkeregisteret kan det ogsÃ¥ være tekniske navn som: DSF_MIGRERING, m.m.. + Fra Folkeregisteret får vi opphaven til dems opplysning, altså NAV, UDI, Politiet, Skatteetaten o.l.. Fra Folkeregisteret kan det også være tekniske navn som: DSF_MIGRERING, m.m.. """ kilde: String! " Tidspunktet for registrering." registrert: DateTime! - " Hvem endringen har blitt utført av, ofte saksbehandler (f.eks Z990200), men kan ogsÃ¥ være system (f.eks srvXXXX). Denne blir satt til \"Folkeregisteret\" for det vi fÃ¥r fra dem." + " Hvem endringen har blitt utført av, ofte saksbehandler (f.eks Z990200), men kan også være system (f.eks srvXXXX). Denne blir satt til \"Folkeregisteret\" for det vi får fra dem." registrertAv: String! - " Hvilke system endringen har kommet fra (f.eks srvXXX). Denne blir satt til \"FREG\" for det vi fÃ¥r fra Folkeregisteret." + " Hvilke system endringen har kommet fra (f.eks srvXXX). Denne blir satt til \"FREG\" for det vi får fra Folkeregisteret." systemkilde: String! - " Hvilke type endring som har blitt utført." + " Hvilke type endring som har blitt utført." type: Endringstype! } type FalskIdentitet { erFalsk: Boolean! + folkeregistermetadata: Folkeregistermetadata metadata: Metadata! rettIdentitetErUkjent: Boolean rettIdentitetVedIdentifikasjonsnummer: String @@ -87,13 +105,7 @@ type FalskIdentitetIdentifiserendeInformasjon { statsborgerskap: [String!]! } -type Familierelasjon { - folkeregistermetadata: Folkeregistermetadata - metadata: Metadata! - minRolleForPerson: Familierelasjonsrolle - relatertPersonsIdent: String! - relatertPersonsRolle: Familierelasjonsrolle! -} +type Foedested type Foedsel { foedekommune: String @@ -101,6 +113,7 @@ type Foedsel { foedested: String foedselsaar: Int foedselsdato: Date + folkeregistermetadata: Folkeregistermetadata metadata: Metadata! } @@ -128,10 +141,20 @@ type Folkeregisterpersonstatus { status: String! } +type ForelderBarnRelasjon { + folkeregistermetadata: Folkeregistermetadata + metadata: Metadata! + minRolleForPerson: ForelderBarnRelasjonRolle + relatertPersonUtenFolkeregisteridentifikator: RelatertBiPerson + relatertPersonsIdent: String + relatertPersonsRolle: ForelderBarnRelasjonRolle! +} + type Foreldreansvar { ansvar: String ansvarlig: String ansvarligUtenIdentifikator: RelatertBiPerson + ansvarssubjekt: String folkeregistermetadata: Folkeregistermetadata metadata: Metadata! } @@ -145,6 +168,26 @@ type Fullmakt { omraader: [String!]! } +type GeografiskTilknytning { + gtBydel: String + gtKommune: String + gtLand: String + gtType: GtType! + regel: String! +} + +type HentIdenterBolkResult { + code: String! + ident: String! + identer: [IdentInformasjon!] +} + +type HentPersonBolkResult { + code: String! + ident: String! + person: Person +} + type IdentInformasjon { gruppe: IdentGruppe! historisk: Boolean! @@ -168,6 +211,84 @@ type InnflyttingTilNorge { metadata: Metadata! } +type KartverketAdresse { + id: Long! + matrikkeladresse: KartverketMatrikkeladresse + vegadresse: KartverketVegadresse +} + +type KartverketBydel { + bydelsnavn: String + bydelsnummer: String +} + +type KartverketFylke { + navn: String + nummer: String +} + +type KartverketGrunnkrets { + grunnkretsnavn: String + grunnkretsnummer: String +} + +type KartverketKommune { + fylke: KartverketFylke + navn: String + nummer: String +} + +type KartverketMatrikkeladresse { + adressetilleggsnavn: String + bydel: KartverketBydel + grunnkrets: KartverketGrunnkrets + kortnavn: String + matrikkelnummer: KartverketMatrikkelnummer + postnummeromraade: KartverketPostnummeromraade + representasjonspunkt: KartverketRepresentasjonspunkt + undernummer: Int +} + +type KartverketMatrikkelnummer { + bruksnummer: Int + festenummer: Int + gaardsnummer: Int + kommunenummer: String + seksjonsnummer: Int +} + +type KartverketPostnummeromraade { + postnummer: String + poststed: String +} + +type KartverketRepresentasjonspunkt { + posisjonskvalitet: Int + x: Float + y: Float + z: Float +} + +type KartverketVeg { + adressekode: Int + adressenavn: String + kommune: KartverketKommune + kortnavn: String + stedsnummer: String +} + +type KartverketVegadresse { + adressetilleggsnavn: String + bokstav: String + bydel: KartverketBydel + grunnkrets: KartverketGrunnkrets + kortnavn: String + nummer: Int + postnummeromraade: KartverketPostnummeromraade + representasjonspunkt: KartverketRepresentasjonspunkt + veg: KartverketVeg +} + type Kjoenn { folkeregistermetadata: Folkeregistermetadata kjoenn: KjoennType @@ -236,33 +357,43 @@ type Matrikkeladresse { bruksenhetsnummer: String kommunenummer: String koordinater: Koordinater - matrikkelId: Int + matrikkelId: Long + postnummer: String + tilleggsnavn: String +} + +type MatrikkeladresseResult { + bruksnummer: String + gaardsnummer: String + kommunenummer: String + matrikkelId: String postnummer: String + poststed: String tilleggsnavn: String } type Metadata { """ - En liste over alle endringer som har blitt utført over tid. - Vær obs pÃ¥ at denne kan endre seg og man burde takle at det finnes flere korrigeringer i listen, sÃ¥ dersom man ønsker Ã¥ kun vise den siste, sÃ¥ mÃ¥ man selv filtrere ut dette. - Det kan ogsÃ¥ ved svært fÃ¥ tilfeller skje at opprett blir fjernet. F.eks ved splitt tilfeller av identer. Dette skal skje i svært fÃ¥ tilfeller. Dersom man ønsker Ã¥ presentere opprettet tidspunktet, sÃ¥ blir det tidspunktet pÃ¥ den første endringen. + En liste over alle endringer som har blitt utført over tid. + Vær obs på at denne kan endre seg og man burde takle at det finnes flere korrigeringer i listen, så dersom man ønsker å kun vise den siste, så må man selv filtrere ut dette. + Det kan også ved svært få tilfeller skje at opprett blir fjernet. F.eks ved splitt tilfeller av identer. Dette skal skje i svært få tilfeller. Dersom man ønsker å presentere opprettet tidspunktet, så blir det tidspunktet på den første endringen. """ endringer: [Endring!]! """ - Feltet betegner hvorvidt dette er en funksjonelt historisk opplysning, for eksempel en tidligere fraflyttet adresse eller et foreldreansvar som er utløpt fordi barnet har fylt 18 Ã¥r. - I de fleste tilfeller kan dette utledes ved Ã¥ se pÃ¥ de andre feltene i opplysningen. Dette er imidlertid ikke alltid tilfellet, blant annet for foreldreansvar. - Feltet bør brukes av konsumenter som henter informasjon fra GraphQL med historikk, men som ogsÃ¥ trenger Ã¥ utlede gjeldende informasjon. + Feltet betegner hvorvidt dette er en funksjonelt historisk opplysning, for eksempel en tidligere fraflyttet adresse eller et foreldreansvar som er utløpt fordi barnet har fylt 18 år. + I de fleste tilfeller kan dette utledes ved å se på de andre feltene i opplysningen. Dette er imidlertid ikke alltid tilfellet, blant annet for foreldreansvar. + Feltet bør brukes av konsumenter som henter informasjon fra GraphQL med historikk, men som også trenger å utlede gjeldende informasjon. """ historisk: Boolean! - " Master refererer til hvem som eier opplysningen, f.eks sÃ¥ har PDL en kopi av Folkeregisteret, da vil master være FREG og eventuelle endringer pÃ¥ dette mÃ¥ gÃ¥ via Folkeregisteret (API mot dem eller andre rutiner)." + " Master refererer til hvem som eier opplysningen, f.eks så har PDL en kopi av Folkeregisteret, da vil master være FREG og eventuelle endringer på dette må gå via Folkeregisteret (API mot dem eller andre rutiner)." master: String! """ - I PDL sÃ¥ fÃ¥r alle forekomster av en opplysning en ID som representerer dens unike forekomst. - F.eks, sÃ¥ vil en Opprett ha ID X, korriger ID Y (der hvor den spesifiserer at den korrigerer X). - Dersom en opplysning ikke er lagret i PDL, sÃ¥ vil denne verdien ikke være utfylt. + I PDL så får alle forekomster av en opplysning en ID som representerer dens unike forekomst. + F.eks, så vil en Opprett ha ID X, korriger ID Y (der hvor den spesifiserer at den korrigerer X). + Dersom en opplysning ikke er lagret i PDL, så vil denne verdien ikke være utfylt. """ opplysningsId: String } @@ -272,6 +403,7 @@ type Navn { folkeregistermetadata: Folkeregistermetadata forkortetNavn: String fornavn: String! + gyldigFraOgMed: Date mellomnavn: String metadata: Metadata! originaltNavn: OriginaltNavn @@ -288,10 +420,11 @@ type Opphold { type Oppholdsadresse { coAdressenavn: String folkeregistermetadata: Folkeregistermetadata + gyldigFraOgMed: DateTime + gyldigTilOgMed: DateTime matrikkeladresse: Matrikkeladresse metadata: Metadata! oppholdAnnetSted: String - oppholdsadressedato: Date utenlandskAdresse: UtenlandskAdresse vegadresse: Vegadresse } @@ -309,10 +442,10 @@ type Person { doedfoedtBarn: [DoedfoedtBarn!]! doedsfall: [Doedsfall!]! falskIdentitet: FalskIdentitet - familierelasjoner: [Familierelasjon!]! foedsel: [Foedsel!]! folkeregisteridentifikator(historikk: Boolean = false): [Folkeregisteridentifikator!]! folkeregisterpersonstatus(historikk: Boolean = false): [Folkeregisterpersonstatus!]! + forelderBarnRelasjon: [ForelderBarnRelasjon!]! foreldreansvar(historikk: Boolean = false): [Foreldreansvar!]! fullmakt(historikk: Boolean = false): [Fullmakt!]! identitetsgrunnlag(historikk: Boolean = false): [Identitetsgrunnlag!]! @@ -333,6 +466,51 @@ type Person { vergemaalEllerFremtidsfullmakt(historikk: Boolean = false): [VergemaalEllerFremtidsfullmakt!]! } +type PersonSearchHighlight { + " Forteller hvorvidt opplysningen som ga treff er markert som historisk." + historisk: Boolean + """ + + liste med feltene og verdiene som ga treff. + Merk at for fritekst søk så vil disse kunne referere til hjelpe felter som ikke er synelig i resultatene. + """ + matches: [SearchMatch] + """ + + Navn/Sti til opplysningen som ga treff. Merk at dette ikke er feltet som ga treff men opplysningen. + F.eks. hvis du søker på person.navn.fornavn så vil opplysingen være person.navn. + """ + opplysning: String + """ + + Gitt att opplysningen som ga treff har en opplysningsId så vil den returneres her. + alle søk under person skal ha opplysningsId, men søk i identer vil kunne returnere treff uten opplysningsId. + """ + opplysningsId: String +} + +type PersonSearchHit { + " Infromasjon om hva som ga treff i søke resultatet." + highlights: [PersonSearchHighlight] + " forespurte data" + identer(historikk: Boolean = false): [IdentInformasjon!]! + " forespurte data" + person: Person + " Poengsummen elasticsearch har gitt dette resultatet (brukt til feilsøking, og tuning av søk)" + score: Float +} + +type PersonSearchResult { + " treff liste" + hits: [PersonSearchHit!]! + " Side nummer for siden som vises" + pageNumber: Int + " Totalt antall treff (øvre grense er satt til 10 000)" + totalHits: Int + " Totalt antall sider" + totalPages: Int +} + type Personnavn { etternavn: String! fornavn: String! @@ -353,10 +531,16 @@ type Postboksadresse { } type Query { + forslagAdresse(parameters: CompletionParameters): AdresseCompletionResult + hentAdresse(matrikkelId: ID!): KartverketAdresse + hentGeografiskTilknytning(ident: ID!): GeografiskTilknytning + hentGeografiskTilknytningBolk(identer: [ID!]!): [hentGeografiskTilknytningBolkResult!]! hentIdenter(grupper: [IdentGruppe!], historikk: Boolean = false, ident: ID!): Identliste + hentIdenterBolk(grupper: [IdentGruppe!], historikk: Boolean = false, identer: [ID!]!): [HentIdenterBolkResult!]! hentPerson(ident: ID!): Person - hentPersonBolk(identer: [ID!]!): [BolkResult!]! - sokPerson(criteria: [Criterion], paging: Paging): SearchResult + hentPersonBolk(identer: [ID!]!): [HentPersonBolkResult!]! + sokAdresse(criteria: [Criterion], paging: Paging): AdresseSearchResult + sokPerson(criteria: [Criterion], paging: Paging): PersonSearchResult } type RelatertBiPerson { @@ -366,11 +550,12 @@ type RelatertBiPerson { statsborgerskap: String } -type SearchResult { - hits: [searchHit!]! - pageNumber: Int - totalHits: Int - totalPages: Int +type SearchMatch { + " feltnavn med sti til feltet so ga treff." + field: String! + " Verdien som ga treff" + fragments: [String] + type: String } type Sikkerhetstiltak { @@ -388,19 +573,16 @@ type SikkerhetstiltakKontaktperson { } type Sivilstand { - bekreftelsesdato: String + bekreftelsesdato: Date folkeregistermetadata: Folkeregistermetadata gyldigFraOgMed: Date - kommune: String metadata: Metadata! - myndighet: String relatertVedSivilstand: String - sted: String type: Sivilstandstype! - utland: String } type Statsborgerskap { + bekreftelsesdato: Date folkeregistermetadata: Folkeregistermetadata gyldigFraOgMed: Date gyldigTilOgMed: Date @@ -449,6 +631,7 @@ type UtenlandskAdresseIFrittFormat { } type UtenlandskIdentifikasjonsnummer { + folkeregistermetadata: Folkeregistermetadata identifikasjonsnummer: String! metadata: Metadata! opphoert: Boolean! @@ -460,17 +643,36 @@ type UtflyttingFraNorge { metadata: Metadata! tilflyttingsland: String tilflyttingsstedIUtlandet: String + utflyttingsdato: Date } type Vegadresse { adressenavn: String bruksenhetsnummer: String + bydelsnummer: String husbokstav: String husnummer: String kommunenummer: String koordinater: Koordinater - matrikkelId: Int + matrikkelId: Long + postnummer: String + tilleggsnavn: String +} + +type VegadresseResult { + adressekode: String + adressenavn: String + bydelsnavn: String + bydelsnummer: String + fylkesnavn: String + fylkesnummer: String + husbokstav: String + husnummer: Int + kommunenavn: String + kommunenummer: String + matrikkelId: String postnummer: String + poststed: String tilleggsnavn: String } @@ -489,9 +691,10 @@ type VergemaalEllerFremtidsfullmakt { vergeEllerFullmektig: VergeEllerFullmektig! } -type searchHit { - person: Person - score: Float +type hentGeografiskTilknytningBolkResult { + code: String! + geografiskTilknytning: GeografiskTilknytning + ident: String! } enum AdressebeskyttelseGradering { @@ -501,6 +704,11 @@ enum AdressebeskyttelseGradering { UGRADERT } +enum Direction { + ASC + DESC +} + enum Endringstype { KORRIGER OPPHOER @@ -514,11 +722,25 @@ enum Familierelasjonsrolle { MOR } +enum ForelderBarnRelasjonRolle { + BARN + FAR + MEDMOR + MOR +} + enum FullmaktsRolle { FULLMAKTSGIVER FULLMEKTIG } +enum GtType { + BYDEL + KOMMUNE + UDEFINERT + UTLAND +} + enum IdentGruppe { AKTORID FOLKEREGISTERIDENT @@ -566,36 +788,117 @@ enum Sivilstandstype { UOPPGITT } -input Criterion { +"Format: YYYY-MM-DD (ISO-8601), example: 2017-11-24" +scalar Date + +"Format: YYYY-MM-DDTHH:mm:SS (ISO-8601), example: 2011-12-03T10:15:30" +scalar DateTime + +"Long type" +scalar Long + +input CompletionFieldValue { fieldName: String! - includeHistorical: Boolean - searchRule: SearchRule! + fieldValue: String +} + +input CompletionParameters { + completionField: String! + fieldValues: [CompletionFieldValue]! + maxSuggestions: Int +} + +input Criterion { + and: [Criterion] + " Feltnavn inkludert sti til ønsket felt (Eksempel: person.navn.fornavn)" + fieldName: String + not: [Criterion] + or: [Criterion] + """ + + Søk i historiske data + true = søker kun i historiske data. + false = søker kun i gjeldende data. + null = søke i både historiske og gjeldende data. + """ + searchHistorical: Boolean + searchRule: SearchRule } input Paging { + " Hvilken side i resultatsettet man ønsker vist." pageNumber: Int = 1 + " antall treff per side (maks 100)" resultsPerPage: Int = 10 + """ + + Liste over felter man ønsker resultatene sortert etter + Standard er "score". Score er poengsummen Elasticsearch tildeler hvert resultat. + """ + sortBy: [SearchSorting] } input SearchRule { + " Brukes til søke etter datoer som kommer etter opgitt dato." after: String + " Brukes til søke etter datoer som kommer før opgitt dato." before: String + " Boost brukes til å gi ett søkekriterie høyere eller lavere vektlegging en de andre søke kriteriene." + boost: Float + " [Flag] Kan brukes til å overstyre standard oppførsellen for søk i felter (standard er case insensitive)" + caseSensitive: Boolean + " Gir treff når opgitt felt inneholder en eller flere ord fra input verdien." contains: String + " [Flag] Brukes til å deaktivere fonetisk søk feltene som har dette som standard (Navn)" + disablePhonetic: Boolean + " Begrenser treff til kun de hvor felt har input verdi" equals: String + " Sjekker om feltet finnes / at det ikke har en null verdi." + exists: String + """ + + Søk fra og med (se fromExcluding for bare fra men ikke med) + kan benyttes på tall og dato + """ from: String + """ + + Søk fra men ikke med oppgitt verdi + kan benyttes på tall og dato + """ fromExcluding: String + " Søk som gir treff også for små variasjoner i skrivemåte" fuzzy: String + " Brukes til å søke i tall og finner verdier som er størren en input verdi." greaterThan: String + " Brukes til å søke i tall og finner verdier som er mindre en input verdi." lessThan: String + " Filtrerer bort treff hvor felt inneholder input verdi" notEquals: String + " Søk som gir tilfeldig poengsum til hvert treff (kun ment til generering av testdata)" + random: String + " Regex søk for spesielle situasjoner (Dette er en treg opprasjon og bør ikke brukes)" regex: String + " Gir treff når opgitt feltstarter med opgitt verdi." + startsWith: String + """ + + Søk til og med (se toExcluding for bare til men ikke med) + kan benyttes på tall og dato + """ to: String + """ + + Søk til men ikke med oppgitt verdi + kan benyttes på tall og dato + """ toExcluding: String + " Bruk \"?\" som wildcard for enkelt tegn, og \"*\" som wildcard for 0 eller flere tegn." + wildcard: String } - -"Format: YYYY-MM-DD (ISO-8601), example: 2017-11-24" -scalar Date - -"Format: YYYY-MM-DDTHH:mm:SS (ISO-8601), example: 2011-12-03T10:15:30" -scalar DateTime \ No newline at end of file +input SearchSorting { + direction: Direction! + " Feltnavn ikludert sti til ønsket felt (eksepmel: person.navn.fornavn)" + fieldName: String! +} diff --git a/apps/person-service/src/main/resources/pdl/pdlPersonQuery.graphql b/apps/person-service/src/main/resources/pdl/pdlPersonQuery.graphql new file mode 100644 index 00000000000..105861c0c61 --- /dev/null +++ b/apps/person-service/src/main/resources/pdl/pdlPersonQuery.graphql @@ -0,0 +1,37 @@ + +query($ident1: ID!) { + hentPerson(ident: $ident1) { + navn { + metadata { + opplysningsId + } + } + foedsel { + metadata { + opplysningsId + } + } + kjoenn { + metadata { + opplysningsId + } + } + folkeregisteridentifikator { + metadata { + opplysningsId + } + } + folkeregisterpersonstatus { + metadata { + opplysningsId + } + } + }, + hentIdenter(ident: $ident1, historikk: true, grupper: [AKTORID, FOLKEREGISTERIDENT, NPID]) { + identer { + ident, + historisk, + gruppe + } + } +} \ No newline at end of file From 93ae0f54eeaf7c60667fe103f7da6007234edb60 Mon Sep 17 00:00:00 2001 From: kristenhaerum Date: Tue, 22 Aug 2023 12:39:41 +0200 Subject: [PATCH 20/22] Fiks for oppdatering av malbestilling --- .../repository/BestillingMalRepository.java | 2 -- .../dolly/service/BestillingMalService.java | 24 +++++++++++++------ 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/repository/BestillingMalRepository.java b/apps/dolly-backend/src/main/java/no/nav/dolly/repository/BestillingMalRepository.java index a95febb3637..a34581c3bd1 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/repository/BestillingMalRepository.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/repository/BestillingMalRepository.java @@ -14,8 +14,6 @@ public interface BestillingMalRepository extends CrudRepository findByIdContaining(String id); - List findByBrukerAndMalNavn(Bruker bruker, String navn); List findByBruker(Bruker bruker); diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/service/BestillingMalService.java b/apps/dolly-backend/src/main/java/no/nav/dolly/service/BestillingMalService.java index adc4b67007e..22260a5ed3c 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/service/BestillingMalService.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/service/BestillingMalService.java @@ -110,15 +110,25 @@ public RsMalBestillingWrapper getMalbestillingByUser(String brukerId) { .build(); } - public void saveBestillingMal(Bestilling bestilling, String malNavn, Bruker bruker) { - bestillingMalRepository.save(BestillingMal.builder() - .bestKriterier(bestilling.getBestKriterier()) - .bruker(bruker) - .malNavn(malNavn) - .miljoer(bestilling.getMiljoer()) - .build()); + var eksisterende = bestillingMalRepository.findByBrukerAndMalNavn(bruker, malNavn); + if (eksisterende.isEmpty()) { + bestillingMalRepository.save(BestillingMal.builder() + + .bestKriterier(bestilling.getBestKriterier()) + .bruker(bruker) + .malNavn(malNavn) + .miljoer(bestilling.getMiljoer()) + .build()); + } else { + eksisterende.stream() + .findFirst() + .ifPresent(malbestilling -> { + malbestilling.setBestKriterier(bestilling.getBestKriterier()); + malbestilling.setMiljoer(bestilling.getMiljoer()); + }); + } } public void saveBestillingMalFromBestillingId(Long bestillingId, String malNavn) { From 0f3b809bb12c07df2edcc4d043bc9bd96ce2342f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristen=20H=C3=A6rum?= Date: Tue, 22 Aug 2023 13:52:27 +0200 Subject: [PATCH 21/22] Bugfix/arena inaktiver bruker (#3248) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fiks for inaktiver bruker når bruker ikke fantes fra før --- .../mapper/ArenaMappingStrategy.java | 21 +++++++++++-------- .../service/ArenaBrukerService.java | 17 ++++++++++++++- .../strategy/ArenaMappingStrategyTest.java | 3 ++- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/arenaforvalter/mapper/ArenaMappingStrategy.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/arenaforvalter/mapper/ArenaMappingStrategy.java index 229b0267a06..d273ac0ef5d 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/arenaforvalter/mapper/ArenaMappingStrategy.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/arenaforvalter/mapper/ArenaMappingStrategy.java @@ -38,6 +38,13 @@ public void register(MapperFactory factory) { @Override public void mapAtoB(Arenadata arenadata, ArenaNyBruker arenaNyBruker, MappingContext context) { + if (isNull(arenaNyBruker.getKvalifiseringsgruppe())) { + arenaNyBruker.setKvalifiseringsgruppe(IKVAL); + } + if (isNull(arenaNyBruker.getAutomatiskInnsendingAvMeldekort())) { + arenaNyBruker.setAutomatiskInnsendingAvMeldekort(true); + } + if (UTEN_SERVICEBEHOV.equals(arenadata.getArenaBrukertype())) { mapUtenServicebehov(arenadata, arenaNyBruker); } else if (!arenadata.getAap().isEmpty() || !arenadata.getAap115().isEmpty() || !arenadata.getDagpenger().isEmpty()) { @@ -131,15 +138,11 @@ private void mapMedServicebehov(Arenadata arenadata, ArenaNyBruker arenaNyBruker } private void mapUtenServicebehov(Arenadata arenadata, ArenaNyBruker arenaNyBruker) { - arenaNyBruker.setUtenServicebehov(new ArenaBrukerUtenServicebehov()); - - arenaNyBruker.setKvalifiseringsgruppe(IKVAL); - if (isNull(arenadata.getAutomatiskInnsendingAvMeldekort())) { - arenaNyBruker.setAutomatiskInnsendingAvMeldekort(true); - } - if (nonNull(arenadata.getInaktiveringDato())) { - arenaNyBruker.getUtenServicebehov().setStansDato(arenadata.getInaktiveringDato().toLocalDate()); - } + arenaNyBruker.setUtenServicebehov(ArenaBrukerUtenServicebehov.builder() + .stansDato(nonNull(arenadata.getInaktiveringDato()) ? + arenadata.getInaktiveringDato().toLocalDate() : + LocalDate.now()) + .build()); } } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/arenaforvalter/service/ArenaBrukerService.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/arenaforvalter/service/ArenaBrukerService.java index da0f14c3447..73476cc6736 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/arenaforvalter/service/ArenaBrukerService.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/arenaforvalter/service/ArenaBrukerService.java @@ -6,6 +6,7 @@ import no.nav.dolly.bestilling.arenaforvalter.ArenaUtils; import no.nav.dolly.bestilling.arenaforvalter.dto.ArenaVedtakOperasjoner; import no.nav.dolly.domain.resultset.arenaforvalter.ArenaBruker; +import no.nav.dolly.domain.resultset.arenaforvalter.ArenaBrukerUtenServicebehov; import no.nav.dolly.domain.resultset.arenaforvalter.ArenaNyBruker; import no.nav.dolly.domain.resultset.arenaforvalter.ArenaNyeBrukere; import no.nav.dolly.domain.resultset.arenaforvalter.ArenaNyeBrukereResponse; @@ -16,11 +17,14 @@ import reactor.core.publisher.Mono; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.Stream; +import static java.util.Objects.isNull; +import static java.util.Objects.nonNull; import static no.nav.dolly.bestilling.arenaforvalter.utils.ArenaStatusUtil.getMessage; import static no.nav.dolly.errorhandling.ErrorStatusDecoder.encodeStatus; @@ -50,7 +54,8 @@ public Flux sendBruker(Arenadata arenadata, ArenaVedtakOperasjoner arbei }) .flatMap(arenaNyeBrukere -> { - if (arenaNyeBrukere.getNyeBrukere().stream().anyMatch(ArenaNyBruker::hasServicebehov)) { + if (arenaNyeBrukere.getNyeBrukere().stream().anyMatch(ArenaNyBruker::hasServicebehov) || + isNull(arbeidssoker.getRegistrertDato())) { arenaNyeBrukere.getNyeBrukere().stream() .findFirst() @@ -58,6 +63,11 @@ public Flux sendBruker(Arenadata arenadata, ArenaVedtakOperasjoner arbei if (!nyBruker.hasKvalifiseringsgruppe()) { nyBruker.setKvalifiseringsgruppe(arbeidssoker.getKvalifiseringsgruppe()); } + if (nonNull(arenadata.getInaktiveringDato())) { + nyBruker.setUtenServicebehov(ArenaBrukerUtenServicebehov.builder() + .stansDato(toLocalDate(arenadata.getInaktiveringDato())) + .build()); + } }); return arenaForvalterConsumer.postArenaBruker(arenaNyeBrukere) @@ -110,4 +120,9 @@ private Mono getBrukerStatus(ArenaNyeBrukereResponse response) { .collect(Collectors.joining()); } + + private static LocalDate toLocalDate(LocalDateTime localDateTime) { + + return nonNull(localDateTime) ? localDateTime.toLocalDate() : null; + } } diff --git a/apps/dolly-backend/src/test/java/no/nav/dolly/mapper/strategy/ArenaMappingStrategyTest.java b/apps/dolly-backend/src/test/java/no/nav/dolly/mapper/strategy/ArenaMappingStrategyTest.java index 4a5a810701b..f89f99255ee 100644 --- a/apps/dolly-backend/src/test/java/no/nav/dolly/mapper/strategy/ArenaMappingStrategyTest.java +++ b/apps/dolly-backend/src/test/java/no/nav/dolly/mapper/strategy/ArenaMappingStrategyTest.java @@ -21,6 +21,7 @@ import static no.nav.dolly.domain.resultset.arenaforvalter.ArenaKvalifiseringsgruppe.VARIG; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -57,7 +58,7 @@ public void arenaBrukerUtenServicebehovUtenDato() { .arenaBrukertype(UTEN_SERVICEBEHOV) .build(), no.nav.dolly.domain.resultset.arenaforvalter.ArenaNyBruker.class); - assertThat(arenaNyBruker.getUtenServicebehov().getStansDato(), is(nullValue())); + assertThat(arenaNyBruker.getUtenServicebehov().getStansDato(), is(notNullValue())); assertThat(arenaNyBruker.getKvalifiseringsgruppe(), is(equalTo(IKVAL))); } From a2d6850d1fb5496fe0ce6bad90ef5920f5cffd9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristen=20H=C3=A6rum?= Date: Tue, 22 Aug 2023 15:07:46 +0200 Subject: [PATCH 22/22] Bugfix/bruker gir 500 feil (#3249) Fjernet toString() fra entity-klasse --- .../java/no/nav/dolly/domain/jpa/Bruker.java | 15 --------------- .../no/nav/dolly/domain/jpa/Testgruppe.java | 19 ------------------- .../no/nav/dolly/domain/jpa/Testident.java | 2 +- .../no/nav/dolly/service/BrukerService.java | 16 +++++++++++----- 4 files changed, 12 insertions(+), 40 deletions(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Bruker.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Bruker.java index c1b4eece927..1bce1cee3d4 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Bruker.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Bruker.java @@ -121,20 +121,5 @@ public int hashCode() { .toHashCode(); } - @Override - public String toString() { - return "Bruker{" + - "id=" + id + - ", versjon=" + versjon + - ", brukerId='" + brukerId + '\'' + - ", brukernavn='" + brukernavn + '\'' + - ", epost='" + epost + '\'' + - ", navIdent='" + navIdent + '\'' + - ", migrert=" + migrert + - ", brukertype=" + brukertype + - ", eidAv=" + eidAv + - '}'; - } - public enum Brukertype {AZURE, BANKID, BASIC} } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Testgruppe.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Testgruppe.java index b8503ce7d2f..eedc21754e0 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Testgruppe.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Testgruppe.java @@ -143,24 +143,5 @@ public int hashCode() { .append(tags) .toHashCode(); } - - @Override - public String toString() { - return "Testgruppe{" + - "id=" + id + - ", versjon=" + versjon + - ", navn='" + navn + '\'' + - ", hensikt='" + hensikt + '\'' + - ", opprettetAv=" + opprettetAv + - ", sistEndretAv=" + sistEndretAv + - ", datoEndret=" + datoEndret + - ", testidenter=" + testidenter + - ", favorisertAv=" + favorisertAv + - ", bestillinger=" + bestillinger + - ", erLaast=" + erLaast + - ", laastBeskrivelse='" + laastBeskrivelse + '\'' + - ", tags='" + tags + '\'' + - '}'; - } } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Testident.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Testident.java index 8ae72b6e4cc..249284581f8 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Testident.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/jpa/Testident.java @@ -126,7 +126,7 @@ public String toString() { ", ident='" + ident + '\'' + ", iBruk=" + iBruk + ", beskrivelse='" + beskrivelse + '\'' + - ", testgruppe=" + testgruppe + + ", testgruppe=" + testgruppe.getId() + ", master=" + master + '}'; } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/service/BrukerService.java b/apps/dolly-backend/src/main/java/no/nav/dolly/service/BrukerService.java index 296e02e591d..c990e9514c5 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/service/BrukerService.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/service/BrukerService.java @@ -17,7 +17,6 @@ import java.util.Collection; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; import static java.util.Objects.isNull; @@ -98,12 +97,19 @@ public Bruker fjernFavoritt(Long gruppeId) { public List fetchBrukere() { - List brukere = brukerRepository.findAllByOrderById(); - Map brukereMap = brukere.stream().collect(Collectors.toMap(Bruker::getId, bruker -> bruker)); + var brukere = brukerRepository.findAllByOrderById(); + var brukereMap = brukere.stream() + .collect(Collectors.toMap(Bruker::getId, bruker -> bruker)); + brukereMap.values().stream() .filter(bruker -> nonNull(bruker.getEidAv())) - .forEach(bruker -> brukereMap.get(bruker.getEidAv().getId()).getFavoritter().addAll(bruker.getFavoritter())); - return brukereMap.values().stream().filter(bruker -> isNull(bruker.getEidAv())).toList(); + .forEach(bruker -> brukereMap.get(bruker.getEidAv().getId()) + .getFavoritter() + .addAll(bruker.getFavoritter())); + + return brukereMap.values().stream() + .filter(bruker -> isNull(bruker.getEidAv())) + .toList(); } public int sletteBrukerFavoritterByGroupId(Long groupId) {