From 7b187b6126ccc7a390a228b54e8360cb65c5192c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristen=20H=C3=A6rum?= Date: Fri, 8 Dec 2023 14:59:32 +0100 Subject: [PATCH 1/5] Bugfix/gjennopprett mangler status fra historiske bestillinger (#3350) Hensynta status fra historiske bestillinger ved gjenopprett --- .../dolly/bestilling/aareg/AaregClient.java | 7 +- .../arenaforvalter/ArenaForvalterClient.java | 6 +- .../bestilling/dokarkiv/DokarkivClient.java | 4 +- .../bestilling/histark/HistarkClient.java | 2 +- .../InntektsmeldingClient.java | 4 +- .../bestilling/instdata/InstdataClient.java | 4 +- .../PensjonforvalterClient.java | 36 +++--- .../TpsMessagingClient.java | 32 ++++-- .../service/TpsPersonService.java | 25 +++-- .../domain/resultset/RsStatusRapport.java | 3 +- .../dolly/elastic/utils/OpensearchImport.java | 2 +- .../errorhandling/ErrorStatusDecoder.java | 5 +- .../mapper/BestillingAaregStatusMapper.java | 3 +- .../BestillingArenaforvalterStatusMapper.java | 48 ++++---- .../BestillingDokarkivStatusMapper.java | 3 +- ...BestillingInntektsmeldingStatusMapper.java | 3 +- .../BestillingInstdataStatusMapper.java | 3 +- ...estillingPensjonforvalterStatusMapper.java | 26 +++-- .../BestillingTpsMessagingStatusMapper.java | 3 +- .../BestillingTpsPersonStatusMapper.java | 3 +- .../service/TransaksjonMappingService.java | 4 +- .../java/no/nav/dolly/util/DollyTextUtil.java | 32 ++++++ .../util/MdcWarraperExecutorService.java | 92 --------------- .../dolly/util/TransactionHelperService.java | 106 ++++++++++++++++-- .../bestilling/aareg/AaregClientTest.java | 4 +- .../ArenaForvalterClientTest.java | 6 +- .../instdata/InstdataClientTest.java | 4 +- .../PensjonforvalterClientTest.java | 6 +- .../service/TpsPersonServiceTest.java | 38 +++---- ...llingPensjonforvalterStatusMapperTest.java | 4 +- 30 files changed, 294 insertions(+), 224 deletions(-) create mode 100644 apps/dolly-backend/src/main/java/no/nav/dolly/util/DollyTextUtil.java delete mode 100644 apps/dolly-backend/src/main/java/no/nav/dolly/util/MdcWarraperExecutorService.java diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/aareg/AaregClient.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/aareg/AaregClient.java index a878671c131..7e7b9949089 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/aareg/AaregClient.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/aareg/AaregClient.java @@ -68,7 +68,8 @@ public Flux gjenopprett(RsDollyUtvidetBestilling bestilling, Dolly var initStatus = miljoer.stream() .map(miljo -> String.format("%s:%s", miljo, getInfoVenter(SYSTEM))) .collect(Collectors.joining(",")); - transactionHelperService.persister(progress, BestillingProgress::setAaregStatus, initStatus); + transactionHelperService.persister(progress, BestillingProgress::getAaregStatus, + BestillingProgress::setAaregStatus, initStatus); return Flux.just(1) .flatMap(index -> { @@ -89,7 +90,8 @@ public Flux gjenopprett(RsDollyUtvidetBestilling bestilling, Dolly private ClientFuture futurePersist(BestillingProgress progress, String status) { return () -> { - transactionHelperService.persister(progress, BestillingProgress::setAaregStatus, status); + transactionHelperService.persister(progress, BestillingProgress::getAaregStatus, + BestillingProgress::setAaregStatus, status); return progress; }; } @@ -160,5 +162,4 @@ private String decodeStatus(String miljoe, ArbeidsforholdRespons reply) { isNull(reply.getError()) ? "OK" : errorStatusDecoder.decodeThrowable(reply.getError()) ); } - } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/arenaforvalter/ArenaForvalterClient.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/arenaforvalter/ArenaForvalterClient.java index 4d697b8f832..c3323e5fa25 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/arenaforvalter/ArenaForvalterClient.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/arenaforvalter/ArenaForvalterClient.java @@ -62,7 +62,8 @@ public Flux gjenopprett(RsDollyUtvidetBestilling bestilling, Dolly var initStatus = miljoer.stream() .map(miljo -> String.format(MILJOE_FMT, miljo, getInfoVenter(SYSTEM))) .collect(Collectors.joining(",")); - transactionHelperService.persister(progress, BestillingProgress::setArenaforvalterStatus, initStatus); + transactionHelperService.persister(progress, BestillingProgress::getArenaforvalterStatus, + BestillingProgress::setArenaforvalterStatus, initStatus); }) .flatMap(miljoer -> doArenaOpprett(ordre, dollyPerson.getIdent(), miljoer) .map(status -> futurePersist(progress, status)))); @@ -103,7 +104,8 @@ private Mono doArenaOpprett(Arenadata arenadata, String ident, List { - transactionHelperService.persister(progress, BestillingProgress::setArenaforvalterStatus, StringUtils.left(status, 4000)); + transactionHelperService.persister(progress, BestillingProgress::getArenaforvalterStatus, + BestillingProgress::setArenaforvalterStatus, StringUtils.left(status, 4000)); return progress; }; } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/dokarkiv/DokarkivClient.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/dokarkiv/DokarkivClient.java index 52dcb2f638e..f04e81f94af 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/dokarkiv/DokarkivClient.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/dokarkiv/DokarkivClient.java @@ -70,7 +70,9 @@ public Flux gjenopprett(RsDollyUtvidetBestilling bestilling, Dolly private ClientFuture futurePersist(BestillingProgress progress, String status) { return () -> { - transactionHelperService.persister(progress, BestillingProgress::setDokarkivStatus, status); + transactionHelperService.persister(progress, + BestillingProgress::getDokarkivStatus, + BestillingProgress::setDokarkivStatus, status); return progress; }; } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/HistarkClient.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/HistarkClient.java index ee6d57030e9..fb4cd00f819 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/HistarkClient.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/histark/HistarkClient.java @@ -51,7 +51,7 @@ public Flux gjenopprett(RsDollyUtvidetBestilling bestilling, Dolly var bestillingId = progress.getBestilling().getId(); return Flux.just(dollyPerson.getIdent()) .map(person -> buildRequest(bestilling.getHistark(), person)) - .filter(env -> !transaksjonMappingService.existAlready(HISTARK, + .filter(request -> !transaksjonMappingService.existAlready(HISTARK, dollyPerson.getIdent(), "NA", bestilling.getId()) || isOpprettEndre) .flatMap(request -> histarkConsumer.postHistark(request) .mapNotNull(status -> getStatus(dollyPerson.getIdent(), bestillingId, status))) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/inntektsmelding/InntektsmeldingClient.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/inntektsmelding/InntektsmeldingClient.java index 5a1f525a6eb..9165045c22f 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/inntektsmelding/InntektsmeldingClient.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/inntektsmelding/InntektsmeldingClient.java @@ -80,7 +80,9 @@ public void release(List identer) { private ClientFuture futurePersist(BestillingProgress progress, String status) { return () -> { - transactionHelperService.persister(progress, BestillingProgress::setInntektsmeldingStatus, status); + transactionHelperService.persister(progress, + BestillingProgress::getInntektsmeldingStatus, + BestillingProgress::setInntektsmeldingStatus, status); return progress; }; } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/instdata/InstdataClient.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/instdata/InstdataClient.java index a5d896f2944..84ff0dafd23 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/instdata/InstdataClient.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/instdata/InstdataClient.java @@ -55,7 +55,9 @@ public Flux gjenopprett(RsDollyUtvidetBestilling bestilling, Dolly private ClientFuture futurePersist(BestillingProgress progress, String status) { return () -> { - transactionHelperService.persister(progress, BestillingProgress::setInstdataStatus, status); + transactionHelperService.persister(progress, + BestillingProgress::getInstdataStatus, + BestillingProgress::setInstdataStatus, status); return progress; }; } 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 074fd9d1be5..e38257392f3 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 @@ -71,6 +71,7 @@ @RequiredArgsConstructor public class PensjonforvalterClient implements ClientRegister { + private static final String SEP = "$"; private static final String IDENT = "ident"; private static final String MILJOER = "miljoer"; private static final String NAV_ENHET = "navEnhet"; @@ -139,8 +140,10 @@ public Flux gjenopprett(RsDollyUtvidetBestilling bestilling, Dolly return Flux.just(bestilling) .doOnNext(bestilling1 -> { if (!dollyPerson.isOrdre()) { - transactionHelperService.persister(progress, BestillingProgress::setPensjonforvalterStatus, - prepInitStatus(tilgjengeligeMiljoer)); + transactionHelperService.persister(progress, + BestillingProgress::getPensjonforvalterStatus, + BestillingProgress::setPensjonforvalterStatus, + prepInitStatus(tilgjengeligeMiljoer), SEP); } }) .flatMap(bestilling1 -> getIdenterRelasjoner(dollyPerson.getIdent()) @@ -194,7 +197,7 @@ public Flux gjenopprett(RsDollyUtvidetBestilling bestilling, Dolly .flatMap(Flux::from) .filter(StringUtils::isNotBlank) - .collect(Collectors.joining("$")); + .collect(Collectors.joining(SEP)); }) .map(status -> futurePersist(dollyPerson, progress, status)); } @@ -211,8 +214,10 @@ private static Mono> getPdlPerson(Flux getNavEnhetNr(Flux persondata) { return persondata + .filter(data -> nonNull(data.getHentGeografiskTilknytningBolk())) .map(PdlPersonBolk.Data::getHentGeografiskTilknytningBolk) .flatMap(Flux::fromIterable) + .filter(data -> nonNull(data.getGeografiskTilknytning())) .map(PdlPersonBolk.GeografiskTilknytningBolk::getGeografiskTilknytning) .map(PensjonforvalterClient::getGeografiskTilknytning) .flatMap(norg2Consumer::getNorgEnhet) @@ -272,7 +277,8 @@ private ClientFuture futurePersist(DollyPerson dollyPerson, BestillingProgress p return () -> { if (!dollyPerson.isOrdre()) { - transactionHelperService.persister(progress, BestillingProgress::setPensjonforvalterStatus, status); + transactionHelperService.persister(progress, BestillingProgress::getPensjonforvalterStatus, + BestillingProgress::setPensjonforvalterStatus, status, SEP); } return progress; }; @@ -365,15 +371,15 @@ private Flux lagreAlderspensjon(PensjonData pensjonDat var finalPensjonRequest = new AtomicReference<>(pensjonRequest); return pensjonforvalterConsumer.lagreAlderspensjon(pensjonRequest) - .map(response -> { - response.getStatus().forEach(status -> { - if (status.getResponse().isResponse2xx()) { - saveAPTransaksjonId(ident, status.getMiljo(), bestillingId, - PEN_AP, finalPensjonRequest); - } - }); - return response; - }); + .map(response -> { + response.getStatus().forEach(status -> { + if (status.getResponse().isResponse2xx()) { + saveAPTransaksjonId(ident, status.getMiljo(), bestillingId, + PEN_AP, finalPensjonRequest); + } + }); + return response; + }); } else { return getStatus(miljoe, 503, TPS_NOT_READY); @@ -520,7 +526,7 @@ private String decodeStatus(PensjonforvalterResponse response, String ident) { .collect(Collectors.joining(",")); } - String getError(PensjonforvalterResponse.ResponseEnvironment entry) { + String getError(PensjonforvalterResponse.ResponseEnvironment entry) { var response = entry.getResponse(); var httpStatus = response.getHttpStatus(); @@ -534,7 +540,7 @@ String getError(PensjonforvalterResponse.ResponseEnvironment entry) { } } else { - return errorStatusDecoder.getErrorText(HttpStatus.valueOf(httpStatus.getStatus()), httpStatus.getReasonPhrase()); + return errorStatusDecoder.getErrorText(HttpStatus.valueOf(httpStatus.getStatus()), httpStatus.getReasonPhrase()); } } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/tpsmessagingservice/TpsMessagingClient.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/tpsmessagingservice/TpsMessagingClient.java index 5331b719943..aecdcc8de2d 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/tpsmessagingservice/TpsMessagingClient.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/tpsmessagingservice/TpsMessagingClient.java @@ -12,6 +12,7 @@ import no.nav.dolly.domain.jpa.BestillingProgress; import no.nav.dolly.domain.resultset.RsDollyUtvidetBestilling; import no.nav.dolly.domain.resultset.dolly.DollyPerson; +import no.nav.dolly.errorhandling.ErrorStatusDecoder; import no.nav.dolly.util.TransactionHelperService; import no.nav.testnav.libs.data.pdlforvalter.v1.SikkerhetstiltakDTO; import no.nav.testnav.libs.data.tpsmessagingservice.v1.SpraakDTO; @@ -35,12 +36,14 @@ import static no.nav.dolly.bestilling.kontoregisterservice.util.BankkontoGenerator.tilfeldigUtlandskBankkonto; import static no.nav.dolly.errorhandling.ErrorStatusDecoder.getInfoVenter; import static org.apache.commons.lang3.BooleanUtils.isTrue; +import static org.apache.commons.lang3.StringUtils.isNotBlank; @Slf4j @Service @RequiredArgsConstructor public class TpsMessagingClient implements ClientRegister { + private static final String SEP = "$"; private static final String STATUS_FMT = "%s:%s"; private static final String TPS_MESSAGING = "TPS"; @@ -52,7 +55,8 @@ public class TpsMessagingClient implements ClientRegister { private static String getResultat(TpsMeldingResponseDTO respons) { - return "OK".equals(respons.getStatus()) ? "OK" : "FEIL= " + respons.getUtfyllendeMelding(); + return "OK".equals(respons.getStatus()) ? "OK" : + ErrorStatusDecoder.encodeStatus("FEIL: " + respons.getUtfyllendeMelding()); } private static String getStatus(String melding, List statuser) { @@ -75,9 +79,10 @@ public Flux gjenopprett(RsDollyUtvidetBestilling bestilling, Dolly return Flux.from(tpsMiljoerConsumer.getTpsMiljoer() .flatMap(miljoer -> { - if (!dollyPerson.isOrdre()) { - transactionHelperService.persister(progress, BestillingProgress::setTpsMessagingStatus, - prepTpsMessagingStatus(miljoer)); + if (!dollyPerson.isOrdre() && isTpsMessage(bestilling)) { + transactionHelperService.persister(progress, BestillingProgress::getTpsMessagingStatus, + BestillingProgress::setTpsMessagingStatus, + prepTpsMessagingStatus(miljoer), SEP); } return getIdenterHovedpersonOgPartner(dollyPerson.getIdent()) @@ -108,16 +113,30 @@ public Flux gjenopprett(RsDollyUtvidetBestilling bestilling, Dolly .toList()) .flatMap(Flux::fromIterable) .filter(StringUtils::isNotBlank) - .collect(Collectors.joining("$")); + .collect(Collectors.joining(SEP)); })) .map(status -> futurePersist(dollyPerson, progress, status)); } + private boolean isTpsMessage(RsDollyUtvidetBestilling bestilling) { + + return (nonNull(bestilling.getTpsMessaging()) && + isNotBlank(bestilling.getTpsMessaging().getSpraakKode())) || + + nonNull(bestilling.getBankkonto()) || + nonNull(bestilling.getSkjerming()) || + + (nonNull(bestilling.getPdldata()) && + nonNull(bestilling.getPdldata().getPerson()) && + !bestilling.getPdldata().getPerson().getSikkerhetstiltak().isEmpty()); + } + private ClientFuture futurePersist(DollyPerson dollyPerson, BestillingProgress progress, String status) { return () -> { if (!dollyPerson.isOrdre()) { - transactionHelperService.persister(progress, BestillingProgress::setTpsMessagingStatus, status); + transactionHelperService.persister(progress, BestillingProgress::getTpsMessagingStatus, + BestillingProgress::setTpsMessagingStatus, status, SEP); } return progress; }; @@ -187,7 +206,6 @@ private Mono> sendSpraakkode(RsDollyUtvidetBestillin return nonNull(bestilling.getTpsMessaging()) && nonNull(bestilling.getTpsMessaging().getSpraakKode()) ? - tpsMessagingConsumer.sendSpraakkodeRequest(ident, null, mapperFacade.map(bestilling.getTpsMessaging().getSpraakKode(), SpraakDTO.class)) .collectList() : diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/tpsmessagingservice/service/TpsPersonService.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/tpsmessagingservice/service/TpsPersonService.java index 966c1885bf9..a3a2d4ee62c 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/tpsmessagingservice/service/TpsPersonService.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/tpsmessagingservice/service/TpsPersonService.java @@ -11,7 +11,6 @@ import no.nav.dolly.domain.resultset.RsDollyUtvidetBestilling; import no.nav.dolly.domain.resultset.SystemTyper; import no.nav.dolly.domain.resultset.dolly.DollyPerson; -import no.nav.dolly.errorhandling.ErrorStatusDecoder; import no.nav.dolly.service.TransaksjonMappingService; import no.nav.dolly.util.TransactionHelperService; import no.nav.testnav.libs.data.tpsmessagingservice.v1.PersonMiljoeDTO; @@ -32,6 +31,9 @@ import static java.util.Objects.isNull; import static java.util.Objects.nonNull; +import static no.nav.dolly.errorhandling.ErrorStatusDecoder.encodeStatus; +import static no.nav.dolly.util.DollyTextUtil.getSyncTextSystem; +import static org.apache.commons.lang3.StringUtils.trimToEmpty; @Slf4j @Service @@ -39,7 +41,6 @@ public class TpsPersonService { private static final List PENSJON_MILJOER = List.of("q1", "q2"); - private static final String TPS_SYNC_START = "Info: Synkronisering mot TPS startet ... %d ms"; private static final long TIMEOUT_MILLIES = 839; @Value("${tps.person.service.wait}") @@ -67,7 +68,7 @@ public Flux syncPerson(DollyPerson dollyPerson, RsDollyUtvidetBest penMiljoer, Collections.emptyList(), progress) .map(status -> prepareResult(relasjon, status, bestilling.getEnvironments(), startTime))))) .collectList() - .flatMapIterable(list -> list) + .flatMapIterable(Function.identity()) .map(status -> futurePersist(progress, dollyPerson.getIdent(), status)); } @@ -126,10 +127,12 @@ private Mono> getTpsPerson(Long starttid, String ident, Li } else { - transactionHelperService.persister(progress, BestillingProgress::setTpsSyncStatus, + transactionHelperService.persisterDynamicProgress(progress, + BestillingProgress::getTpsSyncStatus, + BestillingProgress::setTpsSyncStatus, miljoer.stream() - .map(miljoe -> String.format("%s:%s", miljoe, String.format(TPS_SYNC_START, - System.currentTimeMillis() - starttid))) + .map(miljoe -> "%s:%s".formatted(miljoe, encodeStatus(getSyncTextSystem("TPS", + System.currentTimeMillis() - starttid)))) .collect(Collectors.joining(","))); return Flux.just(1) @@ -173,12 +176,14 @@ private ClientFuture futurePersist(BestillingProgress progress, String ident, Li .map(PersonMiljoeDTO::getMiljoe) .toList()); - transactionHelperService.persister(progress, BestillingProgress::setTpsSyncStatus, + transactionHelperService.persisterDynamicProgress(progress, + BestillingProgress::getTpsSyncStatus, + BestillingProgress::setTpsSyncStatus, status.stream() .filter(detalj -> ident.equals(detalj.getIdent())) - .map(detalj -> String.format("%s:%s", detalj.getMiljoe(), - ErrorStatusDecoder.encodeStatus(detalj.isOk() ? detalj.getStatus() : - StringUtils.trimToEmpty(String.format("FEIL: %s", detalj.getUtfyllendeMelding()))))) + .map(detalj -> "%s:%s".formatted(detalj.getMiljoe(), + encodeStatus(detalj.isOk() ? detalj.getStatus() : + trimToEmpty("Feil: %s".formatted(detalj.getUtfyllendeMelding()))))) .collect(Collectors.joining(","))); return progress; }; diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/RsStatusRapport.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/RsStatusRapport.java index fd6ef82a254..26637692e92 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/RsStatusRapport.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/RsStatusRapport.java @@ -7,6 +7,7 @@ import lombok.NoArgsConstructor; import java.util.List; +import java.util.Set; @Data @Builder @@ -39,6 +40,6 @@ public static class Status { public static class Detaljert { private String miljo; - private List identer; + private Set identer; } } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/utils/OpensearchImport.java b/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/utils/OpensearchImport.java index c6352b44d7c..f1eb017384b 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/utils/OpensearchImport.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/elastic/utils/OpensearchImport.java @@ -68,7 +68,7 @@ private void oppdaterIndexSetting() { var jsonParser = jsonFactory.createParser(indexSetting); var jsonNode = (JsonNode) objectMapper.readTree(jsonParser); elasticParamsConsumer.oppdaterParametre(jsonNode) - .subscribe(status -> log.info("OpenSearch oppdatering av indeks status: {}", status)); + .subscribe(status -> log.info("OpenSearch oppdatering av indeks, status: {}", status)); } catch (IOException e) { log.error("Feilet å gjøre setting for indekser {}", INDEX_SETTING, e); diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/errorhandling/ErrorStatusDecoder.java b/apps/dolly-backend/src/main/java/no/nav/dolly/errorhandling/ErrorStatusDecoder.java index 4ca2995e69f..e156d178db2 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/errorhandling/ErrorStatusDecoder.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/errorhandling/ErrorStatusDecoder.java @@ -14,6 +14,7 @@ import java.util.Objects; import java.util.stream.Collectors; +import static no.nav.dolly.util.DollyTextUtil.getInfoTextSystem; import static org.apache.commons.lang3.StringUtils.isBlank; import static org.apache.commons.lang3.StringUtils.isNotBlank; @@ -22,8 +23,6 @@ @RequiredArgsConstructor public class ErrorStatusDecoder { - private static final String INFO_VENTER = "Info: Oppretting startet mot %s ..."; - private static final String TEKNISK_FEIL = "Teknisk feil {} mottatt fra system"; private static final String TEKNISK_FEIL_SE_LOGG = "Teknisk feil. Se logg! "; private static final String ERROR = "error"; @@ -36,7 +35,7 @@ public class ErrorStatusDecoder { public static String getInfoVenter(String system) { - return encodeStatus(String.format(INFO_VENTER, system)); + return encodeStatus(getInfoTextSystem(system)); } public static String encodeStatus(String toBeEncoded) { diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingAaregStatusMapper.java b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingAaregStatusMapper.java index 4812594402f..65cde2d4305 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingAaregStatusMapper.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingAaregStatusMapper.java @@ -7,7 +7,6 @@ import no.nav.dolly.domain.resultset.BAFeilkoder; import no.nav.dolly.domain.resultset.RsStatusRapport; -import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -52,7 +51,7 @@ public static List buildAaregStatusMap(List .detaljert(status.getValue().entrySet().stream().map(miljo -> RsStatusRapport.Detaljert.builder() .miljo(miljo.getKey()) - .identer(new ArrayList<>(miljo.getValue())) + .identer(miljo.getValue()) .build()) .toList()) .build()) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingArenaforvalterStatusMapper.java b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingArenaforvalterStatusMapper.java index 9801b44e7b7..e272bbfae29 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingArenaforvalterStatusMapper.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingArenaforvalterStatusMapper.java @@ -9,8 +9,10 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import static no.nav.dolly.bestilling.arenaforvalter.ArenaUtils.fixFormatUserDefinedError; import static no.nav.dolly.domain.resultset.SystemTyper.ARENA; @@ -33,7 +35,7 @@ public final class BestillingArenaforvalterStatusMapper { public static List buildArenaStatusMap(List progressList) { //melding // status environment ident - Map>>> meldStatusMiljoeIdents = new HashMap<>(); + Map>>> meldStatusMiljoeIdents = new HashMap<>(); progressList.forEach(progress -> { if (isNotBlank(progress.getArenaforvalterStatus())) { @@ -57,21 +59,10 @@ public static List buildArenaStatusMap(List return statusRapporter; } - private static void insertArtifact(Map>>> msgStatusIdents, + private static void insertArtifact(Map>>> msgStatusIdents, String status, String miljoe, String ident) { - String melding; - if (status.contains(BRUKER)) { - melding = BRUKER; - } else if (status.contains(AAP115)) { // må komme før sjekk på aap - melding = AAP115; - } else if (status.contains(AAP)) { - melding = AAP; - } else if (status.contains(DAGPENGER)) { - melding = DAGPENGER; - } else { - melding = ARENA_FAGSYSTEM; - } + String melding = getMelding(status); if (status.contains("OK")) { status = "OK"; @@ -84,23 +75,38 @@ private static void insertArtifact(Map(List.of(ident))); + msgStatusIdents.get(melding).get(status).put(miljoe, new HashSet<>(Set.of(ident))); } } else { - Map> miljoeIdent = new HashMap<>(); - miljoeIdent.put(miljoe, new ArrayList<>(List.of(ident))); + Map> miljoeIdent = new HashMap<>(); + miljoeIdent.put(miljoe, new HashSet<>(Set.of(ident))); msgStatusIdents.get(melding).put(status, miljoeIdent); } } else { - Map>> statusMap = new HashMap<>(); - Map> miljoeIdent = new HashMap<>(); - miljoeIdent.put(miljoe, new ArrayList<>(List.of(ident))); + Map>> statusMap = new HashMap<>(); + Map> miljoeIdent = new HashMap<>(); + miljoeIdent.put(miljoe, new HashSet<>(Set.of(ident))); statusMap.put(status, miljoeIdent); msgStatusIdents.put(melding, statusMap); } } - private static List extractStatus(Map>>> meldStatusMiljoeIdents, String clientid, SystemTyper type) { + private static String getMelding(String status) { + + if (status.contains(BRUKER)) { + return BRUKER; + } else if (status.contains(AAP115)) { // må komme før sjekk på aap + return AAP115; + } else if (status.contains(AAP)) { + return AAP; + } else if (status.contains(DAGPENGER)) { + return DAGPENGER; + } else { + return ARENA_FAGSYSTEM; + } + } + + private static List extractStatus(Map>>> meldStatusMiljoeIdents, String clientid, SystemTyper type) { if (meldStatusMiljoeIdents.containsKey(clientid)) { return Collections.singletonList(RsStatusRapport.builder() diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingDokarkivStatusMapper.java b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingDokarkivStatusMapper.java index 3c0af3f25ce..d9f2ad3a83a 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingDokarkivStatusMapper.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingDokarkivStatusMapper.java @@ -5,7 +5,6 @@ import no.nav.dolly.domain.jpa.BestillingProgress; import no.nav.dolly.domain.resultset.RsStatusRapport; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -43,7 +42,7 @@ public static List buildDokarkivStatusMap(List RsStatusRapport.Detaljert.builder() .miljo(envIdent.getKey()) - .identer(new ArrayList<>(envIdent.getValue())) + .identer(envIdent.getValue()) .build()) .toList()) .build()) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingInntektsmeldingStatusMapper.java b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingInntektsmeldingStatusMapper.java index 27ccec4de65..6df89afb636 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingInntektsmeldingStatusMapper.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingInntektsmeldingStatusMapper.java @@ -5,7 +5,6 @@ import no.nav.dolly.domain.jpa.BestillingProgress; import no.nav.dolly.domain.resultset.RsStatusRapport; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -45,7 +44,7 @@ public static List buildInntektsmeldingStatusMap(List RsStatusRapport.Detaljert.builder() .miljo(envIdent.getKey()) - .identer(new ArrayList<>(envIdent.getValue())) + .identer(envIdent.getValue()) .build()) .toList()) .build()) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingInstdataStatusMapper.java b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingInstdataStatusMapper.java index d20061cde16..a0bb649d8d6 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingInstdataStatusMapper.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingInstdataStatusMapper.java @@ -5,7 +5,6 @@ import no.nav.dolly.domain.jpa.BestillingProgress; import no.nav.dolly.domain.resultset.RsStatusRapport; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -45,7 +44,7 @@ public static List buildInstdataStatusMap(List RsStatusRapport.Detaljert.builder() .miljo(envIdent.getKey()) - .identer(new ArrayList<>(envIdent.getValue())) + .identer(envIdent.getValue()) .build()) .toList()) .build()) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingPensjonforvalterStatusMapper.java b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingPensjonforvalterStatusMapper.java index ce36eb7d756..807422d2fb6 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingPensjonforvalterStatusMapper.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingPensjonforvalterStatusMapper.java @@ -9,8 +9,10 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import static java.util.Objects.nonNull; import static no.nav.dolly.domain.resultset.SystemTyper.PEN_AP; @@ -35,7 +37,7 @@ public final class BestillingPensjonforvalterStatusMapper { public static List buildPensjonforvalterStatusMap(List progressList) { // melding status miljo ident - Map>>> meldStatusMiljoeIdents = new HashMap(); + Map>>> meldStatusMiljoeIdents = new HashMap<>(); progressList.forEach(progress -> { if (isNotBlank(progress.getPensjonforvalterStatus()) && progress.getPensjonforvalterStatus().split("#").length > 1) { @@ -57,17 +59,17 @@ public static List buildPensjonforvalterStatusMap(List(); + statusRapporter.addAll(extractStatus(meldStatusMiljoeIdents, PENSJON_FORVALTER, PEN_FORVALTER)); + statusRapporter.addAll(extractStatus(meldStatusMiljoeIdents, SAMBOER, PEN_SAMBOER)); statusRapporter.addAll(extractStatus(meldStatusMiljoeIdents, POPP_INNTEKTSREGISTER, PEN_INNTEKT)); statusRapporter.addAll(extractStatus(meldStatusMiljoeIdents, TP_FORHOLD, TP_FORVALTER)); - statusRapporter.addAll(extractStatus(meldStatusMiljoeIdents, PENSJON_FORVALTER, PEN_FORVALTER)); - statusRapporter.addAll(extractStatus(meldStatusMiljoeIdents, ALDERSPENSJON, PEN_AP)); statusRapporter.addAll(extractStatus(meldStatusMiljoeIdents, UFORETRYGD, PEN_UT)); - statusRapporter.addAll(extractStatus(meldStatusMiljoeIdents, SAMBOER, PEN_SAMBOER)); + statusRapporter.addAll(extractStatus(meldStatusMiljoeIdents, ALDERSPENSJON, PEN_AP)); return statusRapporter; } - private static void insertArtifact(Map>>> msgStatusIdents, + private static void insertArtifact(Map>>> msgStatusIdents, String melding, String status, String miljoe, String ident) { if (msgStatusIdents.containsKey(melding)) { @@ -75,23 +77,23 @@ private static void insertArtifact(Map(List.of(ident))); + msgStatusIdents.get(melding).get(status).put(miljoe, new HashSet<>(Set.of(ident))); } } else { - Map> miljoeIdent = new HashMap<>(); - miljoeIdent.put(miljoe, new ArrayList<>(List.of(ident))); + Map> miljoeIdent = new HashMap<>(); + miljoeIdent.put(miljoe, new HashSet<>(Set.of(ident))); msgStatusIdents.get(melding).put(status, miljoeIdent); } } else { - Map>> statusMap = new HashMap<>(); - Map> miljoeIdent = new HashMap(); - miljoeIdent.put(miljoe, new ArrayList<>(List.of(ident))); + Map>> statusMap = new HashMap<>(); + Map> miljoeIdent = new HashMap<>(); + miljoeIdent.put(miljoe, new HashSet<>(Set.of(ident))); statusMap.put(status, miljoeIdent); msgStatusIdents.put(melding, statusMap); } } - private static List extractStatus(Map>>> meldStatusMiljoeIdents, String clientid, SystemTyper type) { + private static List extractStatus(Map>>> meldStatusMiljoeIdents, String clientid, SystemTyper type) { if (meldStatusMiljoeIdents.containsKey(clientid)) { return Collections.singletonList(RsStatusRapport.builder() diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingTpsMessagingStatusMapper.java b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingTpsMessagingStatusMapper.java index a9feb843c8d..d5aee32c13b 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingTpsMessagingStatusMapper.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingTpsMessagingStatusMapper.java @@ -11,7 +11,6 @@ import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.util.Strings; -import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; @@ -89,7 +88,7 @@ public static List buildTpsMessagingStatusMap(List RsStatusRapport.Detaljert.builder() .miljo(miljoIdenter.getKey()) - .identer(new ArrayList<>(miljoIdenter.getValue())) + .identer(miljoIdenter.getValue()) .build()) .toList()) .build()) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingTpsPersonStatusMapper.java b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingTpsPersonStatusMapper.java index 405473c4b09..8a30d0e85da 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingTpsPersonStatusMapper.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingTpsPersonStatusMapper.java @@ -5,7 +5,6 @@ import no.nav.dolly.domain.jpa.BestillingProgress; import no.nav.dolly.domain.resultset.RsStatusRapport; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -45,7 +44,7 @@ public static List buildTpsPersonStatusMap(List RsStatusRapport.Detaljert.builder() .miljo(envIdent.getKey()) - .identer(new ArrayList<>(envIdent.getValue())) + .identer(envIdent.getValue()) .build()) .toList()) .build()) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/service/TransaksjonMappingService.java b/apps/dolly-backend/src/main/java/no/nav/dolly/service/TransaksjonMappingService.java index d128757b4bb..0da05c58ea3 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/service/TransaksjonMappingService.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/service/TransaksjonMappingService.java @@ -6,7 +6,6 @@ import com.fasterxml.jackson.databind.node.TextNode; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import ma.glasnost.orika.MapperFacade; import no.nav.dolly.domain.jpa.TransaksjonMapping; import no.nav.dolly.domain.resultset.SystemTyper; import no.nav.dolly.repository.TransaksjonMappingRepository; @@ -25,7 +24,6 @@ public class TransaksjonMappingService { private final TransaksjonMappingRepository transaksjonMappingRepository; - private final MapperFacade mapperFacade; private final ObjectMapper objectMapper; @Transactional(readOnly = true) @@ -41,7 +39,7 @@ public List getTransaksjonMapping(String system, String id public List getTransaksjonMapping(String ident) { return transaksjonMappingRepository.findAllByBestillingIdAndIdent(null, ident).stream() - .map(transasjon -> mapperFacade.map(transasjon, RsTransaksjonMapping.class)) + .map(this::toDTO) .toList(); } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/util/DollyTextUtil.java b/apps/dolly-backend/src/main/java/no/nav/dolly/util/DollyTextUtil.java new file mode 100644 index 00000000000..8066a904b1d --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/util/DollyTextUtil.java @@ -0,0 +1,32 @@ +package no.nav.dolly.util; + +import lombok.experimental.UtilityClass; + +@UtilityClass +public class DollyTextUtil { + + private static final String INFO_STARTET = "Oppretting startet"; + private static final String INFO_VENTER_SYSTEM = "Info: " + INFO_STARTET + " mot %s ..."; + private static final String SYNC_START = "Info: Synkronisering mot %s startet ... %d ms"; + private static final String INFO_SYNC = "Synkronisering mot"; + + public static String getInfoTextSystem(String system) { + + return INFO_VENTER_SYSTEM.formatted(system); + } + + public static String getInfoText() { + + return INFO_STARTET; + } + + public static String getSyncTextSystem(String system, Long millis) { + + return SYNC_START.formatted(system, millis); + } + + public static String getInfoSync() { + + return INFO_SYNC; + } +} diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/util/MdcWarraperExecutorService.java b/apps/dolly-backend/src/main/java/no/nav/dolly/util/MdcWarraperExecutorService.java deleted file mode 100644 index 5e0e00c0fbb..00000000000 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/util/MdcWarraperExecutorService.java +++ /dev/null @@ -1,92 +0,0 @@ -package no.nav.dolly.util; - -import org.slf4j.MDC; - -import java.util.Collection; -import java.util.List; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -public class MdcWarraperExecutorService implements ExecutorService { - private final ExecutorService wrapper; - - public MdcWarraperExecutorService(ExecutorService wrapper) { - this.wrapper = wrapper; - } - @Override - public void shutdown() { - wrapper.shutdown(); - } - - @Override - public List shutdownNow() { - return wrapper.shutdownNow(); - } - - @Override - public boolean isShutdown() { - return wrapper.isShutdown(); - } - - @Override - public boolean isTerminated() { - return wrapper.isTerminated(); - } - - @Override - public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException { - return wrapper.awaitTermination(timeout, unit); - } - - @Override - public Future submit(Callable task) { - return wrapper.submit(task); - } - - @Override - public Future submit(Runnable task, T result) { - return wrapper.submit(task, result); - } - - @Override - public Future submit(Runnable task) { - return wrapper.submit(task); - } - - @Override - public List> invokeAll(Collection> tasks) throws InterruptedException { - return wrapper.invokeAll(tasks); - } - - @Override - public List> invokeAll(Collection> tasks, long timeout, TimeUnit unit) throws InterruptedException { - return wrapper.invokeAll(tasks, timeout, unit); - } - - @Override - public T invokeAny(Collection> tasks) throws InterruptedException, ExecutionException { - return wrapper.invokeAny(tasks); - } - - @Override - public T invokeAny(Collection> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { - return wrapper.invokeAny(tasks, timeout, unit); - } - - @Override - public void execute(Runnable command) { - var contextMap = MDC.getCopyOfContextMap(); - wrapper.execute(() -> { - try { - MDC.setContextMap(contextMap); - command.run(); - } finally { - MDC.clear(); - } - }); - } -} diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/util/TransactionHelperService.java b/apps/dolly-backend/src/main/java/no/nav/dolly/util/TransactionHelperService.java index dee342254ff..8b3d77ed8af 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/util/TransactionHelperService.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/util/TransactionHelperService.java @@ -13,16 +13,22 @@ import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.support.TransactionTemplate; +import java.util.Arrays; +import java.util.HashMap; import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; import static java.time.LocalDateTime.now; import static java.util.Objects.nonNull; import static java.util.Objects.requireNonNull; import static no.nav.dolly.config.CachingConfig.CACHE_BESTILLING; import static no.nav.dolly.config.CachingConfig.CACHE_GRUPPE; +import static no.nav.dolly.util.DollyTextUtil.getInfoText; +import static org.apache.commons.lang3.StringUtils.isBlank; @Slf4j @Service @@ -71,7 +77,7 @@ public BestillingProgress persister(BestillingProgress bestillingProgress, BiCon bestillingProgressRepository.findByIdAndLock(bestillingProgress.getId()) .ifPresent(progress -> { - this.setField(progress, status, setter); + setter.accept(progress, status); akkumulert.set(bestillingProgressRepository.save(progress)); clearCache(); }); @@ -80,12 +86,103 @@ public BestillingProgress persister(BestillingProgress bestillingProgress, BiCon }); } + public BestillingProgress persister(BestillingProgress bestillingProgress, + Function getter, + BiConsumer setter, String status) { + + return persister(bestillingProgress, getter, setter, status, null); + } + + @Retryable + public BestillingProgress persister(BestillingProgress bestillingProgress, + Function getter, + BiConsumer setter, String status, + String separator) { + + return transactionTemplate.execute(status1 -> { + + var akkumulert = new AtomicReference<>(bestillingProgress); + + bestillingProgressRepository.findByIdAndLock(bestillingProgress.getId()) + .ifPresent(progress -> { + var value = getter.apply(progress); + var result = applyChanges(value, status, separator); + setter.accept(progress, result); + akkumulert.set(bestillingProgressRepository.save(progress)); + clearCache(); + }); + + return akkumulert.get(); + }); + } + + @Retryable + public BestillingProgress persisterDynamicProgress(BestillingProgress bestillingProgress, + Function getter, + BiConsumer setter, + String status) { + + return transactionTemplate.execute(status1 -> { + + var akkumulert = new AtomicReference<>(bestillingProgress); + + bestillingProgressRepository.findByIdAndLock(bestillingProgress.getId()) + .ifPresent(progress -> { + var value = getter.apply(progress); + var result = applyChanges(value, status); + setter.accept(progress, result); + akkumulert.set(bestillingProgressRepository.save(progress)); + clearCache(); + }); + + return akkumulert.get(); + }); + } + + private String applyChanges(String value, String status, String separator) { + + if (isBlank(value)) { + return status; + + } else { + var regex = nonNull(separator) ? separator : ","; + + return Stream.of(status.split(regex), + value.split(regex)) + .flatMap(Arrays::stream) + .filter(text -> !text.contains(getInfoText())) + .distinct() + .collect(Collectors.joining(regex)); + } + } + + private String applyChanges(String gmlStatus, String nyStatus) { + + if (isBlank(gmlStatus)) { + return nyStatus; + + } else { + + var nyeStatuser = Arrays.stream(nyStatus.split(",")) + .collect(Collectors.toMap(data -> data.split(":")[0], data -> data.split(":")[1])); + var gamleStatuser = Arrays.stream(gmlStatus.split(",")) + .collect(Collectors.toMap(data -> data.split(":")[0], data -> data.split(":")[1])); + + var resultater = new HashMap<>(gamleStatuser); + resultater.putAll(nyeStatuser); + + return resultater.entrySet().stream() + .map(data -> "%s:%s".formatted(data.getKey(), data.getValue())) + .collect(Collectors.joining(",")); + } + } + @Retryable public String getProgress(BestillingProgress bestillingProgress, Function getter) { var status = new AtomicReference(null); bestillingProgressRepository.findById(bestillingProgress.getId()) - .ifPresent(progress -> + .ifPresent(progress -> status.set(getter.apply(progress))); return status.get(); @@ -135,9 +232,4 @@ public void clearCache() { requireNonNull(cacheManager.getCache(CACHE_GRUPPE)).clear(); } } - - private void setField(T object, R value, BiConsumer setter) { - - setter.accept(object, value); - } } diff --git a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/aareg/AaregClientTest.java b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/aareg/AaregClientTest.java index 7f19f613e8a..35fae048824 100644 --- a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/aareg/AaregClientTest.java +++ b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/aareg/AaregClientTest.java @@ -179,7 +179,7 @@ void gjenopprettArbeidsforhold_tidligereArbeidsforholdFinnesAktoerPerson_returns .map(ClientFuture::get)) .assertNext(status -> { verify(transactionHelperService, times(2)) - .persister(any(BestillingProgress.class), any(), statusCaptor.capture()); + .persister(any(BestillingProgress.class), any(), any(), statusCaptor.capture()); assertThat(statusCaptor.getAllValues().get(0), is(equalTo("u2:Info= Oppretting startet mot AAREG ..."))); assertThat(statusCaptor.getAllValues().get(1), is(equalTo("u2: arbforhold=1$OK"))); }) @@ -215,7 +215,7 @@ void gjenopprettArbeidsforhold_tidligereArbeidsforholdFinnesAktoerOrganisasjon_r .map(ClientFuture::get)) .assertNext(status -> { verify(transactionHelperService, times(2)) - .persister(any(BestillingProgress.class), any(), statusCaptor.capture()); + .persister(any(BestillingProgress.class), any(), any(), statusCaptor.capture()); assertThat(statusCaptor.getAllValues().get(0), is(equalTo("u2:Info= Oppretting startet mot AAREG ..."))); assertThat(statusCaptor.getAllValues().get(1), is(equalTo("u2: arbforhold=1$OK"))); }) diff --git a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/arenaforvalter/ArenaForvalterClientTest.java b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/arenaforvalter/ArenaForvalterClientTest.java index 684f3082c28..d2b8c9bae15 100644 --- a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/arenaforvalter/ArenaForvalterClientTest.java +++ b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/arenaforvalter/ArenaForvalterClientTest.java @@ -101,7 +101,7 @@ void gjenopprett_Ok() { .map(ClientFuture::get)) .assertNext(status -> { verify(transactionHelperService, times(2)) - .persister(any(BestillingProgress.class), any(), statusCaptor.capture()); + .persister(any(BestillingProgress.class), any(), any(), statusCaptor.capture()); assertThat(statusCaptor.getAllValues().get(0), Matchers.is(equalTo("q2$BRUKER= Info= Oppretting startet mot Arena ..."))); assertThat(statusCaptor.getAllValues().get(1), Matchers.is(equalTo("q2$BRUKER Oppretting= OK"))); }) @@ -134,7 +134,7 @@ void gjenopprett_FunksjonellFeil() { .map(ClientFuture::get)) .assertNext(status -> { verify(transactionHelperService, times(2)) - .persister(any(BestillingProgress.class), any(), statusCaptor.capture()); + .persister(any(BestillingProgress.class), any(), any(), statusCaptor.capture()); assertThat(statusCaptor.getAllValues().get(0), Matchers.is(equalTo("q2$BRUKER= Info= Oppretting startet mot Arena ..."))); assertThat(statusCaptor.getAllValues().get(1), Matchers.is(equalTo("q2$BRUKER Oppretting= DUPLIKAT=message= 555 User Defined Resource Error"))); }) @@ -172,7 +172,7 @@ void gjenopprett_EnvironmentForArenaNotSelected() { .map(ClientFuture::get)) .assertNext(status -> { verify(transactionHelperService, times(2)) - .persister(any(BestillingProgress.class), any(), statusCaptor.capture()); + .persister(any(BestillingProgress.class), any(), any(), statusCaptor.capture()); assertThat(statusCaptor.getAllValues().get(0), Matchers.is(equalTo(""))); assertThat(statusCaptor.getAllValues().get(1), Matchers.is(equalTo(""))); }) diff --git a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/instdata/InstdataClientTest.java b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/instdata/InstdataClientTest.java index cfdcbdff373..49e1d0ccf17 100644 --- a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/instdata/InstdataClientTest.java +++ b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/instdata/InstdataClientTest.java @@ -100,7 +100,7 @@ void gjenopprettNaarInstdataIkkeFinnesFraFoer_SkalGiOk() { .map(ClientFuture::get)) .assertNext(status -> { verify(transactionHelperService) - .persister(any(BestillingProgress.class), any(), statusCaptor.capture()); + .persister(any(BestillingProgress.class), any(), any(), statusCaptor.capture()); assertThat(statusCaptor.getValue(), is(equalTo("q2:opphold=1$OK"))); }) .verifyComplete(); @@ -131,7 +131,7 @@ void gjenopprettNaarInstdataFinnesFraFoer_SkalGiOk() { .map(ClientFuture::get)) .assertNext(status -> { verify(transactionHelperService) - .persister(any(BestillingProgress.class), any(), statusCaptor.capture()); + .persister(any(BestillingProgress.class), any(), any(), statusCaptor.capture()); assertThat(statusCaptor.getValue(), is(equalTo("q2:opphold=1$OK"))); }) .verifyComplete(); diff --git a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClientTest.java b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClientTest.java index 0fd07cfe347..72e258ad4f5 100644 --- a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClientTest.java +++ b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClientTest.java @@ -327,7 +327,7 @@ void testLagreTpForhold_withOkResult() { .map(ClientFuture::get)) .assertNext(status -> { verify(transactionHelperService, times(2)) - .persister(any(BestillingProgress.class), any(), statusCaptor.capture()); + .persister(any(BestillingProgress.class), any(), any(), statusCaptor.capture(), anyString()); assertThat(statusCaptor.getAllValues().get(0).split("#")[0], is(equalTo("PensjonForvalter"))); assertThat(Arrays.asList(statusCaptor.getAllValues().get(0).split("#")[1].split(",")), containsInAnyOrder("TEST1:Info= Oppretting startet mot PESYS ...", "TEST2:Info= Oppretting startet mot PESYS ...")); @@ -419,7 +419,7 @@ void testLagreTpForhold_withOneFailedResult() { .map(ClientFuture::get)) .assertNext(status -> { verify(transactionHelperService, times(2)) - .persister(any(BestillingProgress.class), any(), statusCaptor.capture()); + .persister(any(BestillingProgress.class), any(), any(), statusCaptor.capture(), anyString()); assertThat(statusCaptor.getAllValues().get(0).split("#")[0], is(equalTo("PensjonForvalter"))); assertThat(Arrays.asList(statusCaptor.getAllValues().get(0).split("#")[1].split(",")), containsInAnyOrder("TEST1:Info= Oppretting startet mot PESYS ...", "TEST2:Info= Oppretting startet mot PESYS ...")); @@ -510,7 +510,7 @@ void testLagreTpForhold_withException() { .map(ClientFuture::get)) .assertNext(status -> { verify(transactionHelperService, times(2)) - .persister(any(BestillingProgress.class), any(), statusCaptor.capture()); + .persister(any(BestillingProgress.class), any(), any(), statusCaptor.capture(), anyString()); assertThat(statusCaptor.getAllValues().get(0).split("#")[0], is(equalTo("PensjonForvalter"))); assertThat(Arrays.asList(statusCaptor.getAllValues().get(0).split("#")[1].split(",")), containsInAnyOrder("TEST1:Info= Oppretting startet mot PESYS ...", "TEST2:Info= Oppretting startet mot PESYS ...")); diff --git a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/tpsmessagingservice/service/TpsPersonServiceTest.java b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/tpsmessagingservice/service/TpsPersonServiceTest.java index 56f0f870b56..739d350b1d9 100644 --- a/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/tpsmessagingservice/service/TpsPersonServiceTest.java +++ b/apps/dolly-backend/src/test/java/no/nav/dolly/bestilling/tpsmessagingservice/service/TpsPersonServiceTest.java @@ -94,9 +94,9 @@ void syncPerson_TPS_OK() { .map(ClientFuture::get)) .assertNext(status -> { verify(transactionHelperService, times(2)) - .persister(any(BestillingProgress.class), any(), statusCaptor.capture()); - assertThat(statusCaptor.getAllValues().get(0), containsString("q1:Info: Synkronisering mot TPS startet ...")); - assertThat(statusCaptor.getAllValues().get(0), containsString("q2:Info: Synkronisering mot TPS startet ...")); + .persisterDynamicProgress(any(BestillingProgress.class), any(), any(), statusCaptor.capture()); + assertThat(statusCaptor.getAllValues().get(0), containsString("q1:Info= Synkronisering mot TPS startet ...")); + assertThat(statusCaptor.getAllValues().get(0), containsString("q2:Info= Synkronisering mot TPS startet ...")); assertThat(statusCaptor.getAllValues().get(1), containsString("q1:OK")); assertThat(statusCaptor.getAllValues().get(1), containsString("q2:OK")); assertThat(progress.getIsTpsSyncEnv(), contains("q1", "q2")); @@ -148,8 +148,8 @@ void syncPerson_pensjon_med_en_TPS_OK(String pensjonType, String miljoe) { .map(ClientFuture::get)) .assertNext(status -> { verify(transactionHelperService, times(2)) - .persister(any(BestillingProgress.class), any(), statusCaptor.capture()); - assertThat(statusCaptor.getAllValues().get(0), containsString(miljoe + ":Info: Synkronisering mot TPS startet ...")); + .persisterDynamicProgress(any(BestillingProgress.class), any(), any(), statusCaptor.capture()); + assertThat(statusCaptor.getAllValues().get(0), containsString(miljoe + ":Info= Synkronisering mot TPS startet ...")); assertThat(statusCaptor.getAllValues().get(1), containsString(miljoe + ":OK")); assertThat(progress.getIsTpsSyncEnv(), contains(miljoe)); }) @@ -175,11 +175,11 @@ void syncPerson_TPS_svarer_ikke() { .map(ClientFuture::get)) .assertNext(status -> { verify(transactionHelperService, Mockito.atLeastOnce()) - .persister(any(BestillingProgress.class), any(), statusCaptor.capture()); - assertThat(statusCaptor.getAllValues().get(0), containsString("q1:Info: Synkronisering mot TPS startet ...")); - assertThat(statusCaptor.getAllValues().get(0), containsString("q2:Info: Synkronisering mot TPS startet ...")); - assertThat(statusCaptor.getAllValues().get(statusCaptor.getAllValues().size() - 1), containsString("q1:FEIL= Synkronisering mot TPS gitt opp")); - assertThat(statusCaptor.getAllValues().get(statusCaptor.getAllValues().size() - 1), containsString("q2:FEIL= Synkronisering mot TPS gitt opp")); + .persisterDynamicProgress(any(BestillingProgress.class), any(), any(), statusCaptor.capture()); + assertThat(statusCaptor.getAllValues().get(0), containsString("q1:Info= Synkronisering mot TPS startet ...")); + assertThat(statusCaptor.getAllValues().get(0), containsString("q2:Info= Synkronisering mot TPS startet ...")); + assertThat(statusCaptor.getAllValues().get(statusCaptor.getAllValues().size() - 1), containsString("q1:Feil= Synkronisering mot TPS gitt opp")); + assertThat(statusCaptor.getAllValues().get(statusCaptor.getAllValues().size() - 1), containsString("q2:Feil= Synkronisering mot TPS gitt opp")); assertThat(progress.getIsTpsSyncEnv(), is(empty())); }) .verifyComplete(); @@ -208,11 +208,11 @@ void syncPerson_en_TPS_svarer_ikke(String miljoeSomSvarer, String miljoeSomIkkeS .map(ClientFuture::get)) .assertNext(status -> { verify(transactionHelperService, Mockito.atLeastOnce()) - .persister(any(BestillingProgress.class), any(), statusCaptor.capture()); - assertThat(statusCaptor.getAllValues().get(0), containsString("q1:Info: Synkronisering mot TPS startet ...")); - assertThat(statusCaptor.getAllValues().get(0), containsString("q2:Info: Synkronisering mot TPS startet ...")); + .persisterDynamicProgress(any(BestillingProgress.class), any(), any(), statusCaptor.capture()); + assertThat(statusCaptor.getAllValues().get(0), containsString("q1:Info= Synkronisering mot TPS startet ...")); + assertThat(statusCaptor.getAllValues().get(0), containsString("q2:Info= Synkronisering mot TPS startet ...")); assertThat(statusCaptor.getAllValues().get(statusCaptor.getAllValues().size() - 1), containsString(miljoeSomSvarer + ":OK")); - assertThat(statusCaptor.getAllValues().get(statusCaptor.getAllValues().size() - 1), containsString(miljoeSomIkkeSvarer + ":FEIL= Synkronisering mot TPS gitt opp")); + assertThat(statusCaptor.getAllValues().get(statusCaptor.getAllValues().size() - 1), containsString(miljoeSomIkkeSvarer + ":Feil= Synkronisering mot TPS gitt opp")); assertThat(progress.getIsTpsSyncEnv(), contains(miljoeSomSvarer)); assertThat(progress.getIsTpsSyncEnv(), contains(not(miljoeSomIkkeSvarer))); }) @@ -235,7 +235,7 @@ void syncPerson_en_TPS_har_ikke_data(String miljoeSomHarData, String miljoeSomIk .build())); when(tpsMessagingConsumer.getPerson(IDENT, ENVS.stream().toList())).thenReturn(Flux.just( PersonMiljoeDTO.builder().miljoe(miljoeSomHarData).ident(IDENT).status("OK").build(), - PersonMiljoeDTO.builder().miljoe(miljoeSomIkkeHarData).ident(IDENT).status("FEIL").utfyllendeMelding("Personen finnes ikke").build())); + PersonMiljoeDTO.builder().miljoe(miljoeSomIkkeHarData).ident(IDENT).status("Feil").utfyllendeMelding("Personen finnes ikke").build())); var progress = getProgress(); @@ -243,11 +243,11 @@ void syncPerson_en_TPS_har_ikke_data(String miljoeSomHarData, String miljoeSomIk .map(ClientFuture::get)) .assertNext(status -> { verify(transactionHelperService, Mockito.atLeastOnce()) - .persister(any(BestillingProgress.class), any(), statusCaptor.capture()); - assertThat(statusCaptor.getAllValues().get(0), containsString("q1:Info: Synkronisering mot TPS startet ...")); - assertThat(statusCaptor.getAllValues().get(0), containsString("q2:Info: Synkronisering mot TPS startet ...")); + .persisterDynamicProgress(any(BestillingProgress.class), any(), any(), statusCaptor.capture()); + assertThat(statusCaptor.getAllValues().get(0), containsString("q1:Info= Synkronisering mot TPS startet ...")); + assertThat(statusCaptor.getAllValues().get(0), containsString("q2:Info= Synkronisering mot TPS startet ...")); assertThat(statusCaptor.getAllValues().get(statusCaptor.getAllValues().size() - 1), containsString(miljoeSomHarData + ":OK")); - assertThat(statusCaptor.getAllValues().get(statusCaptor.getAllValues().size() - 1), containsString(miljoeSomIkkeHarData + ":FEIL= Personen finnes ikke")); + assertThat(statusCaptor.getAllValues().get(statusCaptor.getAllValues().size() - 1), containsString(miljoeSomIkkeHarData + ":Feil= Personen finnes ikke")); assertThat(progress.getIsTpsSyncEnv(), contains(miljoeSomHarData)); assertThat(progress.getIsTpsSyncEnv(), contains(not(miljoeSomIkkeHarData))); }) diff --git a/apps/dolly-backend/src/test/java/no/nav/dolly/mapper/BestillingPensjonforvalterStatusMapperTest.java b/apps/dolly-backend/src/test/java/no/nav/dolly/mapper/BestillingPensjonforvalterStatusMapperTest.java index 63d12fa1f68..b2a5f016bf7 100644 --- a/apps/dolly-backend/src/test/java/no/nav/dolly/mapper/BestillingPensjonforvalterStatusMapperTest.java +++ b/apps/dolly-backend/src/test/java/no/nav/dolly/mapper/BestillingPensjonforvalterStatusMapperTest.java @@ -56,7 +56,7 @@ void buildPensjonforvalterStatusMap() { void buildPoppInntektsStatusMap() { BestillingProgress progress = BestillingProgress.builder() - .pensjonforvalterStatus(PENSJON_FORVALTER + "#q2:OK,$" + POPP_INNTEKTSREGISTER + "#q1:Feil i system,q2:OK,") + .pensjonforvalterStatus(POPP_INNTEKTSREGISTER + "#q1:Feil i system,q2:OK,") .ident(IDENT) .build(); @@ -77,7 +77,7 @@ void buildPoppInntektsStatusMap() { void buildTpForholdStatusMap() { BestillingProgress progress = BestillingProgress.builder() - .pensjonforvalterStatus(PENSJON_FORVALTER + "#q2:OK,$" + TP_FORHOLD + "#q1:Feil i system,q2:OK,") + .pensjonforvalterStatus(TP_FORHOLD + "#q1:Feil i system,q2:OK,") .ident(IDENT) .build(); From d85cc8ce5d7d10548be39ce46ad364a4c883510a Mon Sep 17 00:00:00 2001 From: stigus Date: Mon, 11 Dec 2023 10:25:35 +0100 Subject: [PATCH 2/5] =?UTF-8?q?Endret=20p=C3=A5=20visning=20av=20sn=C3=B8f?= =?UTF-8?q?all?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/dolly-frontend/src/main/js/src/snow.scss | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/apps/dolly-frontend/src/main/js/src/snow.scss b/apps/dolly-frontend/src/main/js/src/snow.scss index 42129b7a6e6..fa5627ea37e 100644 --- a/apps/dolly-frontend/src/main/js/src/snow.scss +++ b/apps/dolly-frontend/src/main/js/src/snow.scss @@ -1,36 +1,36 @@ //Hentet fra https://codepen.io/alvaromontoro/pen/GRNmdzB .snowflake { - --size: 1vw; - width: var(--size); - height: var(--size); - background: white; - border-radius: 50%; - position: absolute; - top: -5vh; + --size: 1vw; + width: var(--size); + height: var(--size); + background: white; + border-radius: 50%; + position: absolute; + top: -5vh; } @keyframes snowfall { - 0% { - transform: translate3d(var(--left-ini), 5vh, 0); - } - 100% { - transform: translate3d(var(--left-end), 100vh, 0); - } + 0% { + transform: translate3d(var(--left-ini), 5vh, 0); + } + 100% { + transform: translate3d(var(--left-end), 105vh, 0); + } } -@for $i from 1 through 50 { - .snowflake:nth-child(#{$i}) { - --size: #{random(5) * 0.2}vw; - --left-ini: #{random(20) - 10}vw; - --left-end: #{random(20) - 10}vw; - left: #{random(93)}vw; - animation: snowfall #{5 + random(10)}s linear infinite; - animation-delay: -#{random(10)}s; - } +@for $i from 1 through 80 { + .snowflake:nth-child(#{$i}) { + --size: #{(random(2) + 0.02) * 0.1}vw; + --left-ini: #{random(20) - 10}vw; + --left-end: #{random(20) - 10}vw; + left: #{random(93)}vw; + animation: snowfall #{5 + random(10)}s linear infinite; + animation-delay: -#{random(10)}s; + } } -/* added small blur every 6 snowflakes*/ -.snowflake:nth-child(6n) { - filter: blur(1px); -} \ No newline at end of file +/* added small blur every 10 snowflakes*/ +.snowflake:nth-child(10n) { + filter: blur(1px); +} From 18f23748a8e16cc0f253552ecba784e720b6df26 Mon Sep 17 00:00:00 2001 From: stigus Date: Mon, 11 Dec 2023 11:16:37 +0100 Subject: [PATCH 3/5] =?UTF-8?q?Endret=20p=C3=A5=20visning=20av=20sn=C3=B8f?= =?UTF-8?q?all?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/js/src/components/ui/background/Background.tsx | 1 + apps/dolly-frontend/src/main/js/src/snow.scss | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/background/Background.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/background/Background.tsx index a210c2fef8a..5bb36d62a49 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/background/Background.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/background/Background.tsx @@ -58,6 +58,7 @@ const DefaultBackground = styled.div` return Default }}); background-size: 100%; + overflow: hidden; background-repeat: no-repeat; background-position: center bottom; background-color: ${() => { diff --git a/apps/dolly-frontend/src/main/js/src/snow.scss b/apps/dolly-frontend/src/main/js/src/snow.scss index fa5627ea37e..8b1d0fcba08 100644 --- a/apps/dolly-frontend/src/main/js/src/snow.scss +++ b/apps/dolly-frontend/src/main/js/src/snow.scss @@ -15,7 +15,7 @@ transform: translate3d(var(--left-ini), 5vh, 0); } 100% { - transform: translate3d(var(--left-end), 105vh, 0); + transform: translate3d(var(--left-end), 99vh, 0); } } @@ -24,7 +24,7 @@ --size: #{(random(2) + 0.02) * 0.1}vw; --left-ini: #{random(20) - 10}vw; --left-end: #{random(20) - 10}vw; - left: #{random(93)}vw; + left: #{random(89)}vw; animation: snowfall #{5 + random(10)}s linear infinite; animation-delay: -#{random(10)}s; } From a5c2b902f5b971dc9b509399fad9bbbe98709707 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristen=20H=C3=A6rum?= Date: Wed, 13 Dec 2023 08:44:39 +0100 Subject: [PATCH 4/5] Feature/rydde i monorepo (#3352) * Oppdatert testnorge-statisk-data-forvalter: fjernet avhengigheter mot TPS * Slettet testnorge-tp * Slettet person-export-api * Slettet import-person-service * Slettet arbeidsforhold-export-api * Slettet statisk-data-forvalter-proxy * Ryddet i transfer-objects --- .../app.arbeidsforhold-export-api.yml | 27 -- .github/workflows/app.testnorge-tp.yml | 26 -- .../proxy.statisk-data-forvalter-proxy.yml | 27 -- ...lgangAnalyseServiceApplicationStarter.java | 2 +- apps/arbeidsforhold-export-api/Dockerfile | 8 - apps/arbeidsforhold-export-api/README.md | 22 -- apps/arbeidsforhold-export-api/build.gradle | 92 ------ apps/arbeidsforhold-export-api/config.yml | 52 ---- .../gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - apps/arbeidsforhold-export-api/gradlew | 234 -------------- apps/arbeidsforhold-export-api/gradlew.bat | 89 ------ .../gradlewUpdate.sh | 3 - .../arbeidsforhold-export-api/settings.gradle | 18 -- ...idsforholdExportApiApplicationStarter.java | 11 - .../config/AppConfig.java | 15 - .../config/DevVaultConfig.java | 36 --- .../config/JDBCConfig.java | 35 --- .../config/OpenApiConfig.java | 55 ---- .../config/SecurityConfig.java | 38 --- ...rholdSyntetiseringCsvPrinterConverter.java | 100 ------ ...AvvikSyntetiseringCsvPrinterConverter.java | 56 ---- ...ntektSyntetiseringCsvPrinterConverter.java | 56 ---- ...isjonSyntetiseringCsvPrinterConverter.java | 58 ---- .../domain/Arbeidsforhold.java | 69 ----- .../arbeidsforholdexportapi/domain/Avvik.java | 15 - .../domain/Inntekt.java | 24 -- .../domain/Permisjon.java | 26 -- .../domain/v2_0/Arbeidsforhold.java | 204 ------------- .../domain/v2_0/Avvik.java | 22 -- .../domain/v2_0/Inntekt.java | 61 ---- .../domain/v2_0/Inntektsmottaker.java | 101 ------ .../domain/v2_0/Opplysningspliktig.java | 127 -------- .../domain/v2_0/Permisjon.java | 86 ------ .../domain/v2_0/Permisjoner.java | 68 ----- .../domain/v2_1/Arbeidsforhold.java | 206 ------------- .../domain/v2_1/Avvik.java | 25 -- .../domain/v2_1/Inntekt.java | 61 ---- .../domain/v2_1/Inntektsmottaker.java | 101 ------ .../domain/v2_1/Opplysningspliktig.java | 129 -------- .../domain/v2_1/Permisjon.java | 86 ------ .../domain/v2_1/Permisjoner.java | 68 ----- .../ArbeidsforholdExportController.java | 45 --- .../provider/FileController.java | 57 ---- .../InntektsmottakerHendelseRepository.java | 77 ----- ...ktsmottakerXmlArbeidsforholdRowMapper.java | 38 --- .../InntektsmottakerXmlAvvikRowMapper.java | 38 --- ...InntektsmottakerXmlInntekterRowMapper.java | 38 --- ...ntektsmottakerXmlPermisjonerRowMapper.java | 38 --- .../service/ArbeidsforholdExportService.java | 125 -------- .../src/main/resources/application-dev.yml | 2 - .../src/main/resources/application.yml | 49 --- .../src/main/resources/bootstrap.yml | 4 - .../src/main/resources/logback-spring.xml | 39 --- .../ApplicationContextTest.java | 20 -- .../resources/application-test.properties | 4 - apps/hodejegeren/config.yml | 4 - apps/import-person-service/Dockerfile | 8 - apps/import-person-service/README.md | 17 -- apps/import-person-service/build.gradle | 89 ------ apps/import-person-service/config.yml | 54 ---- .../gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - apps/import-person-service/gradlew | 234 -------------- apps/import-person-service/gradlew.bat | 89 ------ apps/import-person-service/gradlewUpdate.sh | 3 - apps/import-person-service/settings.gradle | 17 -- ...ersonServiceServiceApplicationStarter.java | 20 -- .../importpersonservice/config/Consumers.java | 29 -- .../importpersonservice/config/DevConfig.java | 36 --- .../config/OpenApiConfig.java | 49 --- .../config/SecurityConfig.java | 42 --- .../consumer/PdlForvalterConsumer.java | 48 --- .../command/OppdaterPersonCommand.java | 36 --- .../command/SendPersonTilPdlCommand.java | 37 --- .../consumer/dto/NavnDTO.java | 15 - .../consumer/dto/PersonDTO.java | 23 -- .../request/OppdaterPersonRequest.java | 19 -- .../controller/ImportPersonController.java | 33 -- .../controller/dto/PersonDTO.java | 12 - .../controller/dto/PersonListDTO.java | 14 - .../importpersonservice/domain/Person.java | 19 -- .../domain/PersonList.java | 24 -- .../src/main/resources/application-dev.yml | 4 - .../src/main/resources/application.yml | 53 ---- .../src/main/resources/bootstrap.yml | 4 - .../src/main/resources/logback-spring.xml | 40 --- .../ApplicationContextTest.java | 18 -- .../resources/application-test.properties | 3 - .../OrganisasjonBestillingConsumer.java | 2 +- .../UpdateOrganisasjonBestillingCommand.java | 2 +- .../controller/v1/OrderController.java | 4 +- .../controller/v2/OrderControllerV2.java | 4 +- .../domain/v1/Order.java | 2 +- .../domain/v2/Order.java | 2 +- .../service/v1/OrderService.java | 4 +- .../service/v2/OrderServiceV2.java | 2 +- .../OrganisasjonBestillingConsumer.java | 2 +- .../consumer/command/GetOrdreCommand.java | 2 +- .../OrganisasjonOrdreController.java | 2 +- .../service/OrganisasjonOrdreService.java | 2 +- .../OrganisasjonBestillingConsumer.java | 2 +- .../command/RegisterBestillingCommand.java | 2 +- apps/person-export-api/Dockerfile | 8 - apps/person-export-api/README.md | 25 -- apps/person-export-api/build.gradle | 88 ------ apps/person-export-api/config.yml | 58 ---- .../gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - apps/person-export-api/gradlew | 234 -------------- apps/person-export-api/gradlew.bat | 89 ------ apps/person-export-api/gradlewUpdate.sh | 3 - apps/person-export-api/settings.gradle | 18 -- .../PersonExportApiApplicationStarter.java | 11 - .../personexportapi/adapter/SlackAdapter.java | 21 -- .../personexportapi/config/AppConfig.java | 28 -- .../personexportapi/config/Consumers.java | 30 -- .../personexportapi/config/OpenApiConfig.java | 55 ---- .../config/SecurityConfig.java | 38 --- .../personexportapi/config/VaultConfig.java | 37 --- .../consumer/KodeverkConsumer.java | 64 ---- .../consumer/TpsfConsumer.java | 113 ------- .../consumer/command/GetKodeverkCommand.java | 49 --- .../command/GetTpsfGrupperCommand.java | 40 --- .../GetTpsfMeldingerFromPageCommand.java | 43 --- .../consumer/dto/DiskresjonskoderType.java | 30 -- .../consumer/dto/EndringsmeldingDTO.java | 69 ----- .../consumer/dto/FoedselsdatoFraIdent.java | 52 ---- .../consumer/dto/GruppeDTO.java | 17 -- .../consumer/dto/HusbokstavEncoder.java | 55 ---- .../consumer/dto/KjoennFraIdent.java | 15 - .../consumer/dto/KjoennType.java | 19 -- .../consumer/dto/LandkodeEncoder.java | 288 ------------------ .../consumer/dto/PersonStatusMapper.java | 54 ---- .../consumer/dto/Sivilstatus.java | 44 --- .../response/KodeverkBetydningerResponse.java | 57 ---- .../converter/csv/HelsenettCsvConverter.java | 145 --------- .../apps/personexportapi/domain/Person.java | 205 ------------- .../provider/PersonExportController.java | 72 ----- .../src/main/resources/application.yml | 60 ---- .../src/main/resources/bootstrap.yml | 4 - .../src/main/resources/logback-spring.xml | 40 --- .../ApplicationContextTest.java | 20 -- .../src/test/resources/application-test.yml | 27 -- .../README.md | 10 +- .../config.yml | 8 - ...tatiskDataForvalterApplicationStarter.java | 5 +- .../adapter/TpsIdentTagAdapter.java | 30 -- .../adapter/TpsIdenterAdapter.java | 101 ------ .../sdforvalter/config/Consumers.java | 5 - .../rs/hodejegeren/HodejegerenConsumer.java | 50 --- .../command/GetAlleIdenterCommand.java | 33 -- .../command/GetLevendeIdenterCommand.java | 35 --- .../consumer/rs/person/PersonConsumer.java | 118 ------- .../rs/person/PersonFasteDataConsumer.java | 54 ---- .../command/SavePersonFasteDataCommand.java | 41 --- .../consumer/rs/tp/TpConsumer.java | 50 --- .../tp/command/OpprettPersonerTpCommand.java | 40 --- .../consumer/rs/tpsf/TpsfConsumer.java | 53 ---- .../tpsf/command/GetMeldingsIdsCommand.java | 37 --- .../PostSendSkdMeldingerTpsCommand.java | 38 --- .../rs/tpsf/request/SendToTpsRequest.java | 18 -- .../response/SkdMeldingerTilTpsRespons.java | 33 -- .../response/StatusPaaAvspiltSkdMelding.java | 17 -- .../converter/csv/TpsIdentCsvConverter.java | 92 ------ .../database/model/TpsIdentModel.java | 55 ---- .../database/model/TpsIdentTagModel.java | 41 --- .../repository/TpsIdentTagRepository.java | 17 -- .../repository/TpsIdenterRepository.java | 16 - .../registre/sdforvalter/domain/TpsIdent.java | 96 ------ .../sdforvalter/domain/TpsIdentListe.java | 14 - .../sdforvalter/domain/person/Person.java | 21 -- .../provider/rs/FileController.java | 49 +-- ...oller.java => OrkestreringController.java} | 35 +-- .../provider/rs/PersonController.java | 60 ---- .../rs/PersonMigreringController.java | 33 -- .../rs/v1/StaticDataControllerV1.java | 29 +- .../EnvironmentInitializationService.java | 19 +- .../sdforvalter/service/IdentService.java | 113 ------- .../sdforvalter/service/PersonService.java | 52 ---- .../src/main/resources/application-local.yml | 13 - .../src/main/resources/application.yml | 21 -- .../consumer/rs/tpsf/TpsfConsumerTest.java | 106 ------- .../rs/FileControllerIntegrationTest.java | 147 --------- ...reringControllerAaregIntegrationTest.java} | 31 +- ...streringControllerKrrIntegrationTest.java} | 12 +- ...reringsControllerIdentIntegrationTest.java | 185 ----------- ...ticDataControllerV1TpsIntegrationTest.java | 145 --------- .../src/test/resources/application-test.yml | 17 -- apps/testnorge-tp/Dockerfile | 8 - apps/testnorge-tp/README.md | 25 -- apps/testnorge-tp/build.gradle | 84 ----- apps/testnorge-tp/config.yml | 52 ---- .../gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - apps/testnorge-tp/gradlew | 234 -------------- apps/testnorge-tp/gradlew.bat | 89 ------ apps/testnorge-tp/gradlewUpdate.sh | 3 - apps/testnorge-tp/settings.gradle | 16 - .../tp/TestnorgeTpApplicationStarter.java | 12 - .../no/nav/registre/tp/config/AppConfig.java | 14 - .../no/nav/registre/tp/config/Consumers.java | 29 -- .../nav/registre/tp/config/OpenApiConfig.java | 68 ----- .../registre/tp/config/SecurityConfig.java | 37 --- .../registre/tp/config/dev/VaultConfig.java | 37 --- .../tp/consumer/HodejegerenConsumer.java | 42 --- .../nav/registre/tp/consumer/TpConsumer.java | 38 --- .../command/CreateMissingPersonsCommand.java | 13 - .../command/FindExistingPersonsCommand.java | 12 - .../command/GetLevendeIdenterCommand.java | 30 -- .../command/RemovePersonsCommand.java | 12 - .../consumer/command/TpPostListCommand.java | 34 --- .../command/TpPostStringListCommand.java | 12 - .../tp/provider/OrkestreringController.java | 63 ---- .../provider/request/OrkestreringRequest.java | 24 -- .../no/nav/registre/tp/service/TpService.java | 49 --- .../nav/registre/tp/util/WebClientFilter.java | 14 - ...itional-spring-configuration-metadata.json | 29 -- .../resources/application-local.properties | 1 - .../resources/application-prod.properties | 3 - .../src/main/resources/application.properties | 31 -- .../src/main/resources/logback-spring.xml | 42 --- .../registre/tp/ApplicationContextTest.java | 28 -- .../provider/OrkestreringControllerTest.java | 52 ---- .../resources/application-test.properties | 9 - .../v1/ApplicationInfoDTO.java | 19 -- .../v1/DependencyDTO.java | 16 - .../libs/dto/bridge/v1/ContentDTO.java | 15 - .../v1/ApplicationDependenciesDTO.java | 22 -- .../dependencyanalysis/v1/DependencyDTO.java | 19 -- .../libs/dto/hendelse/v1/HendelseDTO.java | 24 -- .../libs/dto/hendelse/v1/HendelseType.java | 6 - .../libs/dto/identpool/v1/FiktiveNavnDTO.java | 18 -- .../v1/ItemDTO.java | 2 +- .../v1/OrderDTO.java | 2 +- .../v1/Status.java | 2 +- .../v2/OrderDTO.java | 2 +- .../v2/Status.java | 2 +- .../v2/StatusDTO.java | 2 +- .../libs/dto/rapprtering/v1/EntryStatus.java | 7 - .../dto/samhandlerregisteret/v1/IdentDTO.java | 18 -- .../v1/SamhandlerDTO.java | 22 -- .../statistikkservice/v1/StatistikkDTO.java | 22 -- .../statistikkservice/v1/StatistikkType.java | 9 - .../v1/StatistikkValueType.java | 6 - .../nav/testnav/libs/dto/v1/AdresseDTO.java | 18 -- .../no/nav/testnav/libs/dto/v1/PersonDTO.java | 23 -- .../testnav/libs/dto/v1/Persondatasystem.java | 6 - proxies/kodeverk-proxy/config.yml | 2 - .../statisk-data-forvalter-proxy/Dockerfile | 8 - .../statisk-data-forvalter-proxy/build.gradle | 80 ----- .../statisk-data-forvalter-proxy/config.yml | 57 ---- .../gradle/wrapper/gradle-wrapper.jar | Bin 59203 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - proxies/statisk-data-forvalter-proxy/gradlew | 185 ----------- .../statisk-data-forvalter-proxy/gradlew.bat | 89 ------ .../settings.gradle | 19 -- .../statiskdataforvalterproxy/Consumers.java | 29 -- ...kDataForvalterProxyApplicationStarter.java | 51 ---- .../StatusController.java | 64 ---- .../src/main/resources/application.yml | 28 -- .../src/main/resources/bootstrap.yml | 4 - .../src/main/resources/logback-spring.xml | 40 --- .../ApplicationContextTest.java | 20 -- .../resources/application-test.properties | 4 - proxies/tps-forvalteren-proxy/config.yml | 4 - settings.gradle | 5 - 267 files changed, 65 insertions(+), 10937 deletions(-) delete mode 100644 .github/workflows/app.arbeidsforhold-export-api.yml delete mode 100644 .github/workflows/app.testnorge-tp.yml delete mode 100644 .github/workflows/proxy.statisk-data-forvalter-proxy.yml delete mode 100644 apps/arbeidsforhold-export-api/Dockerfile delete mode 100644 apps/arbeidsforhold-export-api/README.md delete mode 100644 apps/arbeidsforhold-export-api/build.gradle delete mode 100644 apps/arbeidsforhold-export-api/config.yml delete mode 100644 apps/arbeidsforhold-export-api/gradle/wrapper/gradle-wrapper.jar delete mode 100644 apps/arbeidsforhold-export-api/gradle/wrapper/gradle-wrapper.properties delete mode 100755 apps/arbeidsforhold-export-api/gradlew delete mode 100644 apps/arbeidsforhold-export-api/gradlew.bat delete mode 100755 apps/arbeidsforhold-export-api/gradlewUpdate.sh delete mode 100644 apps/arbeidsforhold-export-api/settings.gradle delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/ArbeidsforholdExportApiApplicationStarter.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/config/AppConfig.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/config/DevVaultConfig.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/config/JDBCConfig.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/config/OpenApiConfig.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/config/SecurityConfig.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/converter/csv/ArbeidsforholdSyntetiseringCsvPrinterConverter.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/converter/csv/AvvikSyntetiseringCsvPrinterConverter.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/converter/csv/InntektSyntetiseringCsvPrinterConverter.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/converter/csv/PermisjonSyntetiseringCsvPrinterConverter.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/Arbeidsforhold.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/Avvik.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/Inntekt.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/Permisjon.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Arbeidsforhold.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Avvik.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Inntekt.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Inntektsmottaker.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Opplysningspliktig.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Permisjon.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Permisjoner.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Arbeidsforhold.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Avvik.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Inntekt.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Inntektsmottaker.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Opplysningspliktig.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Permisjon.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Permisjoner.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/provider/ArbeidsforholdExportController.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/provider/FileController.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/repository/InntektsmottakerHendelseRepository.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/repository/mapper/InntektsmottakerXmlArbeidsforholdRowMapper.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/repository/mapper/InntektsmottakerXmlAvvikRowMapper.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/repository/mapper/InntektsmottakerXmlInntekterRowMapper.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/repository/mapper/InntektsmottakerXmlPermisjonerRowMapper.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/service/ArbeidsforholdExportService.java delete mode 100644 apps/arbeidsforhold-export-api/src/main/resources/application-dev.yml delete mode 100644 apps/arbeidsforhold-export-api/src/main/resources/application.yml delete mode 100644 apps/arbeidsforhold-export-api/src/main/resources/bootstrap.yml delete mode 100644 apps/arbeidsforhold-export-api/src/main/resources/logback-spring.xml delete mode 100644 apps/arbeidsforhold-export-api/src/test/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/ApplicationContextTest.java delete mode 100644 apps/arbeidsforhold-export-api/src/test/resources/application-test.properties delete mode 100644 apps/import-person-service/Dockerfile delete mode 100644 apps/import-person-service/README.md delete mode 100644 apps/import-person-service/build.gradle delete mode 100644 apps/import-person-service/config.yml delete mode 100644 apps/import-person-service/gradle/wrapper/gradle-wrapper.jar delete mode 100644 apps/import-person-service/gradle/wrapper/gradle-wrapper.properties delete mode 100755 apps/import-person-service/gradlew delete mode 100644 apps/import-person-service/gradlew.bat delete mode 100755 apps/import-person-service/gradlewUpdate.sh delete mode 100644 apps/import-person-service/settings.gradle delete mode 100644 apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/ImportPersonServiceServiceApplicationStarter.java delete mode 100644 apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/config/Consumers.java delete mode 100644 apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/config/DevConfig.java delete mode 100644 apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/config/OpenApiConfig.java delete mode 100644 apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/config/SecurityConfig.java delete mode 100644 apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/consumer/PdlForvalterConsumer.java delete mode 100644 apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/consumer/command/OppdaterPersonCommand.java delete mode 100644 apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/consumer/command/SendPersonTilPdlCommand.java delete mode 100644 apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/consumer/dto/NavnDTO.java delete mode 100644 apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/consumer/dto/PersonDTO.java delete mode 100644 apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/consumer/request/OppdaterPersonRequest.java delete mode 100644 apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/controller/ImportPersonController.java delete mode 100644 apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/controller/dto/PersonDTO.java delete mode 100644 apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/controller/dto/PersonListDTO.java delete mode 100644 apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/domain/Person.java delete mode 100644 apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/domain/PersonList.java delete mode 100644 apps/import-person-service/src/main/resources/application-dev.yml delete mode 100644 apps/import-person-service/src/main/resources/application.yml delete mode 100644 apps/import-person-service/src/main/resources/bootstrap.yml delete mode 100644 apps/import-person-service/src/main/resources/logback-spring.xml delete mode 100644 apps/import-person-service/src/test/java/no/nav/testnav/apps/importpersonservice/ApplicationContextTest.java delete mode 100644 apps/import-person-service/src/test/resources/application-test.properties delete mode 100644 apps/person-export-api/Dockerfile delete mode 100644 apps/person-export-api/README.md delete mode 100644 apps/person-export-api/build.gradle delete mode 100644 apps/person-export-api/config.yml delete mode 100644 apps/person-export-api/gradle/wrapper/gradle-wrapper.jar delete mode 100644 apps/person-export-api/gradle/wrapper/gradle-wrapper.properties delete mode 100755 apps/person-export-api/gradlew delete mode 100644 apps/person-export-api/gradlew.bat delete mode 100755 apps/person-export-api/gradlewUpdate.sh delete mode 100644 apps/person-export-api/settings.gradle delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/PersonExportApiApplicationStarter.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/adapter/SlackAdapter.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/config/AppConfig.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/config/Consumers.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/config/OpenApiConfig.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/config/SecurityConfig.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/config/VaultConfig.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/KodeverkConsumer.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/TpsfConsumer.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/command/GetKodeverkCommand.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/command/GetTpsfGrupperCommand.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/command/GetTpsfMeldingerFromPageCommand.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/DiskresjonskoderType.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/EndringsmeldingDTO.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/FoedselsdatoFraIdent.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/GruppeDTO.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/HusbokstavEncoder.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/KjoennFraIdent.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/KjoennType.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/LandkodeEncoder.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/PersonStatusMapper.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/Sivilstatus.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/response/KodeverkBetydningerResponse.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/converter/csv/HelsenettCsvConverter.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/domain/Person.java delete mode 100644 apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/provider/PersonExportController.java delete mode 100644 apps/person-export-api/src/main/resources/application.yml delete mode 100644 apps/person-export-api/src/main/resources/bootstrap.yml delete mode 100644 apps/person-export-api/src/main/resources/logback-spring.xml delete mode 100644 apps/person-export-api/src/test/java/no/nav/testnav/apps/personexportapi/ApplicationContextTest.java delete mode 100644 apps/person-export-api/src/test/resources/application-test.yml delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/adapter/TpsIdentTagAdapter.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/adapter/TpsIdenterAdapter.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/hodejegeren/HodejegerenConsumer.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/hodejegeren/command/GetAlleIdenterCommand.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/hodejegeren/command/GetLevendeIdenterCommand.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/person/PersonConsumer.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/person/PersonFasteDataConsumer.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/person/command/SavePersonFasteDataCommand.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tp/TpConsumer.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tp/command/OpprettPersonerTpCommand.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/TpsfConsumer.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/command/GetMeldingsIdsCommand.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/command/PostSendSkdMeldingerTpsCommand.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/request/SendToTpsRequest.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/response/SkdMeldingerTilTpsRespons.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/response/StatusPaaAvspiltSkdMelding.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/converter/csv/TpsIdentCsvConverter.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/database/model/TpsIdentModel.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/database/model/TpsIdentTagModel.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/database/repository/TpsIdentTagRepository.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/database/repository/TpsIdenterRepository.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/domain/TpsIdent.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/domain/TpsIdentListe.java rename apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/provider/rs/{OrkestreringsController.java => OrkestreringController.java} (72%) delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/provider/rs/PersonController.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/provider/rs/PersonMigreringController.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/service/IdentService.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/service/PersonService.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/TpsfConsumerTest.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/FileControllerIntegrationTest.java rename apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/{OrkestreringsControllerAaregIntegrationTest.java => OrkestreringControllerAaregIntegrationTest.java} (98%) rename apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/{OrkestreringsControllerKrrIntegrationTest.java => OrkestreringControllerKrrIntegrationTest.java} (89%) delete mode 100644 apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/OrkestreringsControllerIdentIntegrationTest.java delete mode 100644 apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/v1/StaticDataControllerV1TpsIntegrationTest.java delete mode 100644 apps/testnorge-tp/Dockerfile delete mode 100644 apps/testnorge-tp/README.md delete mode 100644 apps/testnorge-tp/build.gradle delete mode 100644 apps/testnorge-tp/config.yml delete mode 100644 apps/testnorge-tp/gradle/wrapper/gradle-wrapper.jar delete mode 100644 apps/testnorge-tp/gradle/wrapper/gradle-wrapper.properties delete mode 100755 apps/testnorge-tp/gradlew delete mode 100644 apps/testnorge-tp/gradlew.bat delete mode 100755 apps/testnorge-tp/gradlewUpdate.sh delete mode 100644 apps/testnorge-tp/settings.gradle delete mode 100644 apps/testnorge-tp/src/main/java/no/nav/registre/tp/TestnorgeTpApplicationStarter.java delete mode 100644 apps/testnorge-tp/src/main/java/no/nav/registre/tp/config/AppConfig.java delete mode 100644 apps/testnorge-tp/src/main/java/no/nav/registre/tp/config/Consumers.java delete mode 100644 apps/testnorge-tp/src/main/java/no/nav/registre/tp/config/OpenApiConfig.java delete mode 100644 apps/testnorge-tp/src/main/java/no/nav/registre/tp/config/SecurityConfig.java delete mode 100644 apps/testnorge-tp/src/main/java/no/nav/registre/tp/config/dev/VaultConfig.java delete mode 100644 apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/HodejegerenConsumer.java delete mode 100644 apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/TpConsumer.java delete mode 100644 apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/command/CreateMissingPersonsCommand.java delete mode 100644 apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/command/FindExistingPersonsCommand.java delete mode 100644 apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/command/GetLevendeIdenterCommand.java delete mode 100644 apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/command/RemovePersonsCommand.java delete mode 100644 apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/command/TpPostListCommand.java delete mode 100644 apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/command/TpPostStringListCommand.java delete mode 100644 apps/testnorge-tp/src/main/java/no/nav/registre/tp/provider/OrkestreringController.java delete mode 100644 apps/testnorge-tp/src/main/java/no/nav/registre/tp/provider/request/OrkestreringRequest.java delete mode 100644 apps/testnorge-tp/src/main/java/no/nav/registre/tp/service/TpService.java delete mode 100644 apps/testnorge-tp/src/main/java/no/nav/registre/tp/util/WebClientFilter.java delete mode 100644 apps/testnorge-tp/src/main/resources/META-INF/additional-spring-configuration-metadata.json delete mode 100644 apps/testnorge-tp/src/main/resources/application-local.properties delete mode 100644 apps/testnorge-tp/src/main/resources/application-prod.properties delete mode 100644 apps/testnorge-tp/src/main/resources/application.properties delete mode 100644 apps/testnorge-tp/src/main/resources/logback-spring.xml delete mode 100644 apps/testnorge-tp/src/test/java/no/nav/registre/tp/ApplicationContextTest.java delete mode 100644 apps/testnorge-tp/src/test/java/no/nav/registre/tp/provider/OrkestreringControllerTest.java delete mode 100644 apps/testnorge-tp/src/test/resources/application-test.properties delete mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/applikasjonsanalyseservice/v1/ApplicationInfoDTO.java delete mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/applikasjonsanalyseservice/v1/DependencyDTO.java delete mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/bridge/v1/ContentDTO.java delete mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/dependencyanalysis/v1/ApplicationDependenciesDTO.java delete mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/dependencyanalysis/v1/DependencyDTO.java delete mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/hendelse/v1/HendelseDTO.java delete mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/hendelse/v1/HendelseType.java delete mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/identpool/v1/FiktiveNavnDTO.java rename libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/{organiasjonbestilling => organisajonbestilling}/v1/ItemDTO.java (80%) rename libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/{organiasjonbestilling => organisajonbestilling}/v1/OrderDTO.java (80%) rename libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/{organiasjonbestilling => organisajonbestilling}/v1/Status.java (61%) rename libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/{organiasjonbestilling => organisajonbestilling}/v2/OrderDTO.java (89%) rename libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/{organiasjonbestilling => organisajonbestilling}/v2/Status.java (87%) rename libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/{organiasjonbestilling => organisajonbestilling}/v2/StatusDTO.java (94%) delete mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/rapprtering/v1/EntryStatus.java delete mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/samhandlerregisteret/v1/IdentDTO.java delete mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/samhandlerregisteret/v1/SamhandlerDTO.java delete mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/statistikkservice/v1/StatistikkDTO.java delete mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/statistikkservice/v1/StatistikkType.java delete mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/statistikkservice/v1/StatistikkValueType.java delete mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/v1/AdresseDTO.java delete mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/v1/PersonDTO.java delete mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/v1/Persondatasystem.java delete mode 100644 proxies/statisk-data-forvalter-proxy/Dockerfile delete mode 100644 proxies/statisk-data-forvalter-proxy/build.gradle delete mode 100644 proxies/statisk-data-forvalter-proxy/config.yml delete mode 100644 proxies/statisk-data-forvalter-proxy/gradle/wrapper/gradle-wrapper.jar delete mode 100644 proxies/statisk-data-forvalter-proxy/gradle/wrapper/gradle-wrapper.properties delete mode 100755 proxies/statisk-data-forvalter-proxy/gradlew delete mode 100644 proxies/statisk-data-forvalter-proxy/gradlew.bat delete mode 100644 proxies/statisk-data-forvalter-proxy/settings.gradle delete mode 100644 proxies/statisk-data-forvalter-proxy/src/main/java/no/nav/testnav/proxies/statiskdataforvalterproxy/Consumers.java delete mode 100644 proxies/statisk-data-forvalter-proxy/src/main/java/no/nav/testnav/proxies/statiskdataforvalterproxy/StatiskDataForvalterProxyApplicationStarter.java delete mode 100644 proxies/statisk-data-forvalter-proxy/src/main/java/no/nav/testnav/proxies/statiskdataforvalterproxy/StatusController.java delete mode 100644 proxies/statisk-data-forvalter-proxy/src/main/resources/application.yml delete mode 100644 proxies/statisk-data-forvalter-proxy/src/main/resources/bootstrap.yml delete mode 100644 proxies/statisk-data-forvalter-proxy/src/main/resources/logback-spring.xml delete mode 100644 proxies/statisk-data-forvalter-proxy/src/test/java/no/nav/testnav/proxies/statiskdataforvalterproxy/ApplicationContextTest.java delete mode 100644 proxies/statisk-data-forvalter-proxy/src/test/resources/application-test.properties diff --git a/.github/workflows/app.arbeidsforhold-export-api.yml b/.github/workflows/app.arbeidsforhold-export-api.yml deleted file mode 100644 index 3ba91ed7377..00000000000 --- a/.github/workflows/app.arbeidsforhold-export-api.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: arbeidsforhold-export-api - -on: - push: - paths: - - libs/csv-converter - - libs/servlet-core - - libs/servlet-security - - xsd/arbeidsforhold-xsd - - apps/arbeidsforhold-export-api/** - - .github/workflows/app.arbeidsforhold-export-api.yml - -jobs: - workflow: - uses: ./.github/workflows/common.workflow.backend.yml - with: - cluster: "dev-fss" - working-directory: "apps/arbeidsforhold-export-api" - deploy-tag: "#deploy-arbeidsforhold-export-api" - permissions: - contents: read - id-token: write - secrets: - NAIS_DOLLY_DEPLOY_API_KEY: ${{ secrets.NAIS_DOLLY_DEPLOY_API_KEY }} - NAIS_WORKLOAD_IDENTITY_PROVIDER: ${{ secrets.NAIS_WORKLOAD_IDENTITY_PROVIDER }} - NAV_TOKEN: ${{ secrets.NAV_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/app.testnorge-tp.yml b/.github/workflows/app.testnorge-tp.yml deleted file mode 100644 index a71a62ccd39..00000000000 --- a/.github/workflows/app.testnorge-tp.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: testnorge-tp - -on: - push: - paths: - - libs/security-core - - libs/servlet-core - - libs/servlet-security - - apps/testnorge-tp/** - - .github/workflows/app.testnorge-tp.yml - -jobs: - workflow: - uses: ./.github/workflows/common.workflow.backend.yml - with: - cluster: "dev-fss" - working-directory: "apps/testnorge-tp" - deploy-tag: "#deploy-testnorge-tp" - permissions: - contents: read - id-token: write - secrets: - NAIS_DOLLY_DEPLOY_API_KEY: ${{ secrets.NAIS_DOLLY_DEPLOY_API_KEY }} - NAIS_WORKLOAD_IDENTITY_PROVIDER: ${{ secrets.NAIS_WORKLOAD_IDENTITY_PROVIDER }} - NAV_TOKEN: ${{ secrets.NAV_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/.github/workflows/proxy.statisk-data-forvalter-proxy.yml b/.github/workflows/proxy.statisk-data-forvalter-proxy.yml deleted file mode 100644 index 8e3de7516dd..00000000000 --- a/.github/workflows/proxy.statisk-data-forvalter-proxy.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: statisk-data-forvalter-proxy - -on: - push: - paths: - - libs/reactive-core - - libs/reactive-proxy - - libs/reactive-security - - libs/security-core - - proxies/statisk-data-forvalter-proxy/** - - .github/workflows/proxy.statisk-data-forvalter-proxy.yml - -jobs: - workflow: - uses: ./.github/workflows/common.workflow.backend.yml - with: - cluster: "dev-fss" - working-directory: "proxies/statisk-data-forvalter-proxy" - deploy-tag: "#deploy-proxy" - permissions: - contents: read - id-token: write - secrets: - NAIS_DOLLY_DEPLOY_API_KEY: ${{ secrets.NAIS_DOLLY_DEPLOY_API_KEY }} - NAIS_WORKLOAD_IDENTITY_PROVIDER: ${{ secrets.NAIS_WORKLOAD_IDENTITY_PROVIDER }} - NAV_TOKEN: ${{ secrets.NAV_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} 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 293c2c8931f..9c51de93593 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 +} diff --git a/apps/arbeidsforhold-export-api/Dockerfile b/apps/arbeidsforhold-export-api/Dockerfile deleted file mode 100644 index 68d3c407ce4..00000000000 --- a/apps/arbeidsforhold-export-api/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM ghcr.io/navikt/baseimages/temurin:21 -LABEL maintainer="Team Dolly" - -ENV JAVA_OPTS="-Dspring.profiles.active=prod -Xmx2g -Xms1g" - -ADD /build/libs/app.jar /app/app.jar - -EXPOSE 8080 diff --git a/apps/arbeidsforhold-export-api/README.md b/apps/arbeidsforhold-export-api/README.md deleted file mode 100644 index c12e2ddab90..00000000000 --- a/apps/arbeidsforhold-export-api/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Arbeidsforhold-export-api -Api for å eksportere arbeidsforhold fra database. - -!!! Trenger oppdatering. - -## Swagger -Swagger finnes under [/swagger](https://testnorge-arbeidsforhold-export-api.dev.intern.nav.no/swagger) -endepunktet til applikasjonen. - -## Lokal kjøring -Ha naisdevice kjørende og kjør ArbeidsforholdExportApiApplicationStarter med følgende argumenter: -``` --Dspring.cloud.vault.token=[vault-token] --Dspring.profiles.active=dev -``` - -### Utviklerimage -I utviklerimage brukes ikke naisdevice og du må legge til følgende ekstra argumenter: -``` --Djavax.net.ssl.trustStore=[path til lokal truststore] --Djavax.net.ssl.trustStorePassword=[passord til lokal truststore] -``` - diff --git a/apps/arbeidsforhold-export-api/build.gradle b/apps/arbeidsforhold-export-api/build.gradle deleted file mode 100644 index 67cc0c78714..00000000000 --- a/apps/arbeidsforhold-export-api/build.gradle +++ /dev/null @@ -1,92 +0,0 @@ -plugins { - id 'java' - id "org.sonarqube" version "4.0.0.2929" - id 'org.springframework.boot' version "3.1.4" - id 'io.spring.dependency-management' version "1.1.3" - id "jacoco" -} - -test { - useJUnitPlatform() -} - -jacocoTestReport { - reports { - xml.required = true - } -} - -sonarqube { - properties { - property "sonar.coverage.jacoco.xmlReportPaths", "${project.buildDir}/reports/jacoco/test/jacocoTestReport.xml" - property "sonar.dynamicAnalysis", "reuseReports" - property "sonar.host.url", "https://sonarcloud.io" - property "sonar.java.coveragePlugin", "jacoco" - property "sonar.language", "java" - property "sonar.login", System.getenv("SONAR_TOKEN") - property "sonar.organization", "navikt" - property "sonar.project.monorepo.enabled", true - property "sonar.projectKey", "testnav-arbeidsforhold-export-api" - property "sonar.projectName", "testnav-arbeidsforhold-export-api" - property "sonar.sourceEncoding", "UTF-8" - } -} - - -bootJar { - archiveFileName = "app.jar" -} - -dependencyManagement { - applyMavenExclusions = false - imports { - mavenBom 'org.springframework.cloud:spring-cloud-dependencies:2022.0.4' - } -} - -repositories { - mavenCentral() - mavenLocal() -} - -dependencies { - - implementation 'no.nav.testnav.xsd:arbeidsforhold-xsd' - implementation 'no.nav.testnav.libs:servlet-core' - implementation 'no.nav.testnav.libs:csv-converter' - implementation 'no.nav.testnav.libs:servlet-security' - - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-webflux' - implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' - implementation 'org.springframework.boot:spring-boot-starter-security' - implementation 'org.springframework.boot:spring-boot-starter-jdbc' - - implementation 'org.springframework.cloud:spring-cloud-starter-vault-config' - - implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap' // TODO remove legacy bootstrap config - implementation 'org.springframework.boot:spring-boot-starter-actuator' - - implementation 'io.micrometer:micrometer-registry-prometheus' - implementation 'org.apache.commons:commons-csv:1.10.0' - implementation 'jakarta.annotation:jakarta.annotation-api:2.1.1' - implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0' - implementation 'io.swagger.core.v3:swagger-annotations-jakarta:2.2.16' - - implementation 'org.hibernate.validator:hibernate-validator' - - implementation 'net.logstash.logback:logstash-logback-encoder:7.4' - runtimeOnly 'com.oracle.database.jdbc:ojdbc8' - - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'org.springframework.cloud:spring-cloud-contract-wiremock' - - implementation 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' - testAnnotationProcessor 'org.projectlombok:lombok' -} -java { - toolchain { - languageVersion = JavaLanguageVersion.of(21) - } -} diff --git a/apps/arbeidsforhold-export-api/config.yml b/apps/arbeidsforhold-export-api/config.yml deleted file mode 100644 index 6e8ed0fd6f1..00000000000 --- a/apps/arbeidsforhold-export-api/config.yml +++ /dev/null @@ -1,52 +0,0 @@ -apiVersion: "nais.io/v1alpha1" -kind: "Application" -metadata: - name: testnorge-arbeidsforhold-export-api - namespace: dolly - labels: - team: dolly -spec: - image: {{ image }} - port: 8080 - webproxy: true - accessPolicy: - inbound: - rules: - - application: team-dolly-lokal-app - cluster: dev-gcp - - application: testnav-oversikt-frontend - cluster: dev-gcp - tokenx: - enabled: true - azure: - application: - allowAllUsers: true - enabled: true - tenant: nav.no - liveness: - path: /internal/isAlive - initialDelay: 4 - periodSeconds: 5 - failureThreshold: 500 - readiness: - path: /internal/isReady - initialDelay: 4 - periodSeconds: 5 - failureThreshold: 500 - prometheus: - enabled: true - path: /internal/metrics - replicas: - min: 1 - max: 1 - vault: - enabled: true - resources: - requests: - cpu: 200m - memory: 1024Mi - limits: - memory: 4096Mi - ingresses: - - "https://testnorge-arbeidsforhold-export-api.dev.intern.nav.no" # dev-fss - diff --git a/apps/arbeidsforhold-export-api/gradle/wrapper/gradle-wrapper.jar b/apps/arbeidsforhold-export-api/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL diff --git a/apps/arbeidsforhold-export-api/gradle/wrapper/gradle-wrapper.properties b/apps/arbeidsforhold-export-api/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index e411586a54a..00000000000 --- a/apps/arbeidsforhold-export-api/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/apps/arbeidsforhold-export-api/gradlew b/apps/arbeidsforhold-export-api/gradlew deleted file mode 100755 index 3da45c161b0..00000000000 --- a/apps/arbeidsforhold-export-api/gradlew +++ /dev/null @@ -1,234 +0,0 @@ -#!/bin/sh - -# -# Copyright ? 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions ?$var?, ?${var}?, ?${var:-default}?, ?${var+SET}?, -# ?${var#prefix}?, ?${var%suffix}?, and ?$( cmd )?; -# * compound commands having a testable exit status, especially ?case?; -# * various built-in commands including ?command?, ?set?, and ?ulimit?. -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/apps/arbeidsforhold-export-api/gradlew.bat b/apps/arbeidsforhold-export-api/gradlew.bat deleted file mode 100644 index ac1b06f9382..00000000000 --- a/apps/arbeidsforhold-export-api/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/apps/arbeidsforhold-export-api/gradlewUpdate.sh b/apps/arbeidsforhold-export-api/gradlewUpdate.sh deleted file mode 100755 index e5ee6361152..00000000000 --- a/apps/arbeidsforhold-export-api/gradlewUpdate.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -gradle wrapper \ No newline at end of file diff --git a/apps/arbeidsforhold-export-api/settings.gradle b/apps/arbeidsforhold-export-api/settings.gradle deleted file mode 100644 index dddd1167cdf..00000000000 --- a/apps/arbeidsforhold-export-api/settings.gradle +++ /dev/null @@ -1,18 +0,0 @@ -plugins { - id "com.gradle.enterprise" version "3.12.3" -} - -rootProject.name = 'arbeidsforhold-export-api' - -includeBuild '../../libs/servlet-core' -includeBuild '../../libs/servlet-security' -includeBuild '../../libs/csv-converter' - -includeBuild '../../xsd/arbeidsforhold-xsd' - -gradleEnterprise { - buildScan { - termsOfServiceUrl = "https://gradle.com/terms-of-service" - termsOfServiceAgree = "yes" - } -} \ No newline at end of file diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/ArbeidsforholdExportApiApplicationStarter.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/ArbeidsforholdExportApiApplicationStarter.java deleted file mode 100644 index 04e603aa454..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/ArbeidsforholdExportApiApplicationStarter.java +++ /dev/null @@ -1,11 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class ArbeidsforholdExportApiApplicationStarter { - public static void main(String[] args) { - SpringApplication.run(ArbeidsforholdExportApiApplicationStarter.class, args); - } -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/config/AppConfig.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/config/AppConfig.java deleted file mode 100644 index 88a2b5123f9..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/config/AppConfig.java +++ /dev/null @@ -1,15 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.config; - -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; - -import no.nav.testnav.libs.servletcore.config.ApplicationCoreConfig; -import no.nav.testnav.libs.servletsecurity.config.SecureOAuth2ServerToServerConfiguration; - -@Configuration -@Import({ - ApplicationCoreConfig.class, - SecureOAuth2ServerToServerConfiguration.class -}) -public class AppConfig { -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/config/DevVaultConfig.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/config/DevVaultConfig.java deleted file mode 100644 index fb6de4d57d6..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/config/DevVaultConfig.java +++ /dev/null @@ -1,36 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.config; - -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.vault.annotation.VaultPropertySource; -import org.springframework.vault.authentication.ClientAuthentication; -import org.springframework.vault.authentication.TokenAuthentication; -import org.springframework.vault.client.VaultEndpoint; -import org.springframework.vault.config.AbstractVaultConfiguration; - -import static io.micrometer.common.util.StringUtils.isBlank; -@Configuration -@Profile("dev") -@VaultPropertySource(value = "secret/dolly/lokal", ignoreSecretNotFound = false) -@VaultPropertySource(value = "kv/preprod/fss/testnorge-arbeidsforhold-export-api/dev", ignoreSecretNotFound = false) -public class DevVaultConfig extends AbstractVaultConfiguration { - - private static final String VAULT_TOKEN = "spring.cloud.vault.token"; - - @Override - public VaultEndpoint vaultEndpoint() { - return VaultEndpoint.create("vault.adeo.no", 443); - } - - @Override - public ClientAuthentication clientAuthentication() { - if (System.getenv().containsKey("VAULT_TOKEN")) { - System.setProperty(VAULT_TOKEN, System.getenv("VAULT_TOKEN")); - } - var token = System.getProperty(VAULT_TOKEN); - if (isBlank(token)) { - throw new IllegalArgumentException("Påkrevet property 'spring.cloud.vault.token' er ikke satt."); - } - return new TokenAuthentication(System.getProperty(VAULT_TOKEN)); - } -} \ No newline at end of file diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/config/JDBCConfig.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/config/JDBCConfig.java deleted file mode 100644 index 7704f1b584a..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/config/JDBCConfig.java +++ /dev/null @@ -1,35 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.config; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.jdbc.datasource.DriverManagerDataSource; - -import javax.sql.DataSource; - -@Configuration -public class JDBCConfig { - private final String username; - private final String password; - private final String url; - - public JDBCConfig( - @Value("${database.aareg.username}") String username, - @Value("${database.aareg.password}") String password, - @Value("${database.aareg.url}") String url - ) { - this.username = username; - this.password = password; - this.url = url; - } - - @Bean - public DataSource dataSource() { - DriverManagerDataSource dataSource = new DriverManagerDataSource(); - dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver"); - dataSource.setUrl(url); - dataSource.setUsername(username); - dataSource.setPassword(password); - return dataSource; - } -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/config/OpenApiConfig.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/config/OpenApiConfig.java deleted file mode 100644 index 37021931563..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/config/OpenApiConfig.java +++ /dev/null @@ -1,55 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.config; - -import io.swagger.v3.oas.models.Components; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.info.Contact; -import io.swagger.v3.oas.models.info.Info; -import io.swagger.v3.oas.models.info.License; -import io.swagger.v3.oas.models.security.SecurityRequirement; -import io.swagger.v3.oas.models.security.SecurityScheme; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -import java.util.Arrays; - -import no.nav.testnav.libs.servletcore.config.ApplicationProperties; - -@Configuration -public class OpenApiConfig implements WebMvcConfigurer { - - @Bean - public OpenAPI openApi(ApplicationProperties applicationProperties) { - return new OpenAPI() - .components(new Components().addSecuritySchemes("bearer-jwt", new SecurityScheme() - .type(SecurityScheme.Type.HTTP) - .scheme("bearer") - .bearerFormat("JWT") - .in(SecurityScheme.In.HEADER) - .name("Authorization") - )) - .addSecurityItem( - new SecurityRequirement().addList("bearer-jwt", Arrays.asList("read", "write"))) - .info(new Info() - .title(applicationProperties.getName()) - .version(applicationProperties.getVersion()) - .description(applicationProperties.getDescription()) - .termsOfService("https://nav.no") - .contact(new Contact() - .url("https://nav-it.slack.com/archives/CA3P9NGA2") - .email("dolly@nav.no") - .name("Team Dolly") - ) - .license(new License() - .name("MIT License") - .url("https://opensource.org/licenses/MIT") - ) - ); - } - - @Override - public void addViewControllers(ViewControllerRegistry registry) { - registry.addViewController("/swagger").setViewName("redirect:/swagger-ui.html"); - } -} \ No newline at end of file diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/config/SecurityConfig.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/config/SecurityConfig.java deleted file mode 100644 index 1557cf6b9df..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/config/SecurityConfig.java +++ /dev/null @@ -1,38 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.security.config.Customizer; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; -import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.web.SecurityFilterChain; - -@EnableWebSecurity -@Configuration -@Profile({ "prod", "dev" }) -public class SecurityConfig { - - @Bean - public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { - - httpSecurity.sessionManagement(sessionConfig -> sessionConfig.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) - .csrf(AbstractHttpConfigurer::disable) - .authorizeHttpRequests(authorizeConfig -> authorizeConfig.requestMatchers( - "/internal/**", - "/webjars/**", - "/swagger-resources/**", - "/v3/api-docs/**", - "/swagger-ui/**", - "/swagger", - "/error", - "/swagger-ui.html" - ).permitAll().requestMatchers("/api/**").fullyAuthenticated()) - .oauth2ResourceServer(oauth2RSConfig -> oauth2RSConfig.jwt(Customizer.withDefaults())); - - return httpSecurity.build(); - } -} - diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/converter/csv/ArbeidsforholdSyntetiseringCsvPrinterConverter.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/converter/csv/ArbeidsforholdSyntetiseringCsvPrinterConverter.java deleted file mode 100644 index 17d641a691b..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/converter/csv/ArbeidsforholdSyntetiseringCsvPrinterConverter.java +++ /dev/null @@ -1,100 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.converter.csv; - -import java.io.PrintWriter; -import java.util.HashMap; -import java.util.Map; - -import no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.Arbeidsforhold; -import no.nav.testnav.libs.csvconverter.CsvHeader; -import no.nav.testnav.libs.csvconverter.ObjectConverter; -import no.nav.testnav.libs.csvconverter.CsvPrinterConverter; - -public class ArbeidsforholdSyntetiseringCsvPrinterConverter extends CsvPrinterConverter { - - public ArbeidsforholdSyntetiseringCsvPrinterConverter(PrintWriter writer) { - super(writer); - } - - private enum Headers implements CsvHeader { - RAPPORTERINGSMAANED("RAPPORTERINGSMAANED"), - IDENT("IDENT"), - OPPLYSNINGSPLIKTIG("OPPLYSNINGSPLIKTIG"), - VIRKSOMHET("VIRKSOMHET"), - ARBEIDSFORHOLD_ID("ARBEIDSFORHOLD_ID"), - ARBEIDSFORHOLD_TYPE("ARBEIDSFORHOLD_TYPE"), - STARTDATO("STARTDATO"), - SLUTTDATO("SLUTTDATO"), - ANTALL_TIMER_PER_UKE_SOM_EN_FULL_STILLING_TILSVARER("ANTALL_TIMER_PER_UKE_SOM_EN_FULL_STILLING_TILSVARER"), - AVLOENNINGSTYPE("AVLOENNINGSTYPE"), - YRKE("YRKE"), - ARBEIDSTIDSORDNING("ARBEIDSTIDSORDNING"), - STILLINGSPROSENT("STILLINGSPROSENT"), - SISTE_LOENNSENDRINGSDATO("SISTE_LOENNSENDRINGSDATO"), - SISTE_DATO_FOR_STILLINGSPROSENTENDRING("SISTE_DATO_FOR_STILLINGSPROSENTENDRING"), - PERMISJON_MED_FORELDREPENGER("PERMISJON_MED_FORELDREPENGER"), - PERMITTERING("PERMITTERING"), - PERMISJON("PERMISJON"), - PERMISJON_VED_MILITAERTJENESTE("PERMISJON_VED_MILITAERTJENESTE"), - VELFERDSPERMISJON("VELFERDSPERMISJON"), - SKIPSREGISTER("SKIPSREGISTER"), - SKIPSTYPE("SKIPSTYPE"), - FARTSOMRAADE("FARTSOMRAADE"), - KILDEREFERANSE("KILDEREFERANSE"), - UTDANNINGSPERMISJON("UTDANNINGSPERMISJON"), - AARSAK_TIL_SLUTTDATO("AARSAK_TIL_SLUTTDATO"), - FORM_FOR_ANSETTELSE("FORM_FOR_ANSETTELSE"), - ANTALL_INNTEKTER("ANTALL_INNTEKTER"); - - private final String header; - - Headers(String header) { - this.header = header; - } - - @Override - public String getValue() { - return header; - } - } - - @Override - protected ObjectConverter getObjectConverter() { - return arbeidsforhold -> { - Map map = new HashMap<>(); - map.put(Headers.RAPPORTERINGSMAANED.getValue(), arbeidsforhold.getKalendermaaned()); - map.put(Headers.IDENT.getValue(), arbeidsforhold.getIdent()); - map.put(Headers.OPPLYSNINGSPLIKTIG.getValue(), arbeidsforhold.getOpplysningspliktigOrgnummer()); - map.put(Headers.VIRKSOMHET.getValue(), arbeidsforhold.getVirksomhetOrgnummer()); - map.put(Headers.ARBEIDSFORHOLD_ID.getValue(), arbeidsforhold.getArbeidsforholdId()); - map.put(Headers.ARBEIDSFORHOLD_TYPE.getValue(), arbeidsforhold.getArbeidsforholdType()); - map.put(Headers.STARTDATO.getValue(), arbeidsforhold.getStartdato()); - map.put(Headers.SLUTTDATO.getValue(), arbeidsforhold.getSluttdato()); - map.put(Headers.ANTALL_TIMER_PER_UKE_SOM_EN_FULL_STILLING_TILSVARER.getValue(), arbeidsforhold.getAntallTimerPerUkeSomEnFullStillingTilsvarer()); - map.put(Headers.AVLOENNINGSTYPE.getValue(), arbeidsforhold.getAvloenningstype()); - map.put(Headers.YRKE.getValue(), arbeidsforhold.getYrke()); - map.put(Headers.ARBEIDSTIDSORDNING.getValue(), arbeidsforhold.getArbeidstidsordning()); - map.put(Headers.STILLINGSPROSENT.getValue(), arbeidsforhold.getStillingsprosent()); - map.put(Headers.SISTE_LOENNSENDRINGSDATO.getValue(), arbeidsforhold.getSisteLoennsendringsdato()); - map.put(Headers.SISTE_DATO_FOR_STILLINGSPROSENTENDRING.getValue(), arbeidsforhold.getSisteDatoForStillingsprosentendring()); - map.put(Headers.PERMISJON_MED_FORELDREPENGER.getValue(), arbeidsforhold.getAntallPermisjonMedForeldrepenger()); - map.put(Headers.PERMITTERING.getValue(), arbeidsforhold.getAntallPermittering()); - map.put(Headers.PERMISJON.getValue(), arbeidsforhold.getAntallPermisjon()); - map.put(Headers.PERMISJON_VED_MILITAERTJENESTE.getValue(), arbeidsforhold.getAntallPermisjonVedMilitaertjeneste()); - map.put(Headers.VELFERDSPERMISJON.getValue(), arbeidsforhold.getAntallVelferdspermisjon()); - map.put(Headers.UTDANNINGSPERMISJON.getValue(), arbeidsforhold.getAntallUtdanningspermisjon()); - map.put(Headers.SKIPSREGISTER.getValue(), arbeidsforhold.getSkipsregister()); - map.put(Headers.SKIPSTYPE.getValue(), arbeidsforhold.getSkipstype()); - map.put(Headers.FARTSOMRAADE.getValue(), arbeidsforhold.getFartsomraade()); - map.put(Headers.ANTALL_INNTEKTER.getValue(), arbeidsforhold.getAntallInntekter()); - map.put(Headers.AARSAK_TIL_SLUTTDATO.getValue(), arbeidsforhold.getAarsakTilSluttdato()); - map.put(Headers.FORM_FOR_ANSETTELSE.getValue(), arbeidsforhold.getFormForAnsettelse()); - map.put(Headers.KILDEREFERANSE.getValue(), arbeidsforhold.getKildereferanse()); - return map; - }; - } - - @Override - protected CsvHeader[] getHeaders() { - return Headers.values(); - } -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/converter/csv/AvvikSyntetiseringCsvPrinterConverter.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/converter/csv/AvvikSyntetiseringCsvPrinterConverter.java deleted file mode 100644 index 50adc2d8416..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/converter/csv/AvvikSyntetiseringCsvPrinterConverter.java +++ /dev/null @@ -1,56 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.converter.csv; - -import java.io.PrintWriter; -import java.util.HashMap; -import java.util.Map; - -import no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.Avvik; -import no.nav.testnav.libs.csvconverter.CsvHeader; -import no.nav.testnav.libs.csvconverter.CsvPrinterConverter; -import no.nav.testnav.libs.csvconverter.ObjectConverter; - -public class AvvikSyntetiseringCsvPrinterConverter extends CsvPrinterConverter { - - public AvvikSyntetiseringCsvPrinterConverter(PrintWriter writer) { - super(writer); - } - - private enum Headers implements CsvHeader { - TYPE("TYPE"), - ARBEIDSFORHOLD_TYPE("ARBEIDSFORHOLD_TYPE"), - ID("ID"), - NAVN("NAVN"), - DETALJER("DETALJER"), - ALVORLIGHETSGRAD("ALVORLIGHETSGRAD"); - - private final String header; - - Headers(String header) { - this.header = header; - } - - @Override - public String getValue() { - return header; - } - } - - @Override - protected ObjectConverter getObjectConverter() { - return avvik -> { - Map map = new HashMap<>(); - map.put(Headers.TYPE.getValue(), avvik.getType()); - map.put(Headers.ARBEIDSFORHOLD_TYPE.getValue(), avvik.getArbeidsforholdType()); - map.put(Headers.ID.getValue(), avvik.getId()); - map.put(Headers.NAVN.getValue(), avvik.getNavn()); - map.put(Headers.DETALJER.getValue(), avvik.getDetaljer()); - map.put(Headers.ALVORLIGHETSGRAD.getValue(), avvik.getAlvorlighetsgrad()); - return map; - }; - } - - @Override - protected CsvHeader[] getHeaders() { - return Headers.values(); - } -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/converter/csv/InntektSyntetiseringCsvPrinterConverter.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/converter/csv/InntektSyntetiseringCsvPrinterConverter.java deleted file mode 100644 index 3e2c034e790..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/converter/csv/InntektSyntetiseringCsvPrinterConverter.java +++ /dev/null @@ -1,56 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.converter.csv; - -import java.io.PrintWriter; -import java.util.HashMap; -import java.util.Map; - -import no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.Inntekt; -import no.nav.testnav.libs.csvconverter.CsvHeader; -import no.nav.testnav.libs.csvconverter.CsvPrinterConverter; -import no.nav.testnav.libs.csvconverter.ObjectConverter; - -public class InntektSyntetiseringCsvPrinterConverter extends CsvPrinterConverter { - - public InntektSyntetiseringCsvPrinterConverter(PrintWriter writer) { - super(writer); - } - - private enum Headers implements CsvHeader { - RAPPORTERINGSMAANED("RAPPORTERINGSMAANED"), - ARBEIDSFORHOLD_TYPE("ARBEIDSFORHOLD_TYPE"), - STARTDATO_OPPTJENINGSPERIODE("STARTDATO_OPPTJENINGSPERIODE"), - SLUTTDATO_OPPTJENINGSPERIODE("SLUTTDATO_OPPTJENINGSPERIODE"), - ANTALL("ANTALL"), - OPPTJENINGSLAND("OPPTJENINGSLAND"); - - private final String header; - - Headers(String header) { - this.header = header; - } - - @Override - public String getValue() { - return header; - } - } - - @Override - protected ObjectConverter getObjectConverter() { - return inntekt -> { - Map map = new HashMap<>(); - map.put(Headers.RAPPORTERINGSMAANED.getValue(), inntekt.getKalendermaaned()); - map.put(Headers.ARBEIDSFORHOLD_TYPE.getValue(), inntekt.getTypeArbeidsforhold()); - map.put(Headers.STARTDATO_OPPTJENINGSPERIODE.getValue(), inntekt.getStartdatoOpptjeningsperiode()); - map.put(Headers.SLUTTDATO_OPPTJENINGSPERIODE.getValue(), inntekt.getSluttdatoOpptjeningsperiode()); - map.put(Headers.ANTALL.getValue(), inntekt.getAntall()); - map.put(Headers.OPPTJENINGSLAND.getValue(), inntekt.getOpptjeningsland()); - return map; - }; - } - - @Override - protected CsvHeader[] getHeaders() { - return Headers.values(); - } -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/converter/csv/PermisjonSyntetiseringCsvPrinterConverter.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/converter/csv/PermisjonSyntetiseringCsvPrinterConverter.java deleted file mode 100644 index 028edf2f52f..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/converter/csv/PermisjonSyntetiseringCsvPrinterConverter.java +++ /dev/null @@ -1,58 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.converter.csv; - -import java.io.PrintWriter; -import java.util.HashMap; -import java.util.Map; - -import no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.Permisjon; -import no.nav.testnav.libs.csvconverter.CsvHeader; -import no.nav.testnav.libs.csvconverter.CsvPrinterConverter; -import no.nav.testnav.libs.csvconverter.ObjectConverter; - -public class PermisjonSyntetiseringCsvPrinterConverter extends CsvPrinterConverter { - - public PermisjonSyntetiseringCsvPrinterConverter(PrintWriter writer) { - super(writer); - } - - private enum Headers implements CsvHeader { - KALENDERMAANED("KALENDERMAANED"), - IDENT("IDENT"), - STARTDATO("STARTDATO"), - SLUTTDATO("SLUTTDATO"), - PERMISJONSPROSENT("PERMISJONSPROSENT"), - BESKRIVELSE("BESKRIVELSE"), - KILDEREFERANSE("KILDEREFERANSE"); - - private final String header; - - Headers(String header) { - this.header = header; - } - - @Override - public String getValue() { - return header; - } - } - - @Override - protected ObjectConverter getObjectConverter() { - return permisjon -> { - Map map = new HashMap<>(); - map.put(Headers.KALENDERMAANED.getValue(), permisjon.getKalendermaaned()); - map.put(Headers.IDENT.getValue(), permisjon.getIdent()); - map.put(Headers.STARTDATO.getValue(), permisjon.getStartdato()); - map.put(Headers.SLUTTDATO.getValue(), permisjon.getSluttdato()); - map.put(Headers.PERMISJONSPROSENT.getValue(), permisjon.getPermisjonsprosent()); - map.put(Headers.BESKRIVELSE.getValue(), permisjon.getBeskrivelse()); - map.put(Headers.KILDEREFERANSE.getValue(), permisjon.getKildereferanse()); - return map; - }; - } - - @Override - protected CsvHeader[] getHeaders() { - return Headers.values(); - } -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/Arbeidsforhold.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/Arbeidsforhold.java deleted file mode 100644 index 76c22ede73e..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/Arbeidsforhold.java +++ /dev/null @@ -1,69 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain; - -import java.time.LocalDate; -import java.util.List; - -public interface Arbeidsforhold { - boolean hasAvvik(); - - String getArbeidsforholdId(); - - String getArbeidsforholdType(); - - String getYrke(); - - Float getAntallTimerPerUkeSomEnFullStillingTilsvarer(); - - LocalDate getSisteLoennsendringsdato(); - - LocalDate getSisteDatoForStillingsprosentendring(); - - String getAvloenningstype(); - - String getArbeidstidsordning(); - - Float getStillingsprosent(); - - LocalDate getStartdato(); - - LocalDate getSluttdato(); - - String getSkipsregister(); - - String getSkipstype(); - - String getFartsomraade(); - - String getKalendermaaned(); - - String getOpplysningspliktigOrgnummer(); - - String getVirksomhetOrgnummer(); - - String getIdent(); - - String getKildereferanse(); - - int getAntallVelferdspermisjon(); - - int getAntallPermisjonMedForeldrepenger(); - - int getAntallPermittering(); - - int getAntallPermisjon(); - - int getAntallPermisjonVedMilitaertjeneste(); - - int getAntallUtdanningspermisjon(); - - List getPermisjoner(); - - Integer getAntallInntekter(); - - - List getAvvikList(); - - String getAarsakTilSluttdato(); - - String getFormForAnsettelse(); -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/Avvik.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/Avvik.java deleted file mode 100644 index 3ea7a5a9e3a..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/Avvik.java +++ /dev/null @@ -1,15 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain; - -public interface Avvik { - String getId(); - - String getNavn(); - - String getAlvorlighetsgrad(); - - String getDetaljer(); - - String getType(); - - String getArbeidsforholdType(); -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/Inntekt.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/Inntekt.java deleted file mode 100644 index 184e6a86fda..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/Inntekt.java +++ /dev/null @@ -1,24 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain; - -import java.time.LocalDate; -import java.util.List; - - -public interface Inntekt { - - LocalDate getStartdatoOpptjeningsperiode(); - - LocalDate getSluttdatoOpptjeningsperiode(); - - Float getAntall(); - - String getOpptjeningsland(); - - String getKalendermaaned(); - - String getTypeArbeidsforhold(); - - List getAvvikList(); - - boolean hasAvvik(); -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/Permisjon.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/Permisjon.java deleted file mode 100644 index 942adba5062..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/Permisjon.java +++ /dev/null @@ -1,26 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain; - -import java.time.LocalDate; -import java.util.List; - -public interface Permisjon { - String getBeskrivelse(); - - Float getPermisjonsprosent(); - - LocalDate getStartdato(); - - LocalDate getSluttdato(); - - String getKildereferanse(); - - String getIdent(); - - String getKalendermaaned(); - - String getTypeArbeidsforhold(); - - boolean hasAvvik(); - - List getAvvikList(); -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Arbeidsforhold.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Arbeidsforhold.java deleted file mode 100644 index 75a1353ed8a..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Arbeidsforhold.java +++ /dev/null @@ -1,204 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.v2_0; - -import javax.xml.datatype.XMLGregorianCalendar; -import java.time.LocalDate; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -import no.nav.registre.testnorge.xsd.arbeidsforhold.v2_0.Inntektsmottaker; -import no.nav.registre.testnorge.xsd.arbeidsforhold.v2_0.Leveranse; -import no.nav.registre.testnorge.xsd.arbeidsforhold.v2_0.Virksomhet; - - -public class Arbeidsforhold implements no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.Arbeidsforhold { - private final String kalendermaaned; - private final String opplysningspliktigOrgnummer; - private final String virksomhetOrgnummer; - private final String ident; - private final String arbeidsforholdId; - private final String arbeidsforholdType; - private final String yrke; - private final Float antallTimerPerUkeSomEnFullStillingTilsvarer; - private final LocalDate sisteLoennsendringsdato; - private final LocalDate sisteDatoForStillingsprosentendring; - private final String avloenningstype; - private final String arbeidstidsordning; - private final Float stillingsprosent; - private final LocalDate startdato; - private final LocalDate sluttdato; - private final String skipsregister; - private final String skipstype; - private final String fartsomraade; - private final Permisjoner permisjoner; - private final String kildereferanse; - private final Integer antallInntekter; - private final List avvikList; - - public Arbeidsforhold( - Leveranse leveranse, - Virksomhet virksomhet, - Inntektsmottaker inntektsmottaker, - Integer antallInntekter, - no.nav.registre.testnorge.xsd.arbeidsforhold.v2_0.Arbeidsforhold arbeidsforhold - ) { - this.antallInntekter = antallInntekter; - this.virksomhetOrgnummer = virksomhet.getNorskIdentifikator(); - this.kalendermaaned = leveranse.getKalendermaaned().toString(); - this.opplysningspliktigOrgnummer = leveranse.getOpplysningspliktig().getNorskIdentifikator(); - this.kildereferanse = inntektsmottaker.getKilde().getKildereferanse(); - this.ident = inntektsmottaker.getNorskIdentifikator(); - this.permisjoner = Permisjoner.from(arbeidsforhold.getPermisjon(), getKalendermaaned(), getIdent(), getKildereferanse(), arbeidsforhold.getTypeArbeidsforhold()); - this.arbeidsforholdId = arbeidsforhold.getArbeidsforholdId(); - this.arbeidsforholdType = arbeidsforhold.getTypeArbeidsforhold(); - this.yrke = arbeidsforhold.getYrke(); - this.antallTimerPerUkeSomEnFullStillingTilsvarer = arbeidsforhold.getAntallTimerPerUkeSomEnFullStillingTilsvarer() != null - ? arbeidsforhold.getAntallTimerPerUkeSomEnFullStillingTilsvarer().floatValue() : null; - this.sisteLoennsendringsdato = toLocalDate(arbeidsforhold.getSisteLoennsendringsdato()); - this.sisteDatoForStillingsprosentendring = toLocalDate(arbeidsforhold.getSisteDatoForStillingsprosentendring()); - this.avloenningstype = arbeidsforhold.getAvloenningstype(); - this.arbeidstidsordning = arbeidsforhold.getArbeidstidsordning(); - this.stillingsprosent = arbeidsforhold.getStillingsprosent() != null - ? arbeidsforhold.getStillingsprosent().floatValue() : null; - this.startdato = toLocalDate(arbeidsforhold.getStartdato()); - this.sluttdato = toLocalDate(arbeidsforhold.getSluttdato()); - this.skipsregister = arbeidsforhold.getFartoey() != null ? arbeidsforhold.getFartoey().getSkipsregister() : null; - this.skipstype = arbeidsforhold.getFartoey() != null ? arbeidsforhold.getFartoey().getSkipstype() : null; - this.fartsomraade = arbeidsforhold.getFartoey() != null ? arbeidsforhold.getFartoey().getFartsomraade() : null; - this.avvikList = arbeidsforhold.getAvvik() != null - ? arbeidsforhold.getAvvik().stream().map(value -> new Avvik(value, "ARBEIDSFORHOLD", arbeidsforhold.getTypeArbeidsforhold())).collect(Collectors.toList()) - : Collections.emptyList(); - } - - public boolean hasAvvik() { - return !avvikList.isEmpty(); - } - - public String getArbeidsforholdId() { - return arbeidsforholdId; - } - - public String getArbeidsforholdType() { - return arbeidsforholdType; - } - - public String getYrke() { - return yrke; - } - - public Float getAntallTimerPerUkeSomEnFullStillingTilsvarer() { - return antallTimerPerUkeSomEnFullStillingTilsvarer; - } - - public LocalDate getSisteLoennsendringsdato() { - return sisteLoennsendringsdato; - } - - public LocalDate getSisteDatoForStillingsprosentendring() { - return sisteDatoForStillingsprosentendring; - } - - public String getAvloenningstype() { - return avloenningstype; - } - - public String getArbeidstidsordning() { - return arbeidstidsordning; - } - - public Float getStillingsprosent() { - return stillingsprosent; - } - - public LocalDate getStartdato() { - return startdato; - } - - public LocalDate getSluttdato() { - return sluttdato; - } - - public String getSkipsregister() { - return skipsregister; - } - - public String getSkipstype() { - return skipstype; - } - - public String getFartsomraade() { - return fartsomraade; - } - - public String getKalendermaaned() { - return kalendermaaned; - } - - public String getOpplysningspliktigOrgnummer() { - return opplysningspliktigOrgnummer; - } - - public String getVirksomhetOrgnummer() { - return virksomhetOrgnummer; - } - - public String getIdent() { - return ident; - } - public String getKildereferanse() { - return kildereferanse; - } - - public int getAntallVelferdspermisjon() { - return permisjoner.getAntallVelferdspermisjon(); - } - - public int getAntallPermisjonMedForeldrepenger() { - return permisjoner.getAntallPermisjonMedForeldrepenger(); - } - - public int getAntallPermittering() { - return permisjoner.getAntallPermittering(); - } - - public int getAntallPermisjon() { - return permisjoner.getAntallPermisjon(); - } - - public int getAntallPermisjonVedMilitaertjeneste() { - return permisjoner.getAntallPermisjonVedMilitaertjeneste(); - } - - public int getAntallUtdanningspermisjon() { - return permisjoner.getAntallUtdanningspermisjon(); - } - - public List getPermisjoner() { - return permisjoner.getList(); - } - - public Integer getAntallInntekter() { - return antallInntekter; - } - - private static LocalDate toLocalDate(XMLGregorianCalendar calendar) { - if (calendar == null) { - return null; - } - return LocalDate.of(calendar.getYear(), calendar.getMonth(), calendar.getDay()); - } - - public List getAvvikList() { - return avvikList; - } - - @Override - public String getAarsakTilSluttdato() { - return null; - } - - @Override - public String getFormForAnsettelse() { - return null; - } -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Avvik.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Avvik.java deleted file mode 100644 index c7fd49a8fbe..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Avvik.java +++ /dev/null @@ -1,22 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.v2_0; - -import lombok.Getter; - -@Getter -public class Avvik implements no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.Avvik { - private final String id; - private final String navn; - private final String alvorlighetsgrad; - private final String detaljer; - private final String type; - private final String arbeidsforholdType; - - public Avvik(no.nav.registre.testnorge.xsd.arbeidsforhold.v2_0.Avvik avvik, String type, String arbeidsforholdType) { - this.id = avvik.getId(); - this.navn = avvik.getNavn(); - this.alvorlighetsgrad = avvik.getAlvorlighetsgrad() != null ? avvik.getAlvorlighetsgrad().value() : null; - this.detaljer = avvik.getDetaljer(); - this.type = type; - this.arbeidsforholdType = arbeidsforholdType; - } -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Inntekt.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Inntekt.java deleted file mode 100644 index 82267f3e6d7..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Inntekt.java +++ /dev/null @@ -1,61 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.v2_0; - -import lombok.RequiredArgsConstructor; - -import javax.xml.datatype.XMLGregorianCalendar; -import java.time.LocalDate; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -@RequiredArgsConstructor -public class Inntekt implements no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.Inntekt { - private final no.nav.registre.testnorge.xsd.arbeidsforhold.v2_0.Inntekt inntekt; - private final String typeArbeidsforhold; - private final String kalendermaaned; - - public LocalDate getStartdatoOpptjeningsperiode() { - return toLocalDate(inntekt.getStartdatoOpptjeningsperiode()); - } - - public LocalDate getSluttdatoOpptjeningsperiode() { - return toLocalDate(inntekt.getSluttdatoOpptjeningsperiode()); - } - - public Float getAntall() { - return inntekt.getLoennsinntekt() != null && inntekt.getLoennsinntekt().getAntall() != null - ? inntekt.getLoennsinntekt().getAntall().floatValue() - : null; - } - - public String getOpptjeningsland() { - return inntekt.getLoennsinntekt() != null && inntekt.getLoennsinntekt().getSpesifikasjon() != null - ? inntekt.getLoennsinntekt().getSpesifikasjon().getOpptjeningsland() - : null; - } - - public String getKalendermaaned() { - return kalendermaaned; - } - - public String getTypeArbeidsforhold() { - return typeArbeidsforhold; - } - - private static LocalDate toLocalDate(XMLGregorianCalendar calendar) { - if (calendar == null) { - return null; - } - return LocalDate.of(calendar.getYear(), calendar.getMonth(), calendar.getDay()); - } - - public List getAvvikList(){ - return inntekt.getAvvik() != null - ? inntekt.getAvvik().stream().map(value -> new Avvik(value, "INNTEKT", typeArbeidsforhold)).collect(Collectors.toList()) - : Collections.emptyList(); - } - - public boolean hasAvvik() { - return !getAvvikList().isEmpty(); - } -} \ No newline at end of file diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Inntektsmottaker.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Inntektsmottaker.java deleted file mode 100644 index 557e1dce8b3..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Inntektsmottaker.java +++ /dev/null @@ -1,101 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.v2_0; - -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; - -import no.nav.registre.testnorge.xsd.arbeidsforhold.v2_0.Leveranse; -import no.nav.registre.testnorge.xsd.arbeidsforhold.v2_0.Virksomhet; - - -public class Inntektsmottaker { - private final List arbeidsforholdList; - private final List inntektList; - - public Inntektsmottaker( - Leveranse leveranse, - Virksomhet virksomhet, - no.nav.registre.testnorge.xsd.arbeidsforhold.v2_0.Inntektsmottaker inntektsmottaker - ) { - var counter = new AtomicInteger(); - this.arbeidsforholdList = inntektsmottaker.getArbeidsforhold() - .stream() - .map(value -> { - var index = counter.getAndIncrement(); - int antallInntekter; - if (index == 0) { - antallInntekter = getAntallInntekter(value.getArbeidsforholdId(), inntektsmottaker.getInntekt()) - + getAntallUtenArbeidsforholdMatch(inntektsmottaker.getArbeidsforhold(), inntektsmottaker.getInntekt()); - } else { - antallInntekter = getAntallInntekter(value.getArbeidsforholdId(), inntektsmottaker.getInntekt()); - } - return new Arbeidsforhold(leveranse, virksomhet, inntektsmottaker, antallInntekter, value); - }).collect(Collectors.toList()); - - this.inntektList = inntektsmottaker.getInntekt() - .stream() - .map(value -> new Inntekt( - value, - getTypeArbeidsforholdFraIntekt(value, inntektsmottaker.getArbeidsforhold()), - leveranse.getKalendermaaned().toString() - )) - .collect(Collectors.toList()); - } - - private static int getAntallUtenArbeidsforholdMatch( - List arbeidsforholdList, - List inntektList - ) { - if (inntektList == null) { - return 0; - } - var ids = inntektList.stream().map(no.nav.registre.testnorge.xsd.arbeidsforhold.v2_0.Inntekt::getArbeidsforholdId).collect(Collectors.toList()); - return (int) ids.stream().filter(id -> !contains(id, arbeidsforholdList)).count(); - } - - private static boolean contains(String arbeidsforholdId, List arbeidsforholdList) { - if (arbeidsforholdId == null) { - return false; - } - return arbeidsforholdList - .stream() - .anyMatch(value -> value.getArbeidsforholdId() != null && value.getArbeidsforholdId().equals(arbeidsforholdId)); - } - - private static int getAntallInntekter(String arbeidsforholdId, List inntektList) { - if (inntektList == null) { - return 0; - } - - return (int) inntektList - .stream() - .filter(value -> value.getArbeidsforholdId() != null && value.getArbeidsforholdId().equals(arbeidsforholdId)) - .count(); - } - - private static String getTypeArbeidsforholdFraIntekt( - no.nav.registre.testnorge.xsd.arbeidsforhold.v2_0.Inntekt inntekt, - List arbeidsforholdList - ) { - if (arbeidsforholdList.isEmpty()) { - return null; - } - if (inntekt.getArbeidsforholdId() == null) { - return arbeidsforholdList.get(0).getTypeArbeidsforhold(); - } - return arbeidsforholdList - .stream() - .filter(value -> value.getArbeidsforholdId().equals(inntekt.getArbeidsforholdId())) - .findFirst() - .orElse(arbeidsforholdList.get(0)) - .getTypeArbeidsforhold(); - } - - public List getArbeidsforholdList() { - return arbeidsforholdList; - } - - public List getInntektList() { - return inntektList; - } -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Opplysningspliktig.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Opplysningspliktig.java deleted file mode 100644 index 81359f42367..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Opplysningspliktig.java +++ /dev/null @@ -1,127 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.v2_0; - -import jakarta.xml.bind.JAXBContext; -import jakarta.xml.bind.JAXBElement; -import jakarta.xml.bind.JAXBException; -import jakarta.xml.bind.Unmarshaller; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import no.nav.registre.testnorge.xsd.arbeidsforhold.v2_0.EDAGM; - -import java.io.StringReader; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -@Slf4j -@RequiredArgsConstructor -public class Opplysningspliktig { - private static Unmarshaller unmarshaller; - - static { - try { - var jaxbContext = JAXBContext.newInstance(EDAGM.class); - unmarshaller = jaxbContext.createUnmarshaller(); - } catch (JAXBException e) { - log.error("Feil ved opprettelse av unmarshaller for EDAGM", e); - } - } - - private final EDAGM edagm; - - public List toAvvik() { - var avviks = new ArrayList(); - avviks.addAll( - getArbeidsforhold() - .stream() - .filter(Arbeidsforhold::hasAvvik) - .map(Arbeidsforhold::getAvvikList) - .flatMap(Collection::stream) - .toList() - ); - avviks.addAll( - getPermisjoner() - .stream() - .filter(Permisjon::hasAvvik) - .map(Permisjon::getAvvikList) - .flatMap(Collection::stream) - .toList() - ); - - avviks.addAll( - getInntekter() - .stream() - .filter(Inntekt::hasAvvik) - .map(Inntekt::getAvvikList) - .flatMap(Collection::stream) - .toList() - ); - return avviks; - } - - public List toPermisjoner() { - return getPermisjoner() - .stream() - .filter(value -> !value.hasAvvik()) - .toList(); - } - - public List toArbeidsforhold() { - return getArbeidsforhold() - .stream() - .filter(value -> !value.hasAvvik()) - .toList(); - } - - public List toInntekt() { - return getInntekter() - .stream() - .filter(value -> !value.hasAvvik()) - .toList(); - } - - @SneakyThrows - public static Opplysningspliktig from(String xml) { - return new Opplysningspliktig(from(xml, unmarshaller)); - } - - private List getPermisjoner() { - return getArbeidsforhold() - .stream() - .map(Arbeidsforhold::getPermisjoner) - .flatMap(Collection::stream) - .toList(); - } - - private List getArbeidsforhold() { - List arbeidsforholds = new ArrayList<>(); - var leveranse = this.edagm.getLeveranse(); - leveranse.getOppgave().getVirksomhet().forEach(virksomhet -> - virksomhet.getInntektsmottaker().forEach(inntektsmottaker -> { - var value = new Inntektsmottaker(leveranse, virksomhet, inntektsmottaker); - arbeidsforholds.addAll(value.getArbeidsforholdList()); - }) - ); - return arbeidsforholds; - } - - private List getInntekter() { - List inntekts = new ArrayList<>(); - var leveranse = this.edagm.getLeveranse(); - leveranse.getOppgave().getVirksomhet().forEach(virksomhet -> - virksomhet.getInntektsmottaker().forEach(inntektsmottaker -> { - var value = new Inntektsmottaker(leveranse, virksomhet, inntektsmottaker); - inntekts.addAll(value.getInntektList()); - }) - ); - return inntekts; - } - - @SuppressWarnings("unchecked") - private static EDAGM from(String xml, Unmarshaller unmarshaller) throws JAXBException { - try (var reader = new StringReader(xml)) { - return ((JAXBElement) unmarshaller.unmarshal(reader)).getValue(); - } - } -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Permisjon.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Permisjon.java deleted file mode 100644 index 5eea5556f9c..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Permisjon.java +++ /dev/null @@ -1,86 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.v2_0; - -import javax.xml.datatype.XMLGregorianCalendar; -import java.time.LocalDate; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -public class Permisjon implements no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.Permisjon { - private final String ident; - private final String kalendermaaned; - private final String kildereferanse; - private final String beskrivelse; - private final Float permisjonsprosent; - private final LocalDate startdato; - private final LocalDate sluttdato; - private final String typeArbeidsforhold; - private final List avvikList; - - public Permisjon( - no.nav.registre.testnorge.xsd.arbeidsforhold.v2_0.Permisjon permisjon, - String kalendermaaned, - String ident, - String kildereferans, - String typeArbeidsforhold - ) { - this.kalendermaaned = kalendermaaned; - this.ident = ident; - this.beskrivelse = permisjon.getBeskrivelse(); - this.permisjonsprosent = permisjon.getPermisjonsprosent() != null ? permisjon.getPermisjonsprosent().floatValue() : null; - this.startdato = toLocalDate(permisjon.getStartdato()); - this.sluttdato = toLocalDate(permisjon.getSluttdato()); - this.kildereferanse = kildereferans; - this.avvikList = permisjon.getAvvik() != null - ? permisjon.getAvvik().stream().map(value -> new Avvik(value, "PERMISJON", typeArbeidsforhold)).collect(Collectors.toList()) - : Collections.emptyList(); - this.typeArbeidsforhold = typeArbeidsforhold; - } - - public String getBeskrivelse() { - return beskrivelse; - } - - public Float getPermisjonsprosent() { - return permisjonsprosent; - } - - public LocalDate getStartdato() { - return startdato; - } - - public LocalDate getSluttdato() { - return sluttdato; - } - - public String getKildereferanse() { - return kildereferanse; - } - - public String getIdent() { - return ident; - } - - public String getKalendermaaned() { - return kalendermaaned; - } - - public String getTypeArbeidsforhold() { - return typeArbeidsforhold; - } - - private static LocalDate toLocalDate(XMLGregorianCalendar calendar) { - if (calendar == null) { - return null; - } - return LocalDate.of(calendar.getYear(), calendar.getMonth(), calendar.getDay()); - } - - public boolean hasAvvik() { - return !avvikList.isEmpty(); - } - - public List getAvvikList() { - return avvikList; - } -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Permisjoner.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Permisjoner.java deleted file mode 100644 index c846f2315a2..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_0/Permisjoner.java +++ /dev/null @@ -1,68 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.v2_0; - -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -public class Permisjoner { - private final List list; - - public Permisjoner(List list) { - this.list = list != null ? list : Collections.emptyList(); - } - - static Permisjoner from( - List list, - String kalendermaaned, - String ident, - String kildereferanse, - String typeArbeidsforhold - ) { - return new Permisjoner(list != null ? - list.stream().map(value -> new Permisjon( - value, - kalendermaaned, - ident, - kildereferanse, - typeArbeidsforhold - )).collect(Collectors.toList()) : null - ); - } - - private int antall(String beskrivelse) { - return list - .stream() - .filter(value -> value.getBeskrivelse().equals(beskrivelse)) - .toArray() - .length; - } - - public int getAntallVelferdspermisjon() { - return antall("velferdspermisjon"); - } - - public int getAntallPermisjonMedForeldrepenger() { - return antall("permisjonMedForeldrepenger"); - } - - public int getAntallPermittering() { - return antall("permittering"); - } - - public int getAntallPermisjon() { - return antall("permisjon"); - } - - public int getAntallPermisjonVedMilitaertjeneste() { - return antall("permisjonVedMilitaertjeneste"); - } - - public int getAntallUtdanningspermisjon() { - return antall("utdanningspermisjon"); - } - - public List getList() { - return list; - } - -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Arbeidsforhold.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Arbeidsforhold.java deleted file mode 100644 index 5d364dd4475..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Arbeidsforhold.java +++ /dev/null @@ -1,206 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.v2_1; - -import javax.xml.datatype.XMLGregorianCalendar; -import java.time.LocalDate; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -import no.nav.registre.testnorge.xsd.arbeidsforhold.v2_1.Inntektsmottaker; -import no.nav.registre.testnorge.xsd.arbeidsforhold.v2_1.Leveranse; -import no.nav.registre.testnorge.xsd.arbeidsforhold.v2_1.Virksomhet; - - -public class Arbeidsforhold implements no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.Arbeidsforhold { - private final String kalendermaaned; - private final String opplysningspliktigOrgnummer; - private final String virksomhetOrgnummer; - private final String ident; - private final String arbeidsforholdId; - private final String arbeidsforholdType; - private final String yrke; - private final Float antallTimerPerUkeSomEnFullStillingTilsvarer; - private final LocalDate sisteLoennsendringsdato; - private final LocalDate sisteDatoForStillingsprosentendring; - private final String avloenningstype; - private final String arbeidstidsordning; - private final Float stillingsprosent; - private final LocalDate startdato; - private final LocalDate sluttdato; - private final String skipsregister; - private final String skipstype; - private final String fartsomraade; - private final Permisjoner permisjoner; - private final String kildereferanse; - private final Integer antallInntekter; - private final List avvikList; - private final String aarsakTilSluttdato; - private final String formForAnsettelse; - - public Arbeidsforhold( - Leveranse leveranse, - Virksomhet virksomhet, - Inntektsmottaker inntektsmottaker, - Integer antallInntekter, - no.nav.registre.testnorge.xsd.arbeidsforhold.v2_1.Arbeidsforhold arbeidsforhold - ) { - this.antallInntekter = antallInntekter; - this.virksomhetOrgnummer = virksomhet.getNorskIdentifikator(); - this.kalendermaaned = leveranse.getKalendermaaned().toString(); - this.opplysningspliktigOrgnummer = leveranse.getOpplysningspliktig().getNorskIdentifikator(); - this.kildereferanse = inntektsmottaker.getKilde().getKildereferanse(); - this.ident = inntektsmottaker.getNorskIdentifikator(); - this.permisjoner = Permisjoner.from(arbeidsforhold.getPermisjon(), getKalendermaaned(), getIdent(), getKildereferanse(), arbeidsforhold.getTypeArbeidsforhold()); - this.arbeidsforholdId = arbeidsforhold.getArbeidsforholdId(); - this.arbeidsforholdType = arbeidsforhold.getTypeArbeidsforhold(); - this.yrke = arbeidsforhold.getYrke(); - this.antallTimerPerUkeSomEnFullStillingTilsvarer = arbeidsforhold.getAntallTimerPerUkeSomEnFullStillingTilsvarer() != null - ? arbeidsforhold.getAntallTimerPerUkeSomEnFullStillingTilsvarer().floatValue() : null; - this.sisteLoennsendringsdato = toLocalDate(arbeidsforhold.getSisteLoennsendringsdato()); - this.sisteDatoForStillingsprosentendring = toLocalDate(arbeidsforhold.getSisteDatoForStillingsprosentendring()); - this.avloenningstype = arbeidsforhold.getAvloenningstype(); - this.arbeidstidsordning = arbeidsforhold.getArbeidstidsordning(); - this.stillingsprosent = arbeidsforhold.getStillingsprosent() != null - ? arbeidsforhold.getStillingsprosent().floatValue() : null; - this.startdato = toLocalDate(arbeidsforhold.getStartdato()); - this.sluttdato = toLocalDate(arbeidsforhold.getSluttdato()); - this.skipsregister = arbeidsforhold.getFartoey() != null ? arbeidsforhold.getFartoey().getSkipsregister() : null; - this.skipstype = arbeidsforhold.getFartoey() != null ? arbeidsforhold.getFartoey().getSkipstype() : null; - this.fartsomraade = arbeidsforhold.getFartoey() != null ? arbeidsforhold.getFartoey().getFartsomraade() : null; - this.avvikList = arbeidsforhold.getAvvik() != null - ? arbeidsforhold.getAvvik().stream().map(value -> new Avvik(value, "ARBEIDSFORHOLD", arbeidsforhold.getTypeArbeidsforhold())).collect(Collectors.toList()) - : Collections.emptyList(); - this.aarsakTilSluttdato = arbeidsforhold.getAarsakTilSluttdato(); - this.formForAnsettelse = arbeidsforhold.getFormForAnsettelse(); - } - - public boolean hasAvvik() { - return !avvikList.isEmpty(); - } - - public String getArbeidsforholdId() { - return arbeidsforholdId; - } - - public String getArbeidsforholdType() { - return arbeidsforholdType; - } - - public String getYrke() { - return yrke; - } - - public Float getAntallTimerPerUkeSomEnFullStillingTilsvarer() { - return antallTimerPerUkeSomEnFullStillingTilsvarer; - } - - public LocalDate getSisteLoennsendringsdato() { - return sisteLoennsendringsdato; - } - - public LocalDate getSisteDatoForStillingsprosentendring() { - return sisteDatoForStillingsprosentendring; - } - - public String getAvloenningstype() { - return avloenningstype; - } - - public String getArbeidstidsordning() { - return arbeidstidsordning; - } - - public Float getStillingsprosent() { - return stillingsprosent; - } - - public LocalDate getStartdato() { - return startdato; - } - - public LocalDate getSluttdato() { - return sluttdato; - } - - public String getSkipsregister() { - return skipsregister; - } - - public String getSkipstype() { - return skipstype; - } - - public String getFartsomraade() { - return fartsomraade; - } - - public String getKalendermaaned() { - return kalendermaaned; - } - - public String getOpplysningspliktigOrgnummer() { - return opplysningspliktigOrgnummer; - } - - public String getVirksomhetOrgnummer() { - return virksomhetOrgnummer; - } - - public String getIdent() { - return ident; - } - public String getKildereferanse() { - return kildereferanse; - } - - public int getAntallVelferdspermisjon() { - return permisjoner.getAntallVelferdspermisjon(); - } - - public int getAntallPermisjonMedForeldrepenger() { - return permisjoner.getAntallPermisjonMedForeldrepenger(); - } - - public int getAntallPermittering() { - return permisjoner.getAntallPermittering(); - } - - public int getAntallPermisjon() { - return permisjoner.getAntallPermisjon(); - } - - public int getAntallPermisjonVedMilitaertjeneste() { - return permisjoner.getAntallPermisjonVedMilitaertjeneste(); - } - - public int getAntallUtdanningspermisjon() { - return permisjoner.getAntallUtdanningspermisjon(); - } - - public List getPermisjoner() { - return permisjoner.getList(); - } - - public Integer getAntallInntekter() { - return antallInntekter; - } - - private static LocalDate toLocalDate(XMLGregorianCalendar calendar) { - if (calendar == null) { - return null; - } - return LocalDate.of(calendar.getYear(), calendar.getMonth(), calendar.getDay()); - } - - public List getAvvikList() { - return avvikList; - } - - public String getAarsakTilSluttdato() { - return aarsakTilSluttdato; - } - - public String getFormForAnsettelse() { - return formForAnsettelse; - } -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Avvik.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Avvik.java deleted file mode 100644 index c637a66cacd..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Avvik.java +++ /dev/null @@ -1,25 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.v2_1; - -import lombok.Getter; - -@Getter -public class Avvik implements no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.Avvik { - private final String id; - private final String navn; - private final String alvorlighetsgrad; - private final String type; - private final String arbeidsforholdType; - - public Avvik(no.nav.registre.testnorge.xsd.arbeidsforhold.v2_1.Avvik avvik, String type, String arbeidsforholdType) { - this.id = avvik.getId(); - this.navn = avvik.getNavn(); - this.alvorlighetsgrad = avvik.getAlvorlighetsgrad() != null ? avvik.getAlvorlighetsgrad().value() : null; - this.type = type; - this.arbeidsforholdType = arbeidsforholdType; - } - - @Override - public String getDetaljer() { - return null; - } -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Inntekt.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Inntekt.java deleted file mode 100644 index c1cc060ec6f..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Inntekt.java +++ /dev/null @@ -1,61 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.v2_1; - -import lombok.RequiredArgsConstructor; - -import javax.xml.datatype.XMLGregorianCalendar; -import java.time.LocalDate; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -@RequiredArgsConstructor -public class Inntekt implements no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.Inntekt { - private final no.nav.registre.testnorge.xsd.arbeidsforhold.v2_1.Inntekt inntekt; - private final String typeArbeidsforhold; - private final String kalendermaaned; - - public LocalDate getStartdatoOpptjeningsperiode() { - return toLocalDate(inntekt.getStartdatoOpptjeningsperiode()); - } - - public LocalDate getSluttdatoOpptjeningsperiode() { - return toLocalDate(inntekt.getSluttdatoOpptjeningsperiode()); - } - - public Float getAntall() { - return inntekt.getLoennsinntekt() != null && inntekt.getLoennsinntekt().getAntall() != null - ? inntekt.getLoennsinntekt().getAntall().floatValue() - : null; - } - - public String getOpptjeningsland() { - return inntekt.getLoennsinntekt() != null && inntekt.getLoennsinntekt().getSpesifikasjon() != null - ? inntekt.getLoennsinntekt().getSpesifikasjon().getOpptjeningsland() - : null; - } - - public String getKalendermaaned() { - return kalendermaaned; - } - - public String getTypeArbeidsforhold() { - return typeArbeidsforhold; - } - - private static LocalDate toLocalDate(XMLGregorianCalendar calendar) { - if (calendar == null) { - return null; - } - return LocalDate.of(calendar.getYear(), calendar.getMonth(), calendar.getDay()); - } - - public List getAvvikList(){ - return inntekt.getAvvik() != null - ? inntekt.getAvvik().stream().map(value -> new Avvik(value, "INNTEKT", typeArbeidsforhold)).collect(Collectors.toList()) - : Collections.emptyList(); - } - - public boolean hasAvvik() { - return !getAvvikList().isEmpty(); - } -} \ No newline at end of file diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Inntektsmottaker.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Inntektsmottaker.java deleted file mode 100644 index 96b91a3e597..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Inntektsmottaker.java +++ /dev/null @@ -1,101 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.v2_1; - -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; - -import no.nav.registre.testnorge.xsd.arbeidsforhold.v2_1.Leveranse; -import no.nav.registre.testnorge.xsd.arbeidsforhold.v2_1.Virksomhet; - - -public class Inntektsmottaker { - private final List arbeidsforholdList; - private final List inntektList; - - public Inntektsmottaker( - Leveranse leveranse, - Virksomhet virksomhet, - no.nav.registre.testnorge.xsd.arbeidsforhold.v2_1.Inntektsmottaker inntektsmottaker - ) { - var counter = new AtomicInteger(); - this.arbeidsforholdList = inntektsmottaker.getArbeidsforhold() - .stream() - .map(value -> { - var index = counter.getAndIncrement(); - int antallInntekter; - if (index == 0) { - antallInntekter = getAntallInntekter(value.getArbeidsforholdId(), inntektsmottaker.getInntekt()) - + getAntallUtenArbeidsforholdMatch(inntektsmottaker.getArbeidsforhold(), inntektsmottaker.getInntekt()); - } else { - antallInntekter = getAntallInntekter(value.getArbeidsforholdId(), inntektsmottaker.getInntekt()); - } - return new Arbeidsforhold(leveranse, virksomhet, inntektsmottaker, antallInntekter, value); - }).collect(Collectors.toList()); - - this.inntektList = inntektsmottaker.getInntekt() - .stream() - .map(value -> new Inntekt( - value, - getTypeArbeidsforholdFraIntekt(value, inntektsmottaker.getArbeidsforhold()), - leveranse.getKalendermaaned().toString() - )) - .collect(Collectors.toList()); - } - - private static int getAntallUtenArbeidsforholdMatch( - List arbeidsforholdList, - List inntektList - ) { - if (inntektList == null) { - return 0; - } - var ids = inntektList.stream().map(no.nav.registre.testnorge.xsd.arbeidsforhold.v2_1.Inntekt::getArbeidsforholdId).collect(Collectors.toList()); - return (int) ids.stream().filter(id -> !contains(id, arbeidsforholdList)).count(); - } - - private static boolean contains(String arbeidsforholdId, List arbeidsforholdList) { - if (arbeidsforholdId == null) { - return false; - } - return arbeidsforholdList - .stream() - .anyMatch(value -> value.getArbeidsforholdId() != null && value.getArbeidsforholdId().equals(arbeidsforholdId)); - } - - private static int getAntallInntekter(String arbeidsforholdId, List inntektList) { - if (inntektList == null) { - return 0; - } - - return (int) inntektList - .stream() - .filter(value -> value.getArbeidsforholdId() != null && value.getArbeidsforholdId().equals(arbeidsforholdId)) - .count(); - } - - private static String getTypeArbeidsforholdFraIntekt( - no.nav.registre.testnorge.xsd.arbeidsforhold.v2_1.Inntekt inntekt, - List arbeidsforholdList - ) { - if (arbeidsforholdList.isEmpty()) { - return null; - } - if (inntekt.getArbeidsforholdId() == null) { - return arbeidsforholdList.get(0).getTypeArbeidsforhold(); - } - return arbeidsforholdList - .stream() - .filter(value -> value.getArbeidsforholdId().equals(inntekt.getArbeidsforholdId())) - .findFirst() - .orElse(arbeidsforholdList.get(0)) - .getTypeArbeidsforhold(); - } - - public List getArbeidsforholdList() { - return arbeidsforholdList; - } - - public List getInntektList() { - return inntektList; - } -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Opplysningspliktig.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Opplysningspliktig.java deleted file mode 100644 index 3e58a9c0a5a..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Opplysningspliktig.java +++ /dev/null @@ -1,129 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.v2_1; - -import jakarta.xml.bind.JAXBContext; -import jakarta.xml.bind.JAXBElement; -import jakarta.xml.bind.JAXBException; -import jakarta.xml.bind.Unmarshaller; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.registre.testnorge.xsd.arbeidsforhold.v2_1.EDAGM; - -import java.io.StringReader; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -@Slf4j -@RequiredArgsConstructor -public class Opplysningspliktig { - private static Unmarshaller unmarshaller; - - static { - try { - var jaxbContext = JAXBContext.newInstance(EDAGM.class); - unmarshaller = jaxbContext.createUnmarshaller(); - } catch (JAXBException e) { - log.error("Feil ved opprettelse av unmarshaller for EDAGM", e); - } - } - - private final EDAGM edagm; - - public List toAvvik() { - var avviks = new ArrayList(); - avviks.addAll( - getArbeidsforhold() - .stream() - .filter(Arbeidsforhold::hasAvvik) - .map(Arbeidsforhold::getAvvikList) - .flatMap(Collection::stream) - .toList() - ); - avviks.addAll( - getPermisjoner() - .stream() - .filter(Permisjon::hasAvvik) - .map(Permisjon::getAvvikList) - .flatMap(Collection::stream) - .toList() - ); - - avviks.addAll( - getInntekter() - .stream() - .filter(Inntekt::hasAvvik) - .map(Inntekt::getAvvikList) - .flatMap(Collection::stream) - .toList() - ); - return avviks; - } - - public List toPermisjoner() { - return getPermisjoner() - .stream() - .filter(value -> !value.hasAvvik()) - .toList(); - } - - public List toArbeidsforhold() { - return getArbeidsforhold() - .stream() - .filter(value -> !value.hasAvvik()) - .toList(); - } - - public List toInntekt() { - return getInntekter() - .stream() - .filter(value -> !value.hasAvvik()) - .toList(); - } - - public static Opplysningspliktig from(String xml) { - try { - return new Opplysningspliktig(from(xml, unmarshaller)); - } catch (Exception e) { - throw new RuntimeException("Klarer ikke a konvertere xmlene til EDAGM", e); - } - } - - private List getPermisjoner() { - return getArbeidsforhold() - .stream() - .map(Arbeidsforhold::getPermisjoner) - .flatMap(Collection::stream) - .toList(); - } - - private List getArbeidsforhold() { - List arbeidsforholds = new ArrayList<>(); - var leveranse = this.edagm.getLeveranse(); - leveranse.getOppgave().getVirksomhet().forEach(virksomhet -> - virksomhet.getInntektsmottaker().forEach(inntektsmottaker -> { - var value = new Inntektsmottaker(leveranse, virksomhet, inntektsmottaker); - arbeidsforholds.addAll(value.getArbeidsforholdList()); - }) - ); - return arbeidsforholds; - } - - private List getInntekter() { - List inntekts = new ArrayList<>(); - var leveranse = this.edagm.getLeveranse(); - leveranse.getOppgave().getVirksomhet().forEach(virksomhet -> - virksomhet.getInntektsmottaker().forEach(inntektsmottaker -> { - var value = new Inntektsmottaker(leveranse, virksomhet, inntektsmottaker); - inntekts.addAll(value.getInntektList()); - }) - ); - return inntekts; - } - - @SuppressWarnings("unchecked") - private static EDAGM from(String xml, Unmarshaller unmarshaller) throws JAXBException { - try (var reader = new StringReader(xml)) { - return ((JAXBElement) unmarshaller.unmarshal(reader)).getValue(); - } - } -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Permisjon.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Permisjon.java deleted file mode 100644 index 1842a77cb74..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Permisjon.java +++ /dev/null @@ -1,86 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.v2_1; - -import javax.xml.datatype.XMLGregorianCalendar; -import java.time.LocalDate; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -public class Permisjon implements no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.Permisjon { - private final String ident; - private final String kalendermaaned; - private final String kildereferanse; - private final String beskrivelse; - private final Float permisjonsprosent; - private final LocalDate startdato; - private final LocalDate sluttdato; - private final String typeArbeidsforhold; - private final List avvikList; - - public Permisjon( - no.nav.registre.testnorge.xsd.arbeidsforhold.v2_1.Permisjon permisjon, - String kalendermaaned, - String ident, - String kildereferans, - String typeArbeidsforhold - ) { - this.kalendermaaned = kalendermaaned; - this.ident = ident; - this.beskrivelse = permisjon.getBeskrivelse(); - this.permisjonsprosent = permisjon.getPermisjonsprosent() != null ? permisjon.getPermisjonsprosent().floatValue() : null; - this.startdato = toLocalDate(permisjon.getStartdato()); - this.sluttdato = toLocalDate(permisjon.getSluttdato()); - this.kildereferanse = kildereferans; - this.avvikList = permisjon.getAvvik() != null - ? permisjon.getAvvik().stream().map(value -> new Avvik(value, "PERMISJON", typeArbeidsforhold)).collect(Collectors.toList()) - : Collections.emptyList(); - this.typeArbeidsforhold = typeArbeidsforhold; - } - - public String getBeskrivelse() { - return beskrivelse; - } - - public Float getPermisjonsprosent() { - return permisjonsprosent; - } - - public LocalDate getStartdato() { - return startdato; - } - - public LocalDate getSluttdato() { - return sluttdato; - } - - public String getKildereferanse() { - return kildereferanse; - } - - public String getIdent() { - return ident; - } - - public String getKalendermaaned() { - return kalendermaaned; - } - - public String getTypeArbeidsforhold() { - return typeArbeidsforhold; - } - - private static LocalDate toLocalDate(XMLGregorianCalendar calendar) { - if (calendar == null) { - return null; - } - return LocalDate.of(calendar.getYear(), calendar.getMonth(), calendar.getDay()); - } - - public boolean hasAvvik() { - return !avvikList.isEmpty(); - } - - public List getAvvikList() { - return avvikList; - } -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Permisjoner.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Permisjoner.java deleted file mode 100644 index e0308f5699f..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/domain/v2_1/Permisjoner.java +++ /dev/null @@ -1,68 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.v2_1; - -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -public class Permisjoner { - private final List list; - - public Permisjoner(List list) { - this.list = list != null ? list : Collections.emptyList(); - } - - static Permisjoner from( - List list, - String kalendermaaned, - String ident, - String kildereferanse, - String typeArbeidsforhold - ) { - return new Permisjoner(list != null ? - list.stream().map(value -> new Permisjon( - value, - kalendermaaned, - ident, - kildereferanse, - typeArbeidsforhold - )).collect(Collectors.toList()) : null - ); - } - - private int antall(String beskrivelse) { - return list - .stream() - .filter(value -> value.getBeskrivelse().equals(beskrivelse)) - .toArray() - .length; - } - - public int getAntallVelferdspermisjon() { - return antall("velferdspermisjon"); - } - - public int getAntallPermisjonMedForeldrepenger() { - return antall("permisjonMedForeldrepenger"); - } - - public int getAntallPermittering() { - return antall("permittering"); - } - - public int getAntallPermisjon() { - return antall("permisjon"); - } - - public int getAntallPermisjonVedMilitaertjeneste() { - return antall("permisjonVedMilitaertjeneste"); - } - - public int getAntallUtdanningspermisjon() { - return antall("utdanningspermisjon"); - } - - public List getList() { - return list; - } - -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/provider/ArbeidsforholdExportController.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/provider/ArbeidsforholdExportController.java deleted file mode 100644 index 27ec23ac24a..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/provider/ArbeidsforholdExportController.java +++ /dev/null @@ -1,45 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.provider; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.no.registere.testnorge.arbeidsforholdexportapi.service.ArbeidsforholdExportService; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.io.IOException; -import java.net.URI; - -@Slf4j -@RestController -@RequestMapping("/api/v1/arbeidsforhold") -@RequiredArgsConstructor -public class ArbeidsforholdExportController { - private final ArbeidsforholdExportService service; - - @GetMapping - public ResponseEntity getArbeidsforhold() throws IOException { - var path = service.writeArbeidsforhold(); - return ResponseEntity.created(URI.create("/api/v1/files/tmp/" + path.getFileName().toString())).build(); - } - - @GetMapping("/permisjoner") - public ResponseEntity getPermisjoner() throws IOException { - var path = service.writePermisjoner(); - return ResponseEntity.created(URI.create("/api/v1/files/tmp/" + path.getFileName().toString())).build(); - } - - @GetMapping("/inntekter") - public ResponseEntity getInntekter() throws IOException { - var path = service.writeInntekter(); - return ResponseEntity.created(URI.create("/api/v1/files/tmp/" + path.getFileName().toString())).build(); - } - - @GetMapping("/avvik") - public ResponseEntity getAvvik() throws IOException { - var path = service.writeAvvik(); - return ResponseEntity.created(URI.create("/api/v1/files/tmp/" + path.getFileName().toString())).build(); - } -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/provider/FileController.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/provider/FileController.java deleted file mode 100644 index ea7f0113b74..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/provider/FileController.java +++ /dev/null @@ -1,57 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.provider; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.core.io.UrlResource; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.time.LocalDateTime; -import java.util.List; -import java.util.stream.Stream; - -@Slf4j -@RestController -@RequestMapping("/api/v1/files/tmp") -public class FileController { - - @GetMapping - public ResponseEntity> getFiles() throws IOException { - try (Stream paths = Files.walk(Paths.get("/tmp"))) { - return ResponseEntity.ok(paths - .filter(Files::isRegularFile) - .map(value -> value.getFileName().toString()) - .filter(value -> value.endsWith(".csv")) - .toList() - ); - } - } - - @GetMapping("/{filename}") - public ResponseEntity getFile(@PathVariable("filename") String filename) throws IOException { - try (Stream paths = Files.walk(Paths.get("/tmp"))) { - var path = paths.filter(Files::isRegularFile).filter(value -> value.getFileName().toString().equals(filename)).findFirst(); - - if (path.isEmpty()) { - return ResponseEntity.notFound().build(); - } - var resource = new UrlResource(path.get().toUri()); - - log.info("Laster ned fil: {}", filename); - - return ResponseEntity - .ok() - .contentType(MediaType.parseMediaType("text/csv")) - .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=export-" + LocalDateTime.now() + ".csv") - .body(resource); - } - } -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/repository/InntektsmottakerHendelseRepository.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/repository/InntektsmottakerHendelseRepository.java deleted file mode 100644 index b99406dbd09..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/repository/InntektsmottakerHendelseRepository.java +++ /dev/null @@ -1,77 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.repository; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.Arbeidsforhold; -import no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.Avvik; -import no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.Inntekt; -import no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.Permisjon; -import no.nav.no.registere.testnorge.arbeidsforholdexportapi.repository.mapper.InntektsmottakerXmlArbeidsforholdRowMapper; -import no.nav.no.registere.testnorge.arbeidsforholdexportapi.repository.mapper.InntektsmottakerXmlAvvikRowMapper; -import no.nav.no.registere.testnorge.arbeidsforholdexportapi.repository.mapper.InntektsmottakerXmlInntekterRowMapper; -import no.nav.no.registere.testnorge.arbeidsforholdexportapi.repository.mapper.InntektsmottakerXmlPermisjonerRowMapper; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Repository; - -import java.util.Collection; -import java.util.List; -import java.util.stream.Collectors; - -@Slf4j -@Repository -@RequiredArgsConstructor -public class InntektsmottakerHendelseRepository { - private final JdbcTemplate jdbcTemplate; - - public Integer count() { - return jdbcTemplate.queryForObject( - "SELECT COUNT(*) FROM temp_uttrekk_inhe", - Integer.class - ); - } - - public List getArbeidsforhold(int page, int size) { - log.info("Henter {} INNTEKTSMOTTAKER_XML fra DB...", size); - List list = jdbcTemplate.query( - "SELECT INNTEKTSMOTTAKER_XML FROM temp_uttrekk_inhe ORDER BY EFF_OPPLYSNINGSPLIKTIG_ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY", - new Object[]{ page * size, size }, - new InntektsmottakerXmlArbeidsforholdRowMapper(page * size, count()) - ).stream().flatMap(Collection::stream).collect(Collectors.toList()); - log.info("Hentet {} INNTEKTSMOTTAKER_XML med {} arbeidsforhold fra DB.", size, list.size()); - return list; - } - - public List getPermisjoner(int page, int size) { - log.info("Henter {} INNTEKTSMOTTAKER_XML fra DB...", size); - List list = jdbcTemplate.query( - "SELECT INNTEKTSMOTTAKER_XML FROM temp_uttrekk_inhe ORDER BY EFF_OPPLYSNINGSPLIKTIG_ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY", - new Object[]{ page * size, size }, - new InntektsmottakerXmlPermisjonerRowMapper(page * size, count()) - ).stream().flatMap(Collection::stream).collect(Collectors.toList()); - log.info("Hentet {} INNTEKTSMOTTAKER_XML med {} permisjoner fra DB.", size, list.size()); - return list; - } - - public List getInntekter(int page, int size) { - log.info("Henter {} INNTEKTSMOTTAKER_XML fra DB...", size); - List list = jdbcTemplate.query( - "SELECT INNTEKTSMOTTAKER_XML FROM temp_uttrekk_inhe ORDER BY EFF_OPPLYSNINGSPLIKTIG_ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY", - new Object[]{ page * size, size }, - new InntektsmottakerXmlInntekterRowMapper(page * size, count()) - ).stream().flatMap(Collection::stream).collect(Collectors.toList()); - log.info("Hentet {} INNTEKTSMOTTAKER_XML med {} inntekter fra DB.", size, list.size()); - return list; - } - - public List getAvvik(int page, int size) { - log.info("Henter {} INNTEKTSMOTTAKER_XML fra DB...", size); - List list = jdbcTemplate.query( - "SELECT INNTEKTSMOTTAKER_XML FROM temp_uttrekk_inhe ORDER BY EFF_OPPLYSNINGSPLIKTIG_ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY", - new Object[]{ page * size, size }, - new InntektsmottakerXmlAvvikRowMapper(page * size, count()) - ).stream().flatMap(Collection::stream) - .collect(Collectors.toList()); - log.info("Hentet {} INNTEKTSMOTTAKER_XML med {} inntekter fra DB.", size, list.size()); - return list; - } -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/repository/mapper/InntektsmottakerXmlArbeidsforholdRowMapper.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/repository/mapper/InntektsmottakerXmlArbeidsforholdRowMapper.java deleted file mode 100644 index 7ca515b672e..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/repository/mapper/InntektsmottakerXmlArbeidsforholdRowMapper.java +++ /dev/null @@ -1,38 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.repository.mapper; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.jdbc.core.RowMapper; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; - -import no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.Arbeidsforhold; - -@Slf4j -@RequiredArgsConstructor -public class InntektsmottakerXmlArbeidsforholdRowMapper implements RowMapper> { - private final Integer page; - private final Integer total; - - private boolean isV2_1(String xml) { - return xml.contains("urn:nav:a-arbeidsforhold:v2_1"); - } - - @Override - public List mapRow(ResultSet rs, int rowNum) throws SQLException { - if ((rowNum + 1 + page) % 10000 == 0 || (rowNum + 1 + page) == total) { - log.info("Antall rader behandlet {}/{}.", rowNum + 1 + page, total); - } - String xml = rs.getString("INNTEKTSMOTTAKER_XML"); - if (isV2_1(xml)) { - var opplysningspliktig = no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.v2_1.Opplysningspliktig.from(xml); - return opplysningspliktig.toArbeidsforhold(); - } else { - var opplysningspliktig = no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.v2_0.Opplysningspliktig.from(xml); - return opplysningspliktig.toArbeidsforhold(); - } - - } -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/repository/mapper/InntektsmottakerXmlAvvikRowMapper.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/repository/mapper/InntektsmottakerXmlAvvikRowMapper.java deleted file mode 100644 index 87a51f777b6..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/repository/mapper/InntektsmottakerXmlAvvikRowMapper.java +++ /dev/null @@ -1,38 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.repository.mapper; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.jdbc.core.RowMapper; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; - -import no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.Avvik; - -@Slf4j -@RequiredArgsConstructor -public class InntektsmottakerXmlAvvikRowMapper implements RowMapper> { - private final Integer page; - private final Integer total; - - private boolean isV2_1(String xml) { - return xml.contains("urn:nav:a-arbeidsforhold:v2_1"); - } - - @Override - public List mapRow(ResultSet rs, int rowNum) throws SQLException { - if ((rowNum + 1 + page) % 10000 == 0 || (rowNum + 1 + page) == total) { - log.info("Antall rader behandlet {}/{}.", rowNum + 1 + page, total); - } - - String xml = rs.getString("INNTEKTSMOTTAKER_XML"); - if (isV2_1(xml)) { - var opplysningspliktig = no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.v2_1.Opplysningspliktig.from(xml); - return opplysningspliktig.toAvvik(); - } else { - var opplysningspliktig = no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.v2_0.Opplysningspliktig.from(xml); - return opplysningspliktig.toAvvik(); - } - } -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/repository/mapper/InntektsmottakerXmlInntekterRowMapper.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/repository/mapper/InntektsmottakerXmlInntekterRowMapper.java deleted file mode 100644 index 2581f60107f..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/repository/mapper/InntektsmottakerXmlInntekterRowMapper.java +++ /dev/null @@ -1,38 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.repository.mapper; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.jdbc.core.RowMapper; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; - -import no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.Inntekt; - -@Slf4j -@RequiredArgsConstructor -public class InntektsmottakerXmlInntekterRowMapper implements RowMapper> { - private final Integer page; - private final Integer total; - - private boolean isV2_1(String xml) { - return xml.contains("urn:nav:a-arbeidsforhold:v2_1"); - } - - @Override - public List mapRow(ResultSet rs, int rowNum) throws SQLException { - if ((rowNum + 1 + page) % 10000 == 0 || (rowNum + 1 + page) == total) { - log.info("Antall rader behandlet {}/{}.", rowNum + 1 + page, total); - } - - String xml = rs.getString("INNTEKTSMOTTAKER_XML"); - if (isV2_1(xml)) { - var opplysningspliktig = no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.v2_1.Opplysningspliktig.from(xml); - return opplysningspliktig.toInntekt(); - } else { - var opplysningspliktig = no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.v2_0.Opplysningspliktig.from(xml); - return opplysningspliktig.toInntekt(); - } - } -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/repository/mapper/InntektsmottakerXmlPermisjonerRowMapper.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/repository/mapper/InntektsmottakerXmlPermisjonerRowMapper.java deleted file mode 100644 index 896b2226938..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/repository/mapper/InntektsmottakerXmlPermisjonerRowMapper.java +++ /dev/null @@ -1,38 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.repository.mapper; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.jdbc.core.RowMapper; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; - -import no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.Permisjon; - -@Slf4j -@RequiredArgsConstructor -public class InntektsmottakerXmlPermisjonerRowMapper implements RowMapper> { - private final Integer page; - private final Integer total; - - private boolean isV2_1(String xml) { - return xml.contains("urn:nav:a-arbeidsforhold:v2_1"); - } - - @Override - public List mapRow(ResultSet rs, int rowNum) throws SQLException { - if ((rowNum + 1 + page) % 10000 == 0 || (rowNum + 1 + page) == total) { - log.info("Antall rader behandlet {}/{}.", rowNum + 1 + page, total); - } - - String xml = rs.getString("INNTEKTSMOTTAKER_XML"); - if (isV2_1(xml)) { - var opplysningspliktig = no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.v2_1.Opplysningspliktig.from(xml); - return opplysningspliktig.toPermisjoner(); - } else { - var opplysningspliktig = no.nav.no.registere.testnorge.arbeidsforholdexportapi.domain.v2_0.Opplysningspliktig.from(xml); - return opplysningspliktig.toPermisjoner(); - } - } -} diff --git a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/service/ArbeidsforholdExportService.java b/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/service/ArbeidsforholdExportService.java deleted file mode 100644 index 77a90f8c9fb..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/service/ArbeidsforholdExportService.java +++ /dev/null @@ -1,125 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi.service; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.io.IOException; -import java.io.PrintWriter; -import java.nio.file.Files; -import java.nio.file.Path; - -import no.nav.no.registere.testnorge.arbeidsforholdexportapi.converter.csv.ArbeidsforholdSyntetiseringCsvPrinterConverter; -import no.nav.no.registere.testnorge.arbeidsforholdexportapi.converter.csv.AvvikSyntetiseringCsvPrinterConverter; -import no.nav.no.registere.testnorge.arbeidsforholdexportapi.converter.csv.InntektSyntetiseringCsvPrinterConverter; -import no.nav.no.registere.testnorge.arbeidsforholdexportapi.converter.csv.PermisjonSyntetiseringCsvPrinterConverter; -import no.nav.no.registere.testnorge.arbeidsforholdexportapi.repository.InntektsmottakerHendelseRepository; - -@Slf4j -@Service -@RequiredArgsConstructor -public class ArbeidsforholdExportService { - public static final int PAGE_SIZE = 500_000; - private final InntektsmottakerHendelseRepository inntektsmottakerHendelseRepository; - - public Path writeArbeidsforhold() throws IOException { - var count = inntektsmottakerHendelseRepository.count(); - int numberOfPages = (int) Math.ceil(count / (float) PAGE_SIZE); - - if (numberOfPages > 1) { - log.warn("Deler opp operasjonen i {} deler for å unngå minne problemer.", numberOfPages); - } - var path = Files.createTempFile("arb-" + System.currentTimeMillis() + "-", ".csv"); - - var file = path.toFile(); - log.info("Fil opprettet: {}.", path); - file.deleteOnExit(); - var printWriter = new PrintWriter(file); - - var printer = new ArbeidsforholdSyntetiseringCsvPrinterConverter(printWriter); - for (int page = 0; page < numberOfPages; page++) { - log.info("Henter for side {}/{} med opp til {} per side.", page + 1, numberOfPages, PAGE_SIZE); - printer.write(inntektsmottakerHendelseRepository.getArbeidsforhold(page, PAGE_SIZE)); - printWriter.flush(); - } - log.info("Lukker printeren til fil {}.", path.toAbsolutePath()); - printer.close(); - return path; - } - - - public Path writePermisjoner() throws IOException { - var count = inntektsmottakerHendelseRepository.count(); - int numberOfPages = (int) Math.ceil(count / (float) PAGE_SIZE); - - if (numberOfPages > 1) { - log.warn("Deler opp operasjonen i {} deler for å unngå minne problemer.", numberOfPages); - } - var path = Files.createTempFile("prm-" + System.currentTimeMillis() + "-", ".csv"); - - var file = path.toFile(); - log.info("Fil opprettet: {}.", path); - file.deleteOnExit(); - var printWriter = new PrintWriter(file); - - var printer = new PermisjonSyntetiseringCsvPrinterConverter(printWriter); - for (int page = 0; page < numberOfPages; page++) { - log.info("Henter for side {}/{} med opp til {} per side.", page + 1, numberOfPages, PAGE_SIZE); - printer.write(inntektsmottakerHendelseRepository.getPermisjoner(page, PAGE_SIZE)); - printWriter.flush(); - } - log.info("Lukker printeren til fil {}.", path); - printer.close(); - return path; - } - - public Path writeInntekter() throws IOException { - var count = inntektsmottakerHendelseRepository.count(); - int numberOfPages = (int) Math.ceil(count / (float) PAGE_SIZE); - - if (numberOfPages > 1) { - log.warn("Deler opp operasjonen i {} deler for å unngå minne problemer.", numberOfPages); - } - var path = Files.createTempFile("ink-" + System.currentTimeMillis() + "-", ".csv"); - - var file = path.toFile(); - log.info("Fil opprettet: {}.", path); - file.deleteOnExit(); - var printWriter = new PrintWriter(file); - - var printer = new InntektSyntetiseringCsvPrinterConverter(printWriter); - for (int page = 0; page < numberOfPages; page++) { - log.info("Henter for side {}/{} med opp til {} per side.", page + 1, numberOfPages, PAGE_SIZE); - printer.write(inntektsmottakerHendelseRepository.getInntekter(page, PAGE_SIZE)); - printWriter.flush(); - } - log.info("Lukker printeren til fil {}.", path); - printer.close(); - return path; - } - - public Path writeAvvik() throws IOException { - var count = inntektsmottakerHendelseRepository.count(); - int numberOfPages = (int) Math.ceil(count / (float) PAGE_SIZE); - - if (numberOfPages > 1) { - log.warn("Deler opp operasjonen i {} deler for å unngå minne problemer.", numberOfPages); - } - var path = Files.createTempFile("avk-" + System.currentTimeMillis() + "-", ".csv"); - - var file = path.toFile(); - log.info("Fil opprettet: {}.", path); - file.deleteOnExit(); - var printWriter = new PrintWriter(file); - - var printer = new AvvikSyntetiseringCsvPrinterConverter(printWriter); - for (int page = 0; page < numberOfPages; page++) { - log.info("Henter for side {}/{} med opp til {} per side.", page + 1, numberOfPages, PAGE_SIZE); - printer.write(inntektsmottakerHendelseRepository.getAvvik(page, PAGE_SIZE)); - printWriter.flush(); - } - log.info("Lukker printeren til fil {}.", path); - printer.close(); - return path; - } -} diff --git a/apps/arbeidsforhold-export-api/src/main/resources/application-dev.yml b/apps/arbeidsforhold-export-api/src/main/resources/application-dev.yml deleted file mode 100644 index a1cf247e4df..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/resources/application-dev.yml +++ /dev/null @@ -1,2 +0,0 @@ -azure.app.client.id: ${client_id} -azure.app.client.secret: ${client_secret} \ No newline at end of file diff --git a/apps/arbeidsforhold-export-api/src/main/resources/application.yml b/apps/arbeidsforhold-export-api/src/main/resources/application.yml deleted file mode 100644 index dd90ba4f402..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/resources/application.yml +++ /dev/null @@ -1,49 +0,0 @@ -AAD_ISSUER_URI: https://login.microsoftonline.com/62366534-1ec3-4962-8869-9b5535279d0b - -database: - aareg: - username: ${AAREG_DB_USERNAME} - password: ${AAREG_DB_PASSWORD} - url: ${AAREG_DB_URL} - -spring: - security: - oauth2: - resourceserver: - aad: - issuer-uri: ${AAD_ISSUER_URI}/v2.0 - jwk-set-uri: ${AAD_ISSUER_URI}/discovery/v2.0/keys - accepted-audience: ${azure.app.client.id}, api://${azure.app.client.id} - tokenx: - issuer-uri: https://tokenx.dev-gcp.nav.cloud.nais.io - jwk-set-uri: https://tokenx.dev-gcp.nav.cloud.nais.io/jwks - accepted-audience: dev-fss:dolly:testnorge-arbeidsforhold-export-api - application: - version: application.version.todo #TODO Finn ut hvordan denne kan settes fra gradle - name: testnorge-arbeidsforhold-export-api - description: Api for å eksportere arbeidsforhold. - -springdoc: - swagger-ui: - disable-swagger-default-url: true - url: /v3/api-docs - -management: - endpoints: - enabled-by-default: true - web: - base-path: /internal - exposure.include: prometheus,heapdump,health - path-mapping: - prometheus: metrics - endpoint: - prometheus.enabled: true - heapdump.enabled: true - prometheus: - metrics: - export: - enabled: true -server: - servlet: - encoding: - charset: UTF-8 \ No newline at end of file diff --git a/apps/arbeidsforhold-export-api/src/main/resources/bootstrap.yml b/apps/arbeidsforhold-export-api/src/main/resources/bootstrap.yml deleted file mode 100644 index 0451449ca23..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,4 +0,0 @@ -spring: - cloud: - vault: - enabled: false \ No newline at end of file diff --git a/apps/arbeidsforhold-export-api/src/main/resources/logback-spring.xml b/apps/arbeidsforhold-export-api/src/main/resources/logback-spring.xml deleted file mode 100644 index 3d872283bfc..00000000000 --- a/apps/arbeidsforhold-export-api/src/main/resources/logback-spring.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - true - 256 - 10280 - 20 - ^sun\.reflect\..*\.invoke - ^net\.sf\.cglib\.proxy\.MethodProxy\.invoke - java\.util\.concurrent\..* - org\.apache\.catalina\..* - org\.apache\.coyote\..* - org\.apache\.tomcat\..* - - - - - - - - - - - - - %d{HH:mm:ss.SSS} | %5p | %logger{25} | %m%n - - utf8 - - - - - - - - \ No newline at end of file diff --git a/apps/arbeidsforhold-export-api/src/test/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/ApplicationContextTest.java b/apps/arbeidsforhold-export-api/src/test/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/ApplicationContextTest.java deleted file mode 100644 index 7e4a1ba217e..00000000000 --- a/apps/arbeidsforhold-export-api/src/test/java/no/nav/no/registere/testnorge/arbeidsforholdexportapi/ApplicationContextTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package no.nav.no.registere.testnorge.arbeidsforholdexportapi; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.security.oauth2.jwt.JwtDecoder; -import org.springframework.test.context.ActiveProfiles; - -@SpringBootTest -@ActiveProfiles("test") -class ApplicationContextTest { - - @MockBean - public JwtDecoder jwtDecoder; - - @Test - @SuppressWarnings("java:S2699") - void load_app_context() { - } -} diff --git a/apps/arbeidsforhold-export-api/src/test/resources/application-test.properties b/apps/arbeidsforhold-export-api/src/test/resources/application-test.properties deleted file mode 100644 index bfbfa2a1453..00000000000 --- a/apps/arbeidsforhold-export-api/src/test/resources/application-test.properties +++ /dev/null @@ -1,4 +0,0 @@ -spring.cloud.vault.token=dummy -AAREG_DB_USERNAME=dummy -AAREG_DB_PASSWORD=dummy -AAREG_DB_URL=dummy \ No newline at end of file diff --git a/apps/hodejegeren/config.yml b/apps/hodejegeren/config.yml index 57c290a711a..f987eab4b81 100644 --- a/apps/hodejegeren/config.yml +++ b/apps/hodejegeren/config.yml @@ -33,10 +33,6 @@ spec: rules: - application: team-dolly-lokal-app cluster: dev-gcp - - application: testnorge-tp - cluster: dev-fss - - application: testnorge-statisk-data-forvalter - cluster: dev-fss - application: testnav-hodejegeren-proxy cluster: dev-fss - application: mn-synt-arbeidsforhold-service diff --git a/apps/import-person-service/Dockerfile b/apps/import-person-service/Dockerfile deleted file mode 100644 index 4a36f93546f..00000000000 --- a/apps/import-person-service/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM ghcr.io/navikt/baseimages/temurin:21 -LABEL maintainer="Team Dolly" - -ENV JAVA_OPTS="-Dspring.profiles.active=prod" - -ADD /build/libs/app.jar /app/app.jar - -EXPOSE 8080 diff --git a/apps/import-person-service/README.md b/apps/import-person-service/README.md deleted file mode 100644 index ad28f176741..00000000000 --- a/apps/import-person-service/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Testnav-generer-organisasjon-populasjon-service - -Service for å opprette liste med identer i pdl forvalter. - -## Swagger - -Swagger finnes under [/swagger](https://testnav-import-person-service.intern.dev.nav.no/swagger) -endepunktet til -applikasjonen. - -## Lokal kjøring - -Ha naisdevice kjørende og kjør ImportPersonServiceServiceApplicationStarter med følgende argumenter: - -``` --Dspring.cloud.vault.token=[Copy token fra Vault] --Dspring.profiles.active=dev -``` diff --git a/apps/import-person-service/build.gradle b/apps/import-person-service/build.gradle deleted file mode 100644 index 551675dd947..00000000000 --- a/apps/import-person-service/build.gradle +++ /dev/null @@ -1,89 +0,0 @@ -plugins { - id 'java' - id "org.sonarqube" version "4.0.0.2929" - id 'org.springframework.boot' version "3.1.4" - id 'io.spring.dependency-management' version "1.1.3" - id "jacoco" -} - -test { - useJUnitPlatform() -} - -jacocoTestReport { - reports { - xml.required = true - } -} - -sonarqube { - properties { - property "sonar.coverage.jacoco.xmlReportPaths", "${project.buildDir}/reports/jacoco/test/jacocoTestReport.xml" - property "sonar.dynamicAnalysis", "reuseReports" - property "sonar.host.url", "https://sonarcloud.io" - property "sonar.java.coveragePlugin", "jacoco" - property "sonar.language", "java" - property "sonar.login", System.getenv("SONAR_TOKEN") - property "sonar.organization", "navikt" - property "sonar.project.monorepo.enabled", true - property "sonar.projectKey", "testnav-import-person-service" - property "sonar.projectName", "testnav-import-person-service" - property "sonar.sourceEncoding", "UTF-8" - } -} - -bootJar { - archiveFileName = "app.jar" -} -dependencyManagement { - applyMavenExclusions = false - imports { - mavenBom 'org.springframework.cloud:spring-cloud-dependencies:2022.0.4' - } -} - -repositories { - mavenCentral() - mavenLocal() -} - -configurations { - configureEach { - exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' - exclude group: 'ch.qos.logback', module: 'logback-classic' - } -} - -dependencies { - implementation 'no.nav.testnav.libs:security-core' - implementation 'no.nav.testnav.libs:reactive-core' - implementation 'no.nav.testnav.libs:reactive-security' - implementation 'no.nav.testnav.libs:data-transfer-search-objects' - - implementation 'org.springframework.boot:spring-boot-starter-webflux' - implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' - - 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.boot:spring-boot-starter-actuator' - - implementation 'io.micrometer:micrometer-registry-prometheus' - - implementation 'org.hibernate.validator:hibernate-validator' - implementation 'org.springdoc:springdoc-openapi-starter-webflux-ui:2.0.4' - implementation 'io.swagger.core.v3:swagger-annotations-jakarta:2.2.16' - implementation 'net.logstash.logback:logstash-logback-encoder:7.4' - - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'org.springframework.cloud:spring-cloud-contract-wiremock' - - implementation 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' - testAnnotationProcessor 'org.projectlombok:lombok' -} -java { - toolchain { - languageVersion = JavaLanguageVersion.of(21) - } -} diff --git a/apps/import-person-service/config.yml b/apps/import-person-service/config.yml deleted file mode 100644 index 604dc608641..00000000000 --- a/apps/import-person-service/config.yml +++ /dev/null @@ -1,54 +0,0 @@ -apiVersion: "nais.io/v1alpha1" -kind: "Application" -metadata: - name: testnav-import-person-service - namespace: dolly - labels: - team: dolly -spec: - image: {{image}} - port: 8080 - webproxy: true - tokenx: - enabled: true - azure: - application: - allowAllUsers: true - enabled: true - tenant: nav.no - accessPolicy: - inbound: - rules: - - application: team-dolly-lokal-app - cluster: dev-gcp - - application: testnav-oversikt-frontend - cluster: dev-gcp - - application: testnav-pdl-forvalter - cluster: dev-gcp - outbound: - rules: - - application: testnav-pdl-forvalter - liveness: - path: /internal/isAlive - initialDelay: 4 - periodSeconds: 5 - failureThreshold: 500 - readiness: - path: /internal/isReady - initialDelay: 4 - periodSeconds: 5 - failureThreshold: 500 - prometheus: - enabled: true - path: /internal/metrics - replicas: - min: 1 - max: 1 - resources: - requests: - cpu: 200m - memory: 1024Mi - limits: - memory: 2048Mi - ingresses: - - "https://testnav-import-person-service.intern.dev.nav.no" \ No newline at end of file diff --git a/apps/import-person-service/gradle/wrapper/gradle-wrapper.jar b/apps/import-person-service/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL diff --git a/apps/import-person-service/gradle/wrapper/gradle-wrapper.properties b/apps/import-person-service/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index e411586a54a..00000000000 --- a/apps/import-person-service/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/apps/import-person-service/gradlew b/apps/import-person-service/gradlew deleted file mode 100755 index 3da45c161b0..00000000000 --- a/apps/import-person-service/gradlew +++ /dev/null @@ -1,234 +0,0 @@ -#!/bin/sh - -# -# Copyright ? 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions ?$var?, ?${var}?, ?${var:-default}?, ?${var+SET}?, -# ?${var#prefix}?, ?${var%suffix}?, and ?$( cmd )?; -# * compound commands having a testable exit status, especially ?case?; -# * various built-in commands including ?command?, ?set?, and ?ulimit?. -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/apps/import-person-service/gradlew.bat b/apps/import-person-service/gradlew.bat deleted file mode 100644 index ac1b06f9382..00000000000 --- a/apps/import-person-service/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/apps/import-person-service/gradlewUpdate.sh b/apps/import-person-service/gradlewUpdate.sh deleted file mode 100755 index e5ee6361152..00000000000 --- a/apps/import-person-service/gradlewUpdate.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -gradle wrapper \ No newline at end of file diff --git a/apps/import-person-service/settings.gradle b/apps/import-person-service/settings.gradle deleted file mode 100644 index 8b741eaa1c5..00000000000 --- a/apps/import-person-service/settings.gradle +++ /dev/null @@ -1,17 +0,0 @@ -plugins { - id "com.gradle.enterprise" version "3.12.3" -} - -rootProject.name = 'import-person-service' - -includeBuild '../../libs/security-core' -includeBuild '../../libs/reactive-core' -includeBuild '../../libs/reactive-security' -includeBuild '../../libs/data-transfer-search-objects' - -gradleEnterprise { - buildScan { - termsOfServiceUrl = "https://gradle.com/terms-of-service" - termsOfServiceAgree = "yes" - } -} \ No newline at end of file diff --git a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/ImportPersonServiceServiceApplicationStarter.java b/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/ImportPersonServiceServiceApplicationStarter.java deleted file mode 100644 index 754e44c2697..00000000000 --- a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/ImportPersonServiceServiceApplicationStarter.java +++ /dev/null @@ -1,20 +0,0 @@ -package no.nav.testnav.apps.importpersonservice; - -import no.nav.testnav.libs.reactivecore.config.CoreConfig; -import no.nav.testnav.libs.reactivesecurity.config.SecureOAuth2ServerToServerConfiguration; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Import; -import org.springframework.web.reactive.config.EnableWebFlux; - -@Import({ - CoreConfig.class, - SecureOAuth2ServerToServerConfiguration.class -}) -@EnableWebFlux -@SpringBootApplication -public class ImportPersonServiceServiceApplicationStarter { - public static void main(String[] args) { - SpringApplication.run(ImportPersonServiceServiceApplicationStarter.class, args); - } -} \ No newline at end of file diff --git a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/config/Consumers.java b/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/config/Consumers.java deleted file mode 100644 index 5b3b1edac09..00000000000 --- a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/config/Consumers.java +++ /dev/null @@ -1,29 +0,0 @@ -package no.nav.testnav.apps.importpersonservice.config; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import no.nav.testnav.libs.securitycore.domain.ServerProperties; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -import static lombok.AccessLevel.PACKAGE; - -/** - * Samler alle placeholders for ulike {@code consumers.*}-konfigurasjon her, dvs. subklasser av {@code ServerProperties}. - *

- * Husk at Spring Boot bruker
relaxed binding - * mellom configuration properties og field names. - * - * @see ServerProperties - */ -@Configuration -@ConfigurationProperties(prefix = "consumers") -@NoArgsConstructor(access = PACKAGE) -@Getter -@Setter(PACKAGE) -public class Consumers { - - private ServerProperties testnavPdlForvalter; - -} diff --git a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/config/DevConfig.java b/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/config/DevConfig.java deleted file mode 100644 index 14efd3b1eeb..00000000000 --- a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/config/DevConfig.java +++ /dev/null @@ -1,36 +0,0 @@ -package no.nav.testnav.apps.importpersonservice.config; - -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.vault.annotation.VaultPropertySource; -import org.springframework.vault.authentication.ClientAuthentication; -import org.springframework.vault.authentication.TokenAuthentication; -import org.springframework.vault.client.VaultEndpoint; -import org.springframework.vault.config.AbstractVaultConfiguration; - -import static io.micrometer.common.util.StringUtils.isBlank; - -@Configuration -@Profile("dev") -@VaultPropertySource(value = "secret/dolly/lokal", ignoreSecretNotFound = false) -public class DevConfig extends AbstractVaultConfiguration { - - private static final String VAULT_TOKEN = "spring.cloud.vault.token"; - - @Override - public VaultEndpoint vaultEndpoint() { - return VaultEndpoint.create("vault.adeo.no", 443); - } - - @Override - public ClientAuthentication clientAuthentication() { - if (System.getenv().containsKey("VAULT_TOKEN")) { - System.setProperty(VAULT_TOKEN, System.getenv("VAULT_TOKEN")); - } - var token = System.getProperty(VAULT_TOKEN); - if (isBlank(token)) { - throw new IllegalArgumentException("Påkrevet property 'spring.cloud.vault.token' er ikke satt."); - } - return new TokenAuthentication(System.getProperty(VAULT_TOKEN)); - } -} diff --git a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/config/OpenApiConfig.java b/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/config/OpenApiConfig.java deleted file mode 100644 index 2fdbb99a03d..00000000000 --- a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/config/OpenApiConfig.java +++ /dev/null @@ -1,49 +0,0 @@ -package no.nav.testnav.apps.importpersonservice.config; - -import io.swagger.v3.oas.models.Components; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.info.Contact; -import io.swagger.v3.oas.models.info.Info; -import io.swagger.v3.oas.models.info.License; -import io.swagger.v3.oas.models.security.SecurityRequirement; -import io.swagger.v3.oas.models.security.SecurityScheme; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.Arrays; - -import no.nav.testnav.libs.reactivecore.config.ApplicationProperties; - - -@Configuration -public class OpenApiConfig { - - @Bean - public OpenAPI openApi(ApplicationProperties applicationProperties) { - return new OpenAPI() - .components(new Components().addSecuritySchemes("bearer-jwt", new SecurityScheme() - .type(SecurityScheme.Type.HTTP) - .scheme("bearer") - .bearerFormat("JWT") - .in(SecurityScheme.In.HEADER) - .name("Authorization") - )) - .addSecurityItem( - new SecurityRequirement().addList("bearer-jwt", Arrays.asList("read", "write"))) - .info(new Info() - .title(applicationProperties.getName()) - .version(applicationProperties.getVersion()) - .description(applicationProperties.getDescription()) - .termsOfService("https://nav.no") - .contact(new Contact() - .url("https://nav-it.slack.com/archives/CA3P9NGA2") - .email("dolly@nav.no") - .name("Team Dolly") - ) - .license(new License() - .name("MIT License") - .url("https://opensource.org/licenses/MIT") - ) - ); - } -} \ No newline at end of file diff --git a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/config/SecurityConfig.java b/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/config/SecurityConfig.java deleted file mode 100644 index c2ce826076a..00000000000 --- a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/config/SecurityConfig.java +++ /dev/null @@ -1,42 +0,0 @@ -package no.nav.testnav.apps.importpersonservice.config; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.method.configuration.EnableReactiveMethodSecurity; -import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; -import org.springframework.security.config.web.server.ServerHttpSecurity; -import org.springframework.security.web.server.SecurityWebFilterChain; - -import no.nav.testnav.libs.reactivesecurity.manager.JwtReactiveAuthenticationManager; - - -@Slf4j -@Configuration -@EnableWebFluxSecurity -@EnableReactiveMethodSecurity -@RequiredArgsConstructor -public class SecurityConfig { - - private final JwtReactiveAuthenticationManager jwtReactiveAuthenticationManager; - - @Bean - public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity httpSecurity) { - return httpSecurity - .csrf(ServerHttpSecurity.CsrfSpec::disable) - .authorizeExchange(authorizeConfig -> authorizeConfig.pathMatchers( - "/internal/**", - "/webjars/**", - "/swagger-resources/**", - "/v3/api-docs/**", - "/swagger-ui/**", - "/swagger", - "/error", - "/swagger-ui.html" - ).permitAll().anyExchange().authenticated()) - .oauth2ResourceServer(oauth2RSConfig -> oauth2RSConfig.jwt(jwtSpec -> jwtSpec.authenticationManager(jwtReactiveAuthenticationManager))) - .build(); - } -} - diff --git a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/consumer/PdlForvalterConsumer.java b/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/consumer/PdlForvalterConsumer.java deleted file mode 100644 index f5a99c7c700..00000000000 --- a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/consumer/PdlForvalterConsumer.java +++ /dev/null @@ -1,48 +0,0 @@ -package no.nav.testnav.apps.importpersonservice.consumer; - -import no.nav.testnav.apps.importpersonservice.config.Consumers; -import no.nav.testnav.apps.importpersonservice.consumer.command.OppdaterPersonCommand; -import no.nav.testnav.apps.importpersonservice.consumer.command.SendPersonTilPdlCommand; -import no.nav.testnav.apps.importpersonservice.consumer.request.OppdaterPersonRequest; -import no.nav.testnav.apps.importpersonservice.domain.PersonList; -import no.nav.testnav.libs.data.pdlforvalter.v1.OrdreResponseDTO; -import no.nav.testnav.libs.reactivesecurity.exchange.TokenExchange; -import no.nav.testnav.libs.securitycore.domain.ServerProperties; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Flux; - -import java.util.stream.Collectors; - -@Component -public class PdlForvalterConsumer { - private final WebClient webClient; - private final ServerProperties serverProperties; - private final TokenExchange tokenExchange; - - public PdlForvalterConsumer( - Consumers consumers, - TokenExchange tokenExchange) { - serverProperties = consumers.getTestnavPdlForvalter(); - this.tokenExchange = tokenExchange; - this.webClient = WebClient - .builder() - .baseUrl(serverProperties.getUrl()) - .build(); - } - - public Flux opprett(PersonList list) { - Flux ordreResponseDTOFlux = tokenExchange - .exchange(serverProperties) - .flatMapMany(accessToken -> Flux.concat(list - .getList() - .stream() - .map(OppdaterPersonRequest::new) - .map(request -> new OppdaterPersonCommand(webClient, request, accessToken.getTokenValue()).call()) - .collect(Collectors.toList())) - .flatMap(value -> new SendPersonTilPdlCommand(webClient, value, accessToken.getTokenValue()).call().flux()) - ); - return ordreResponseDTOFlux - .map(ordre -> ordre.getHovedperson().getIdent()); - } -} diff --git a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/consumer/command/OppdaterPersonCommand.java b/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/consumer/command/OppdaterPersonCommand.java deleted file mode 100644 index 3cf723c504b..00000000000 --- a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/consumer/command/OppdaterPersonCommand.java +++ /dev/null @@ -1,36 +0,0 @@ -package no.nav.testnav.apps.importpersonservice.consumer.command; - -import lombok.RequiredArgsConstructor; -import no.nav.testnav.apps.importpersonservice.consumer.request.OppdaterPersonRequest; -import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; -import org.springframework.http.HttpHeaders; -import org.springframework.web.reactive.function.BodyInserters; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; -import reactor.util.retry.Retry; - -import java.time.Duration; -import java.util.concurrent.Callable; - -@RequiredArgsConstructor -public class OppdaterPersonCommand implements Callable> { - private final WebClient webClient; - private final OppdaterPersonRequest dto; - private final String token; - - @Override - public Mono call() { - return webClient - .put() - .uri(builder -> builder - .path("/api/v1/personer/{ident}") - .build(dto.getPerson().getIdent()) - ) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) - .body(BodyInserters.fromPublisher(Mono.just(dto), OppdaterPersonRequest.class)) - .retrieve() - .bodyToMono(String.class) - .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) - .filter(WebClientFilter::is5xxException)); - } -} diff --git a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/consumer/command/SendPersonTilPdlCommand.java b/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/consumer/command/SendPersonTilPdlCommand.java deleted file mode 100644 index fe18c72cd70..00000000000 --- a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/consumer/command/SendPersonTilPdlCommand.java +++ /dev/null @@ -1,37 +0,0 @@ -package no.nav.testnav.apps.importpersonservice.consumer.command; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.libs.data.pdlforvalter.v1.OrdreResponseDTO; -import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; -import org.springframework.http.HttpHeaders; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; -import reactor.util.retry.Retry; - -import java.time.Duration; -import java.util.concurrent.Callable; - -@Slf4j -@RequiredArgsConstructor -public class SendPersonTilPdlCommand implements Callable> { - private final WebClient webClient; - private final String ident; - private final String token; - - @Override - public Mono call() { - log.info("Sender person {} til PDL.", ident); - return webClient - .post() - .uri(builder -> builder - .path("/api/v1/personer/{ident}/ordre") - .build(ident) - ) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) - .retrieve() - .bodyToMono(OrdreResponseDTO.class) - .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) - .filter(WebClientFilter::is5xxException)); - } -} diff --git a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/consumer/dto/NavnDTO.java b/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/consumer/dto/NavnDTO.java deleted file mode 100644 index 8f31e215e4a..00000000000 --- a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/consumer/dto/NavnDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -package no.nav.testnav.apps.importpersonservice.consumer.dto; - - -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; -import lombok.Value; - -import no.nav.testnav.libs.data.pdlforvalter.v1.DbVersjonDTO; - -@Value -@AllArgsConstructor -@NoArgsConstructor(force = true) -public class NavnDTO { - DbVersjonDTO.Master master; -} diff --git a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/consumer/dto/PersonDTO.java b/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/consumer/dto/PersonDTO.java deleted file mode 100644 index b02f59b69e9..00000000000 --- a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/consumer/dto/PersonDTO.java +++ /dev/null @@ -1,23 +0,0 @@ -package no.nav.testnav.apps.importpersonservice.consumer.dto; - -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; -import lombok.Value; -import no.nav.testnav.apps.importpersonservice.domain.Person; -import no.nav.testnav.libs.data.pdlforvalter.v1.DbVersjonDTO; - -import java.util.Collections; -import java.util.List; - -@Value -@AllArgsConstructor -@NoArgsConstructor(force = true) -public class PersonDTO { - String ident; - List navn; - - public PersonDTO(Person person) { - this.ident = person.getIdent(); - this.navn = Collections.singletonList(new NavnDTO(DbVersjonDTO.Master.FREG)); // TODO: Remove hack when pdl-forvalter is ready - } -} diff --git a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/consumer/request/OppdaterPersonRequest.java b/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/consumer/request/OppdaterPersonRequest.java deleted file mode 100644 index e5d828956e2..00000000000 --- a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/consumer/request/OppdaterPersonRequest.java +++ /dev/null @@ -1,19 +0,0 @@ -package no.nav.testnav.apps.importpersonservice.consumer.request; - -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; -import lombok.Value; - -import no.nav.testnav.apps.importpersonservice.consumer.dto.PersonDTO; -import no.nav.testnav.apps.importpersonservice.domain.Person; - -@Value -@AllArgsConstructor -@NoArgsConstructor(force = true) -public class OppdaterPersonRequest { - PersonDTO person; - - public OppdaterPersonRequest(Person person){ - this.person = new PersonDTO(person); - } -} diff --git a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/controller/ImportPersonController.java b/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/controller/ImportPersonController.java deleted file mode 100644 index 5d9440a08cd..00000000000 --- a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/controller/ImportPersonController.java +++ /dev/null @@ -1,33 +0,0 @@ -package no.nav.testnav.apps.importpersonservice.controller; - -import lombok.RequiredArgsConstructor; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import reactor.core.publisher.Flux; - -import java.util.List; - -import no.nav.testnav.apps.importpersonservice.consumer.PdlForvalterConsumer; -import no.nav.testnav.apps.importpersonservice.controller.dto.PersonListDTO; -import no.nav.testnav.apps.importpersonservice.domain.PersonList; - -@RestController -@RequestMapping("/api/v1/personer") -@RequiredArgsConstructor -public class ImportPersonController { - private final PdlForvalterConsumer pdlForvalterConsumer; - - @PostMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE) - public Flux opprett(@RequestBody PersonListDTO dto) { - return pdlForvalterConsumer.opprett(new PersonList(dto)); - } - - @PostMapping(value = "/identer", produces = MediaType.TEXT_EVENT_STREAM_VALUE) - public Flux opprettIdenter(@RequestBody List identer) { - return pdlForvalterConsumer.opprett(new PersonList(identer)); - } - -} diff --git a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/controller/dto/PersonDTO.java b/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/controller/dto/PersonDTO.java deleted file mode 100644 index bf77a2929f4..00000000000 --- a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/controller/dto/PersonDTO.java +++ /dev/null @@ -1,12 +0,0 @@ -package no.nav.testnav.apps.importpersonservice.controller.dto; - -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; -import lombok.Value; - -@Value -@AllArgsConstructor -@NoArgsConstructor(force = true) -public class PersonDTO { - String ident; -} diff --git a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/controller/dto/PersonListDTO.java b/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/controller/dto/PersonListDTO.java deleted file mode 100644 index 37810c779ee..00000000000 --- a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/controller/dto/PersonListDTO.java +++ /dev/null @@ -1,14 +0,0 @@ -package no.nav.testnav.apps.importpersonservice.controller.dto; - -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; -import lombok.Value; - -import java.util.List; - -@Value -@AllArgsConstructor -@NoArgsConstructor(force = true) -public class PersonListDTO { - List personList; -} diff --git a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/domain/Person.java b/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/domain/Person.java deleted file mode 100644 index e27abcbbad3..00000000000 --- a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/domain/Person.java +++ /dev/null @@ -1,19 +0,0 @@ -package no.nav.testnav.apps.importpersonservice.domain; - -import no.nav.testnav.apps.importpersonservice.controller.dto.PersonDTO; - -public class Person { - private final String ident; - - public Person(String ident){ - this.ident = ident; - } - - public Person(PersonDTO dto) { - this.ident = dto.getIdent(); - } - - public String getIdent() { - return ident; - } -} diff --git a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/domain/PersonList.java b/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/domain/PersonList.java deleted file mode 100644 index b105e6e1201..00000000000 --- a/apps/import-person-service/src/main/java/no/nav/testnav/apps/importpersonservice/domain/PersonList.java +++ /dev/null @@ -1,24 +0,0 @@ -package no.nav.testnav.apps.importpersonservice.domain; - -import no.nav.testnav.apps.importpersonservice.controller.dto.PersonListDTO; - -import java.util.List; - -public class PersonList { - - private final List list; - - public PersonList(PersonListDTO dto) { - this.list = dto.getPersonList().stream().map(Person::new) - .toList(); - } - - public PersonList(List identer) { - this.list = identer.stream().map(Person::new) - .toList(); - } - - public List getList() { - return list; - } -} diff --git a/apps/import-person-service/src/main/resources/application-dev.yml b/apps/import-person-service/src/main/resources/application-dev.yml deleted file mode 100644 index 44d6b6dc9e7..00000000000 --- a/apps/import-person-service/src/main/resources/application-dev.yml +++ /dev/null @@ -1,4 +0,0 @@ - -consumers.testnav-pdl-forvalter: - url: https://testnav-pdl-forvalter-dev.intern.dev.nav.no - name: testnav-pdl-forvalter-dev \ No newline at end of file diff --git a/apps/import-person-service/src/main/resources/application.yml b/apps/import-person-service/src/main/resources/application.yml deleted file mode 100644 index bb93cdbb296..00000000000 --- a/apps/import-person-service/src/main/resources/application.yml +++ /dev/null @@ -1,53 +0,0 @@ -AAD_ISSUER_URI: https://login.microsoftonline.com/62366534-1ec3-4962-8869-9b5535279d0b - -spring: - application: - version: application.version.todo #TODO Finn ut hvordan denne kan settes fra gradle - name: testnav-import-person-service - desciption: Tjeneste for å sende inn personer til PDL - security: - oauth2: - resourceserver: - aad: - issuer-uri: ${AAD_ISSUER_URI}/v2.0 - jwk-set-uri: ${AAD_ISSUER_URI}/discovery/v2.0/keys - accepted-audience: ${azure.app.client.id}, api://${azure.app.client.id} - tokenx: - issuer-uri: https://tokenx.dev-gcp.nav.cloud.nais.io - jwk-set-uri: https://tokenx.dev-gcp.nav.cloud.nais.io/jwks - accepted-audience: dev-gcp:dolly:testnav-import-person-service - -springdoc: - swagger-ui: - disable-swagger-default-url: true - url: /v3/api-docs - -consumers: - testnav-pdl-forvalter: - url: http://testnav-pdl-forvalter.dolly.svc.cluster.local - cluster: dev-gcp - namespace: dolly - name: testnav-pdl-forvalter - -management: - endpoints: - enabled-by-default: true - web: - base-path: /internal - exposure.include: prometheus,heapdump,health - path-mapping: - prometheus: metrics - endpoint: - prometheus.enabled: true - heapdump.enabled: true - health: - elasticsearch: - enabled: false - prometheus: - metrics: - export: - enabled: true -server: - servlet: - encoding: - charset: UTF-8 \ No newline at end of file diff --git a/apps/import-person-service/src/main/resources/bootstrap.yml b/apps/import-person-service/src/main/resources/bootstrap.yml deleted file mode 100644 index 0451449ca23..00000000000 --- a/apps/import-person-service/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,4 +0,0 @@ -spring: - cloud: - vault: - enabled: false \ No newline at end of file diff --git a/apps/import-person-service/src/main/resources/logback-spring.xml b/apps/import-person-service/src/main/resources/logback-spring.xml deleted file mode 100644 index 52c15597b3c..00000000000 --- a/apps/import-person-service/src/main/resources/logback-spring.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - true - 256 - 10280 - 20 - ^sun\.reflect\..*\.invoke - ^net\.sf\.cglib\.proxy\.MethodProxy\.invoke - java\.util\.concurrent\..* - org\.apache\.catalina\..* - org\.apache\.coyote\..* - org\.apache\.tomcat\..* - - - - - - - - - - - - - %d{HH:mm:ss.SSS} | %5p | %logger{25} | %m%n - - utf8 - - - - - - - - - \ No newline at end of file diff --git a/apps/import-person-service/src/test/java/no/nav/testnav/apps/importpersonservice/ApplicationContextTest.java b/apps/import-person-service/src/test/java/no/nav/testnav/apps/importpersonservice/ApplicationContextTest.java deleted file mode 100644 index 72bd24c2a7b..00000000000 --- a/apps/import-person-service/src/test/java/no/nav/testnav/apps/importpersonservice/ApplicationContextTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package no.nav.testnav.apps.importpersonservice; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.security.oauth2.jwt.ReactiveJwtDecoder; - -@SpringBootTest -public class ApplicationContextTest { - - @MockBean - public ReactiveJwtDecoder jwtDecoder; - - @Test - @SuppressWarnings("java:S2699") - void load_app_context() { - } -} diff --git a/apps/import-person-service/src/test/resources/application-test.properties b/apps/import-person-service/src/test/resources/application-test.properties deleted file mode 100644 index f44e7773252..00000000000 --- a/apps/import-person-service/src/test/resources/application-test.properties +++ /dev/null @@ -1,3 +0,0 @@ -spring.cloud.vault.token=dummy -azure.app.client.id=dummy -azure.app.client.secret=dummy \ No newline at end of file diff --git a/apps/jenkins-batch-status-service/src/main/java/no/nav/registre/testnorge/jenkinsbatchstatusservice/consumer/OrganisasjonBestillingConsumer.java b/apps/jenkins-batch-status-service/src/main/java/no/nav/registre/testnorge/jenkinsbatchstatusservice/consumer/OrganisasjonBestillingConsumer.java index 1fa23bc274e..9a5dd53e756 100644 --- a/apps/jenkins-batch-status-service/src/main/java/no/nav/registre/testnorge/jenkinsbatchstatusservice/consumer/OrganisasjonBestillingConsumer.java +++ b/apps/jenkins-batch-status-service/src/main/java/no/nav/registre/testnorge/jenkinsbatchstatusservice/consumer/OrganisasjonBestillingConsumer.java @@ -7,7 +7,7 @@ import no.nav.registre.testnorge.jenkinsbatchstatusservice.config.Consumers; import no.nav.registre.testnorge.jenkinsbatchstatusservice.consumer.command.SaveOrganisasjonBestillingCommand; import no.nav.registre.testnorge.jenkinsbatchstatusservice.consumer.command.UpdateOrganisasjonBestillingCommand; -import no.nav.testnav.libs.dto.organiasjonbestilling.v1.OrderDTO; +import no.nav.testnav.libs.dto.organisajonbestilling.v1.OrderDTO; import no.nav.testnav.libs.securitycore.domain.ServerProperties; import no.nav.testnav.libs.servletsecurity.exchange.TokenExchange; import org.springframework.http.client.reactive.ReactorClientHttpConnector; diff --git a/apps/jenkins-batch-status-service/src/main/java/no/nav/registre/testnorge/jenkinsbatchstatusservice/consumer/command/UpdateOrganisasjonBestillingCommand.java b/apps/jenkins-batch-status-service/src/main/java/no/nav/registre/testnorge/jenkinsbatchstatusservice/consumer/command/UpdateOrganisasjonBestillingCommand.java index ca9c3a09806..07321e794c4 100644 --- a/apps/jenkins-batch-status-service/src/main/java/no/nav/registre/testnorge/jenkinsbatchstatusservice/consumer/command/UpdateOrganisasjonBestillingCommand.java +++ b/apps/jenkins-batch-status-service/src/main/java/no/nav/registre/testnorge/jenkinsbatchstatusservice/consumer/command/UpdateOrganisasjonBestillingCommand.java @@ -2,7 +2,7 @@ import lombok.RequiredArgsConstructor; import no.nav.testnav.libs.commands.utils.WebClientFilter; -import no.nav.testnav.libs.dto.organiasjonbestilling.v1.OrderDTO; +import no.nav.testnav.libs.dto.organisajonbestilling.v1.OrderDTO; import org.springframework.http.HttpHeaders; import org.springframework.web.reactive.function.BodyInserters; import org.springframework.web.reactive.function.client.WebClient; diff --git a/apps/organisasjon-bestilling-service/src/main/java/no/nav/testnav/apps/organisasjonbestillingservice/controller/v1/OrderController.java b/apps/organisasjon-bestilling-service/src/main/java/no/nav/testnav/apps/organisasjonbestillingservice/controller/v1/OrderController.java index 71b936d9939..042981526b7 100644 --- a/apps/organisasjon-bestilling-service/src/main/java/no/nav/testnav/apps/organisasjonbestillingservice/controller/v1/OrderController.java +++ b/apps/organisasjon-bestilling-service/src/main/java/no/nav/testnav/apps/organisasjonbestillingservice/controller/v1/OrderController.java @@ -17,8 +17,8 @@ import java.util.List; import java.util.Set; -import no.nav.testnav.libs.dto.organiasjonbestilling.v1.ItemDTO; -import no.nav.testnav.libs.dto.organiasjonbestilling.v1.OrderDTO; +import no.nav.testnav.libs.dto.organisajonbestilling.v1.ItemDTO; +import no.nav.testnav.libs.dto.organisajonbestilling.v1.OrderDTO; import no.nav.testnav.apps.organisasjonbestillingservice.domain.v1.Order; import no.nav.testnav.apps.organisasjonbestillingservice.service.v1.OrderService; diff --git a/apps/organisasjon-bestilling-service/src/main/java/no/nav/testnav/apps/organisasjonbestillingservice/controller/v2/OrderControllerV2.java b/apps/organisasjon-bestilling-service/src/main/java/no/nav/testnav/apps/organisasjonbestillingservice/controller/v2/OrderControllerV2.java index e9371bb563c..b411b54684f 100644 --- a/apps/organisasjon-bestilling-service/src/main/java/no/nav/testnav/apps/organisasjonbestillingservice/controller/v2/OrderControllerV2.java +++ b/apps/organisasjon-bestilling-service/src/main/java/no/nav/testnav/apps/organisasjonbestillingservice/controller/v2/OrderControllerV2.java @@ -4,8 +4,8 @@ import lombok.extern.slf4j.Slf4j; import no.nav.testnav.apps.organisasjonbestillingservice.domain.v2.Order; import no.nav.testnav.apps.organisasjonbestillingservice.service.v2.OrderServiceV2; -import no.nav.testnav.libs.dto.organiasjonbestilling.v2.OrderDTO; -import no.nav.testnav.libs.dto.organiasjonbestilling.v2.StatusDTO; +import no.nav.testnav.libs.dto.organisajonbestilling.v2.OrderDTO; +import no.nav.testnav.libs.dto.organisajonbestilling.v2.StatusDTO; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; diff --git a/apps/organisasjon-bestilling-service/src/main/java/no/nav/testnav/apps/organisasjonbestillingservice/domain/v1/Order.java b/apps/organisasjon-bestilling-service/src/main/java/no/nav/testnav/apps/organisasjonbestillingservice/domain/v1/Order.java index 560dadeafa8..84d8dc62ecd 100644 --- a/apps/organisasjon-bestilling-service/src/main/java/no/nav/testnav/apps/organisasjonbestillingservice/domain/v1/Order.java +++ b/apps/organisasjon-bestilling-service/src/main/java/no/nav/testnav/apps/organisasjonbestillingservice/domain/v1/Order.java @@ -1,7 +1,7 @@ package no.nav.testnav.apps.organisasjonbestillingservice.domain.v1; import no.nav.testnav.apps.organisasjonbestillingservice.repository.v1.model.OrderModel; -import no.nav.testnav.libs.dto.organiasjonbestilling.v1.OrderDTO; +import no.nav.testnav.libs.dto.organisajonbestilling.v1.OrderDTO; public class Order { private final Long batchId; diff --git a/apps/organisasjon-bestilling-service/src/main/java/no/nav/testnav/apps/organisasjonbestillingservice/domain/v2/Order.java b/apps/organisasjon-bestilling-service/src/main/java/no/nav/testnav/apps/organisasjonbestillingservice/domain/v2/Order.java index 476bf231521..69e54e564b4 100644 --- a/apps/organisasjon-bestilling-service/src/main/java/no/nav/testnav/apps/organisasjonbestillingservice/domain/v2/Order.java +++ b/apps/organisasjon-bestilling-service/src/main/java/no/nav/testnav/apps/organisasjonbestillingservice/domain/v2/Order.java @@ -3,7 +3,7 @@ import lombok.Value; -import no.nav.testnav.libs.dto.organiasjonbestilling.v2.OrderDTO; +import no.nav.testnav.libs.dto.organisajonbestilling.v2.OrderDTO; import no.nav.testnav.apps.organisasjonbestillingservice.repository.v2.entity.OrderEntity; @Value diff --git a/apps/organisasjon-bestilling-service/src/main/java/no/nav/testnav/apps/organisasjonbestillingservice/service/v1/OrderService.java b/apps/organisasjon-bestilling-service/src/main/java/no/nav/testnav/apps/organisasjonbestillingservice/service/v1/OrderService.java index d41a5908c0d..9e3122b222e 100644 --- a/apps/organisasjon-bestilling-service/src/main/java/no/nav/testnav/apps/organisasjonbestillingservice/service/v1/OrderService.java +++ b/apps/organisasjon-bestilling-service/src/main/java/no/nav/testnav/apps/organisasjonbestillingservice/service/v1/OrderService.java @@ -12,8 +12,8 @@ import no.nav.testnav.apps.organisasjonbestillingservice.consumer.EregBatchStatusConsumer; import no.nav.testnav.apps.organisasjonbestillingservice.repository.v1.OrderRepository; import no.nav.testnav.apps.organisasjonbestillingservice.repository.v1.model.OrderModel; -import no.nav.testnav.libs.dto.organiasjonbestilling.v1.ItemDTO; -import no.nav.testnav.libs.dto.organiasjonbestilling.v1.Status; +import no.nav.testnav.libs.dto.organisajonbestilling.v1.ItemDTO; +import no.nav.testnav.libs.dto.organisajonbestilling.v1.Status; import no.nav.testnav.apps.organisasjonbestillingservice.domain.v1.Order; @Slf4j diff --git a/apps/organisasjon-bestilling-service/src/main/java/no/nav/testnav/apps/organisasjonbestillingservice/service/v2/OrderServiceV2.java b/apps/organisasjon-bestilling-service/src/main/java/no/nav/testnav/apps/organisasjonbestillingservice/service/v2/OrderServiceV2.java index aaf777687fd..d05f99f986f 100644 --- a/apps/organisasjon-bestilling-service/src/main/java/no/nav/testnav/apps/organisasjonbestillingservice/service/v2/OrderServiceV2.java +++ b/apps/organisasjon-bestilling-service/src/main/java/no/nav/testnav/apps/organisasjonbestillingservice/service/v2/OrderServiceV2.java @@ -9,7 +9,7 @@ import no.nav.testnav.apps.organisasjonbestillingservice.repository.v2.entity.OrderEntity; import no.nav.testnav.apps.organisasjonbestillingservice.retry.RetryConfig; import no.nav.testnav.apps.organisasjonbestillingservice.service.RetryService; -import no.nav.testnav.libs.dto.organiasjonbestilling.v2.Status; +import no.nav.testnav.libs.dto.organisajonbestilling.v2.Status; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClientResponseException; diff --git a/apps/organisasjon-faste-data-service/src/main/java/no/nav/registre/testnorge/organisasjonfastedataservice/consumer/OrganisasjonBestillingConsumer.java b/apps/organisasjon-faste-data-service/src/main/java/no/nav/registre/testnorge/organisasjonfastedataservice/consumer/OrganisasjonBestillingConsumer.java index 89d98e35e9c..440f5fd21f3 100644 --- a/apps/organisasjon-faste-data-service/src/main/java/no/nav/registre/testnorge/organisasjonfastedataservice/consumer/OrganisasjonBestillingConsumer.java +++ b/apps/organisasjon-faste-data-service/src/main/java/no/nav/registre/testnorge/organisasjonfastedataservice/consumer/OrganisasjonBestillingConsumer.java @@ -2,7 +2,7 @@ import no.nav.registre.testnorge.organisasjonfastedataservice.config.Consumers; import no.nav.registre.testnorge.organisasjonfastedataservice.consumer.command.GetOrdreCommand; -import no.nav.testnav.libs.dto.organiasjonbestilling.v1.ItemDTO; +import no.nav.testnav.libs.dto.organisajonbestilling.v1.ItemDTO; import no.nav.testnav.libs.securitycore.domain.ServerProperties; import no.nav.testnav.libs.servletsecurity.exchange.TokenExchange; import org.springframework.stereotype.Component; diff --git a/apps/organisasjon-faste-data-service/src/main/java/no/nav/registre/testnorge/organisasjonfastedataservice/consumer/command/GetOrdreCommand.java b/apps/organisasjon-faste-data-service/src/main/java/no/nav/registre/testnorge/organisasjonfastedataservice/consumer/command/GetOrdreCommand.java index 033a15bf0e8..9bbe078682b 100644 --- a/apps/organisasjon-faste-data-service/src/main/java/no/nav/registre/testnorge/organisasjonfastedataservice/consumer/command/GetOrdreCommand.java +++ b/apps/organisasjon-faste-data-service/src/main/java/no/nav/registre/testnorge/organisasjonfastedataservice/consumer/command/GetOrdreCommand.java @@ -3,7 +3,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.testnav.libs.commands.utils.WebClientFilter; -import no.nav.testnav.libs.dto.organiasjonbestilling.v1.ItemDTO; +import no.nav.testnav.libs.dto.organisajonbestilling.v1.ItemDTO; import org.springframework.http.HttpHeaders; import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClientResponseException; diff --git a/apps/organisasjon-faste-data-service/src/main/java/no/nav/registre/testnorge/organisasjonfastedataservice/controller/OrganisasjonOrdreController.java b/apps/organisasjon-faste-data-service/src/main/java/no/nav/registre/testnorge/organisasjonfastedataservice/controller/OrganisasjonOrdreController.java index d52e9b59c6a..3ce0fcaadd9 100644 --- a/apps/organisasjon-faste-data-service/src/main/java/no/nav/registre/testnorge/organisasjonfastedataservice/controller/OrganisasjonOrdreController.java +++ b/apps/organisasjon-faste-data-service/src/main/java/no/nav/registre/testnorge/organisasjonfastedataservice/controller/OrganisasjonOrdreController.java @@ -4,7 +4,7 @@ import lombok.extern.slf4j.Slf4j; import no.nav.registre.testnorge.organisasjonfastedataservice.service.OrganisasjonOrdreService; import no.nav.registre.testnorge.organisasjonfastedataservice.service.OrganisasjonService; -import no.nav.testnav.libs.dto.organiasjonbestilling.v1.ItemDTO; +import no.nav.testnav.libs.dto.organisajonbestilling.v1.ItemDTO; import no.nav.testnav.libs.dto.organisasjonfastedataservice.v1.Gruppe; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/apps/organisasjon-faste-data-service/src/main/java/no/nav/registre/testnorge/organisasjonfastedataservice/service/OrganisasjonOrdreService.java b/apps/organisasjon-faste-data-service/src/main/java/no/nav/registre/testnorge/organisasjonfastedataservice/service/OrganisasjonOrdreService.java index 9227481aab3..4ad157b363c 100644 --- a/apps/organisasjon-faste-data-service/src/main/java/no/nav/registre/testnorge/organisasjonfastedataservice/service/OrganisasjonOrdreService.java +++ b/apps/organisasjon-faste-data-service/src/main/java/no/nav/registre/testnorge/organisasjonfastedataservice/service/OrganisasjonOrdreService.java @@ -6,7 +6,7 @@ import java.util.List; import java.util.UUID; -import no.nav.testnav.libs.dto.organiasjonbestilling.v1.ItemDTO; +import no.nav.testnav.libs.dto.organisajonbestilling.v1.ItemDTO; import no.nav.testnav.libs.dto.organisasjonfastedataservice.v1.Gruppe; import no.nav.registre.testnorge.organisasjonfastedataservice.consumer.OrganisasjonBestillingConsumer; import no.nav.registre.testnorge.organisasjonfastedataservice.consumer.OrganisasjonMottakConsumer; diff --git a/apps/organisasjon-mottak-service/src/main/java/no/nav/registre/testnorge/organisasjonmottak/consumer/OrganisasjonBestillingConsumer.java b/apps/organisasjon-mottak-service/src/main/java/no/nav/registre/testnorge/organisasjonmottak/consumer/OrganisasjonBestillingConsumer.java index 3963338dcb5..89190fa8aad 100644 --- a/apps/organisasjon-mottak-service/src/main/java/no/nav/registre/testnorge/organisasjonmottak/consumer/OrganisasjonBestillingConsumer.java +++ b/apps/organisasjon-mottak-service/src/main/java/no/nav/registre/testnorge/organisasjonmottak/consumer/OrganisasjonBestillingConsumer.java @@ -3,7 +3,7 @@ import lombok.extern.slf4j.Slf4j; import no.nav.registre.testnorge.organisasjonmottak.config.Consumers; import no.nav.registre.testnorge.organisasjonmottak.consumer.command.RegisterBestillingCommand; -import no.nav.testnav.libs.dto.organiasjonbestilling.v2.OrderDTO; +import no.nav.testnav.libs.dto.organisajonbestilling.v2.OrderDTO; import no.nav.testnav.libs.securitycore.domain.ServerProperties; import no.nav.testnav.libs.standalone.servletsecurity.exchange.TokenExchange; import org.springframework.stereotype.Component; diff --git a/apps/organisasjon-mottak-service/src/main/java/no/nav/registre/testnorge/organisasjonmottak/consumer/command/RegisterBestillingCommand.java b/apps/organisasjon-mottak-service/src/main/java/no/nav/registre/testnorge/organisasjonmottak/consumer/command/RegisterBestillingCommand.java index 460e86aa0e6..0ca9277f8da 100644 --- a/apps/organisasjon-mottak-service/src/main/java/no/nav/registre/testnorge/organisasjonmottak/consumer/command/RegisterBestillingCommand.java +++ b/apps/organisasjon-mottak-service/src/main/java/no/nav/registre/testnorge/organisasjonmottak/consumer/command/RegisterBestillingCommand.java @@ -2,7 +2,7 @@ import lombok.RequiredArgsConstructor; import no.nav.testnav.libs.commands.utils.WebClientFilter; -import no.nav.testnav.libs.dto.organiasjonbestilling.v2.OrderDTO; +import no.nav.testnav.libs.dto.organisajonbestilling.v2.OrderDTO; import org.springframework.http.HttpHeaders; import org.springframework.web.reactive.function.BodyInserters; import org.springframework.web.reactive.function.client.WebClient; diff --git a/apps/person-export-api/Dockerfile b/apps/person-export-api/Dockerfile deleted file mode 100644 index 4a36f93546f..00000000000 --- a/apps/person-export-api/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM ghcr.io/navikt/baseimages/temurin:21 -LABEL maintainer="Team Dolly" - -ENV JAVA_OPTS="-Dspring.profiles.active=prod" - -ADD /build/libs/app.jar /app/app.jar - -EXPOSE 8080 diff --git a/apps/person-export-api/README.md b/apps/person-export-api/README.md deleted file mode 100644 index 5294584c4c3..00000000000 --- a/apps/person-export-api/README.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -layout: default -title: Person Export API -parent: Applikasjoner ---- - -# testnav-person-export-api -Api for å eksportere personer. - -## Swagger -Swagger finnes under [/swagger](https://testnav-person-export-api.intern.dev.nav.no/swagger) -endepunktet til applikasjonen. - -## Lokal kjøring -Ha naisdevice kjørende og kjør PersonExportApiApplicationStarter med følgende argumenter: -``` --Dspring.cloud.vault.token=[vault-token] --Dspring.profiles.active=dev -``` - -### Utviklerimage -I utviklerimage brukes ikke naisdevice og du må legge til følgende ekstra argumenter: -``` --Djavax.net.ssl.trustStore=[path til lokal truststore] --Djavax.net.ssl.trustStorePassword=[passord til lokal truststore] -``` diff --git a/apps/person-export-api/build.gradle b/apps/person-export-api/build.gradle deleted file mode 100644 index 16aba6a935e..00000000000 --- a/apps/person-export-api/build.gradle +++ /dev/null @@ -1,88 +0,0 @@ -plugins { - id 'java' - id "org.sonarqube" version "4.0.0.2929" - id 'org.springframework.boot' version "3.1.4" - id 'io.spring.dependency-management' version "1.1.3" - id "jacoco" -} - -test { - useJUnitPlatform() -} - -jacocoTestReport { - reports { - xml.required = true - } -} - -sonarqube { - properties { - property "sonar.coverage.jacoco.xmlReportPaths", "${project.buildDir}/reports/jacoco/test/jacocoTestReport.xml" - property "sonar.dynamicAnalysis", "reuseReports" - property "sonar.host.url", "https://sonarcloud.io" - property "sonar.java.coveragePlugin", "jacoco" - property "sonar.language", "java" - property "sonar.login", System.getenv("SONAR_TOKEN") - property "sonar.organization", "navikt" - property "sonar.project.monorepo.enabled", true - property "sonar.projectKey", "testnorge-person-export-api" - property "sonar.projectName", "testnorge-person-export-api" - property "sonar.sourceEncoding", "UTF-8" - } -} -bootJar { - archiveFileName = "app.jar" -} - -dependencyManagement { - applyMavenExclusions = false - imports { - mavenBom 'org.springframework.cloud:spring-cloud-dependencies:2022.0.4' - } -} - -repositories { - mavenCentral() - mavenLocal() -} - -dependencies { - - implementation 'no.nav.testnav.libs:csv-converter' - implementation 'no.nav.testnav.libs:reactive-core' - implementation 'no.nav.testnav.libs:security-core' - implementation 'no.nav.testnav.libs:servlet-core' - implementation 'no.nav.testnav.libs:servlet-security' - implementation 'no.nav.testnav.libs:slack' - - implementation 'org.springframework.boot:spring-boot-starter-webflux' - implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-security' - implementation 'org.springframework.boot:spring-boot-starter-cache' - - - implementation 'org.springframework.cloud:spring-cloud-starter-vault-config' - implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap' // TODO remove legacy bootstrap config - implementation 'org.springframework.boot:spring-boot-starter-actuator' - - implementation 'io.micrometer:micrometer-registry-prometheus' - - implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0' - implementation 'io.swagger.core.v3:swagger-annotations-jakarta:2.2.16' - implementation 'net.logstash.logback:logstash-logback-encoder:7.4' - implementation 'org.hibernate.validator:hibernate-validator' - - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'org.springframework.cloud:spring-cloud-contract-wiremock' - - implementation 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' - testAnnotationProcessor 'org.projectlombok:lombok' -} -java { - toolchain { - languageVersion = JavaLanguageVersion.of(21) - } -} diff --git a/apps/person-export-api/config.yml b/apps/person-export-api/config.yml deleted file mode 100644 index aa431f6a4ab..00000000000 --- a/apps/person-export-api/config.yml +++ /dev/null @@ -1,58 +0,0 @@ -apiVersion: "nais.io/v1alpha1" -kind: "Application" -metadata: - name: testnav-person-export-api - namespace: dolly - labels: - team: dolly -spec: - image: {{ image }} - port: 8080 - webproxy: true - tokenx: - enabled: true - azure: - application: - allowAllUsers: true - enabled: true - tenant: nav.no - liveness: - path: /internal/isAlive - initialDelay: 4 - periodSeconds: 5 - failureThreshold: 500 - readiness: - path: /internal/isReady - initialDelay: 4 - periodSeconds: 5 - failureThreshold: 500 - prometheus: - enabled: true - path: /internal/metrics - replicas: - min: 1 - max: 1 - vault: - enabled: true - resources: - requests: - cpu: 1000m - memory: 4000Mi - limits: - memory: 5000Mi - accessPolicy: - inbound: - rules: - - application: team-dolly-lokal-app - cluster: dev-gcp - - application: testnav-oversikt-frontend - cluster: dev-gcp - outbound: - external: - - host: tps-forvalteren-proxy.dev-fss-pub.nais.io - - host: testnav-kodeverk-proxy.dev-fss-pub.nais.io - - host: slack.com - envFrom: - - secret: testnav-person-export-api-slack-secret - ingresses: - - "https://testnav-person-export-api.intern.dev.nav.no" \ No newline at end of file diff --git a/apps/person-export-api/gradle/wrapper/gradle-wrapper.jar b/apps/person-export-api/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL diff --git a/apps/person-export-api/gradle/wrapper/gradle-wrapper.properties b/apps/person-export-api/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index e411586a54a..00000000000 --- a/apps/person-export-api/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/apps/person-export-api/gradlew b/apps/person-export-api/gradlew deleted file mode 100755 index 3da45c161b0..00000000000 --- a/apps/person-export-api/gradlew +++ /dev/null @@ -1,234 +0,0 @@ -#!/bin/sh - -# -# Copyright ? 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions ?$var?, ?${var}?, ?${var:-default}?, ?${var+SET}?, -# ?${var#prefix}?, ?${var%suffix}?, and ?$( cmd )?; -# * compound commands having a testable exit status, especially ?case?; -# * various built-in commands including ?command?, ?set?, and ?ulimit?. -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/apps/person-export-api/gradlew.bat b/apps/person-export-api/gradlew.bat deleted file mode 100644 index ac1b06f9382..00000000000 --- a/apps/person-export-api/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/apps/person-export-api/gradlewUpdate.sh b/apps/person-export-api/gradlewUpdate.sh deleted file mode 100755 index e5ee6361152..00000000000 --- a/apps/person-export-api/gradlewUpdate.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -gradle wrapper \ No newline at end of file diff --git a/apps/person-export-api/settings.gradle b/apps/person-export-api/settings.gradle deleted file mode 100644 index 741e0db2afc..00000000000 --- a/apps/person-export-api/settings.gradle +++ /dev/null @@ -1,18 +0,0 @@ -plugins { - id "com.gradle.enterprise" version "3.12.3" -} - -rootProject.name = 'person-export-api' - -includeBuild '../../libs/csv-converter' -includeBuild '../../libs/reactive-core' -includeBuild '../../libs/servlet-core' -includeBuild '../../libs/servlet-security' -includeBuild '../../libs/slack' - -gradleEnterprise { - buildScan { - termsOfServiceUrl = "https://gradle.com/terms-of-service" - termsOfServiceAgree = "yes" - } -} \ No newline at end of file diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/PersonExportApiApplicationStarter.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/PersonExportApiApplicationStarter.java deleted file mode 100644 index 871e1b629c1..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/PersonExportApiApplicationStarter.java +++ /dev/null @@ -1,11 +0,0 @@ -package no.nav.testnav.apps.personexportapi; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class PersonExportApiApplicationStarter { - public static void main(String[] args) { - SpringApplication.run(PersonExportApiApplicationStarter.class, args); - } -} diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/adapter/SlackAdapter.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/adapter/SlackAdapter.java deleted file mode 100644 index 9cc3b85dfcf..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/adapter/SlackAdapter.java +++ /dev/null @@ -1,21 +0,0 @@ -package no.nav.testnav.apps.personexportapi.adapter; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import no.nav.testnav.libs.slack.consumer.SlackConsumer; - -@Component -public class SlackAdapter { - private final SlackConsumer slackConsumer; - private final String channel; - - public SlackAdapter(SlackConsumer slackConsumer, @Value("${consumers.slack.channel}") String channel) { - this.slackConsumer = slackConsumer; - this.channel = channel; - } - - public void uploadFile(byte[] file, String fileName) { - slackConsumer.uploadFile(file, fileName, channel); - } -} diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/config/AppConfig.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/config/AppConfig.java deleted file mode 100644 index 84736fe9478..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/config/AppConfig.java +++ /dev/null @@ -1,28 +0,0 @@ -package no.nav.testnav.apps.personexportapi.config; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; - -import no.nav.testnav.libs.servletcore.config.ApplicationCoreConfig; -import no.nav.testnav.libs.servletcore.config.ApplicationProperties; -import no.nav.testnav.libs.servletsecurity.config.SecureOAuth2ServerToServerConfiguration; -import no.nav.testnav.libs.slack.consumer.SlackConsumer; - -@Configuration -@Import({ - ApplicationCoreConfig.class, - SecureOAuth2ServerToServerConfiguration.class -}) -public class AppConfig { - @Bean - public SlackConsumer slackConsumer( - @Value("${consumers.slack.token}") String token, - @Value("${consumers.slack.baseUrl}") String baseUrl, - @Value("${http.proxy:#{null}}") String proxyHost, - ApplicationProperties properties - ) { - return new SlackConsumer(token, baseUrl, proxyHost, properties.getName()); - } -} diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/config/Consumers.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/config/Consumers.java deleted file mode 100644 index e9b4af4af4f..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/config/Consumers.java +++ /dev/null @@ -1,30 +0,0 @@ -package no.nav.testnav.apps.personexportapi.config; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import no.nav.testnav.libs.securitycore.domain.ServerProperties; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -import static lombok.AccessLevel.PACKAGE; - -/** - * Samler alle placeholders for ulike {@code consumers.*}-konfigurasjon her, dvs. subklasser av {@code ServerProperties}. - *

- * Husk at Spring Boot bruker
relaxed binding - * mellom configuration properties og field names. - * - * @see ServerProperties - */ -@Configuration -@ConfigurationProperties(prefix = "consumers") -@NoArgsConstructor(access = PACKAGE) -@Getter -@Setter(PACKAGE) -public class Consumers { - - private ServerProperties kodeverk; - private ServerProperties tpsForvalter; - -} diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/config/OpenApiConfig.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/config/OpenApiConfig.java deleted file mode 100644 index c702184af7d..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/config/OpenApiConfig.java +++ /dev/null @@ -1,55 +0,0 @@ -package no.nav.testnav.apps.personexportapi.config; - -import io.swagger.v3.oas.models.Components; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.info.Contact; -import io.swagger.v3.oas.models.info.Info; -import io.swagger.v3.oas.models.info.License; -import io.swagger.v3.oas.models.security.SecurityRequirement; -import io.swagger.v3.oas.models.security.SecurityScheme; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -import java.util.Arrays; - -import no.nav.testnav.libs.servletcore.config.ApplicationProperties; - -@Configuration -public class OpenApiConfig implements WebMvcConfigurer { - - @Bean - public OpenAPI openApi(ApplicationProperties applicationProperties) { - return new OpenAPI() - .components(new Components().addSecuritySchemes("bearer-jwt", new SecurityScheme() - .type(SecurityScheme.Type.HTTP) - .scheme("bearer") - .bearerFormat("JWT") - .in(SecurityScheme.In.HEADER) - .name("Authorization") - )) - .addSecurityItem( - new SecurityRequirement().addList("bearer-jwt", Arrays.asList("read", "write"))) - .info(new Info() - .title(applicationProperties.getName()) - .version(applicationProperties.getVersion()) - .description(applicationProperties.getDescription()) - .termsOfService("https://nav.no") - .contact(new Contact() - .url("https://nav-it.slack.com/archives/CA3P9NGA2") - .email("dolly@nav.no") - .name("Team Dolly") - ) - .license(new License() - .name("MIT License") - .url("https://opensource.org/licenses/MIT") - ) - ); - } - - @Override - public void addViewControllers(ViewControllerRegistry registry) { - registry.addViewController("/swagger").setViewName("redirect:/swagger-ui.html"); - } -} \ No newline at end of file diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/config/SecurityConfig.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/config/SecurityConfig.java deleted file mode 100644 index 0bd507f64e4..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/config/SecurityConfig.java +++ /dev/null @@ -1,38 +0,0 @@ -package no.nav.testnav.apps.personexportapi.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.security.config.Customizer; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; -import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.web.SecurityFilterChain; - - -@EnableWebSecurity -@Configuration -@Profile({ "prod", "dev" }) -public class SecurityConfig { - - @Bean - public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { - - httpSecurity.sessionManagement(sessionConfig -> sessionConfig.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) - .csrf(AbstractHttpConfigurer::disable) - .authorizeHttpRequests(authorizeConfig -> authorizeConfig.requestMatchers( - "/internal/**", - "/webjars/**", - "/swagger-resources/**", - "/v3/api-docs/**", - "/swagger-ui/**", - "/swagger", - "/error", - "/swagger-ui.html" - ).permitAll().requestMatchers("/api/**").fullyAuthenticated()) - .oauth2ResourceServer(oauth2RSConfig -> oauth2RSConfig.jwt(Customizer.withDefaults())); - - return httpSecurity.build(); - } -} \ No newline at end of file diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/config/VaultConfig.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/config/VaultConfig.java deleted file mode 100644 index bb32e83529f..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/config/VaultConfig.java +++ /dev/null @@ -1,37 +0,0 @@ -package no.nav.testnav.apps.personexportapi.config; - -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.vault.annotation.VaultPropertySource; -import org.springframework.vault.authentication.ClientAuthentication; -import org.springframework.vault.authentication.TokenAuthentication; -import org.springframework.vault.client.VaultEndpoint; -import org.springframework.vault.config.AbstractVaultConfiguration; - -import static io.micrometer.common.util.StringUtils.isBlank; - -@Configuration -@Profile("dev") -@VaultPropertySource(value = "secret/dolly/lokal", ignoreSecretNotFound = false) -@VaultPropertySource(value = "kv/preprod/fss/testnorge-person-export-api/dev", ignoreSecretNotFound = false) -public class VaultConfig extends AbstractVaultConfiguration { - - private static final String VAULT_TOKEN = "spring.cloud.vault.token"; - - @Override - public VaultEndpoint vaultEndpoint() { - return VaultEndpoint.create("vault.adeo.no", 443); - } - - @Override - public ClientAuthentication clientAuthentication() { - if (System.getenv().containsKey("VAULT_TOKEN")) { - System.setProperty(VAULT_TOKEN, System.getenv("VAULT_TOKEN")); - } - var token = System.getProperty(VAULT_TOKEN); - if (isBlank(token)) { - throw new IllegalArgumentException("Påkrevet property 'spring.cloud.vault.token' er ikke satt."); - } - return new TokenAuthentication(System.getProperty(VAULT_TOKEN)); - } -} \ No newline at end of file diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/KodeverkConsumer.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/KodeverkConsumer.java deleted file mode 100644 index e426ddacbaa..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/KodeverkConsumer.java +++ /dev/null @@ -1,64 +0,0 @@ -package no.nav.testnav.apps.personexportapi.consumer; - -import static org.apache.logging.log4j.util.Strings.isNotBlank; - -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import no.nav.testnav.apps.personexportapi.config.Consumers; -import no.nav.testnav.apps.personexportapi.consumer.command.GetKodeverkCommand; -import no.nav.testnav.apps.personexportapi.consumer.response.KodeverkBetydningerResponse; -import no.nav.testnav.libs.securitycore.domain.ServerProperties; -import no.nav.testnav.libs.servletsecurity.exchange.TokenExchange; -import org.springframework.cache.annotation.CacheConfig; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.cache.annotation.EnableCaching; -import org.springframework.stereotype.Component; - -import org.springframework.web.reactive.function.client.WebClient; - -@Component -@EnableCaching -@CacheConfig(cacheNames = "Kodeverk") -public class KodeverkConsumer { - - private final WebClient webClient; - private final TokenExchange tokenExchange; - private final ServerProperties serverProperties; - - public KodeverkConsumer( - TokenExchange tokenExchange, - Consumers consumers) { - this.tokenExchange = tokenExchange; - serverProperties = consumers.getKodeverk(); - this.webClient = WebClient - .builder() - .baseUrl(serverProperties.getUrl()) - .codecs(configurer -> configurer - .defaultCodecs() - .maxInMemorySize(16 * 1024 * 1024)) - .build(); - } - - public String getKodeverkOppslag(String kodeverk, String verdi) { - try { - return isNotBlank(verdi) ? getKodeverkByName(kodeverk).get(verdi).stream().findFirst() - .map(betydning -> betydning.getBeskrivelser().get("nb").getTekst()) - .orElse(null) : null; - - } catch (RuntimeException e) { - return null; - } - } - - @Cacheable(sync = true) - public Map> getKodeverkByName(String kodeverk) { - - var kodeverkResponse = tokenExchange.exchange(serverProperties) - .flatMap(accessToken -> new GetKodeverkCommand(webClient, accessToken.getTokenValue(), kodeverk).call()) - .block(); - - return kodeverkResponse != null ? kodeverkResponse.getBetydninger() : Collections.emptyMap(); - } -} diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/TpsfConsumer.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/TpsfConsumer.java deleted file mode 100644 index e7d9d485d13..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/TpsfConsumer.java +++ /dev/null @@ -1,113 +0,0 @@ -package no.nav.testnav.apps.personexportapi.consumer; - -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.apps.personexportapi.config.Consumers; -import no.nav.testnav.apps.personexportapi.consumer.command.GetTpsfGrupperCommand; -import no.nav.testnav.apps.personexportapi.consumer.command.GetTpsfMeldingerFromPageCommand; -import no.nav.testnav.apps.personexportapi.consumer.dto.GruppeDTO; -import no.nav.testnav.apps.personexportapi.domain.Person; -import no.nav.testnav.libs.securitycore.domain.ServerProperties; -import no.nav.testnav.libs.servletsecurity.exchange.TokenExchange; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Component; -import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.reactive.function.client.WebClient; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; -import java.util.stream.Collectors; - -import static java.lang.String.format; - -@Slf4j -@Component -public class TpsfConsumer { - private final WebClient webClient; - private final TokenExchange tokenExchange; - private final ServerProperties serverProperties; - private final ExecutorService executorService; - - public TpsfConsumer( - TokenExchange tokenExchange, - Consumers consumers) { - this.tokenExchange = tokenExchange; - serverProperties = consumers.getTpsForvalter(); - this.webClient = WebClient - .builder() - .baseUrl(serverProperties.getUrl()) - .build(); - this.executorService = Executors.newFixedThreadPool(serverProperties.getThreads()); - } - - private GruppeDTO getGruppe(String avspillingsgruppe) { - log.info("Henter avspillingsgruppe med id {}...", avspillingsgruppe); - - var list = tokenExchange.exchange(serverProperties) - .flatMap(accessToken -> new GetTpsfGrupperCommand(webClient, accessToken.getTokenValue()).call()) - .block(); - - var gruppeDTO = list.stream() - .filter(value -> value.getId().equals(avspillingsgruppe)) - .findFirst() - .orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND, "Finner ikke gruppe med avspillergruppeId " + avspillingsgruppe)); - log.info("Avspillingsgruppe med id {} og navn {} hentet.", gruppeDTO.getId(), gruppeDTO.getNavn()); - return gruppeDTO; - } - - private int getNumberOfPages(String avspillingsgruppe) { - int antallSider = getGruppe(avspillingsgruppe).getAntallSider(); - log.info("Gruppe med avspillingsgruppe id {} har {} antall sider.", avspillingsgruppe, antallSider); - return antallSider; - } - - private CompletableFuture> getPersonFromPage(String avspillingsgruppe, int page, int numberOfPages) { - return CompletableFuture.supplyAsync( - () -> tokenExchange.exchange(serverProperties) - .flatMap(accessToken -> new GetTpsfMeldingerFromPageCommand( - webClient, accessToken.getTokenValue(), avspillingsgruppe, page).call()) - .block(), - executorService - ).thenApply(meldinger -> { - log.info("Har hentet {}/{} sider fra avspillingsgruppeID {}", page + 1, numberOfPages, avspillingsgruppe); - return meldinger - .stream() - .filter(value -> value.isFoedsel() || value.isInnvandring()) - .map(endringsmelding -> new Person(endringsmelding, format("%d/%d", page + 1, numberOfPages))) - .collect(Collectors.toList()); - }); - } - - public List getPersoner(String avspillingsgruppe) { - int numberOfPages = getNumberOfPages(avspillingsgruppe); - log.info("Henter alle personer fra avspillingsgruppeID {} med {} antall sider.", avspillingsgruppe, numberOfPages); - - List>> futures = new ArrayList<>(); - for (int page = 0; page < numberOfPages; page++) { - futures.add(getPersonFromPage(avspillingsgruppe, page, numberOfPages)); - } - List personer = new ArrayList<>(); - for (CompletableFuture> future : futures) { - try { - log.info(format("Active threads: %d, Waiting to start: %d", - ((ThreadPoolExecutor) executorService).getActiveCount(), - ((ThreadPoolExecutor) executorService).getQueue().size())); - personer.addAll(future.get(1, TimeUnit.MINUTES)); - - } catch (TimeoutException e) { - log.error("Future task timeout exception {}", future, e); - } catch (ExecutionException e) { - log.error("Execution exception", e); - } catch (InterruptedException e) { - log.error("Interrupted exception", e); - } - } - return personer; - } -} diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/command/GetKodeverkCommand.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/command/GetKodeverkCommand.java deleted file mode 100644 index a9e1ab6a0a6..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/command/GetKodeverkCommand.java +++ /dev/null @@ -1,49 +0,0 @@ -package no.nav.testnav.apps.personexportapi.consumer.command; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.apps.personexportapi.consumer.response.KodeverkBetydningerResponse; -import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.reactive.function.client.WebClientResponseException; -import reactor.core.publisher.Mono; - -import java.util.Collections; -import java.util.UUID; -import java.util.concurrent.Callable; - -@Slf4j -@RequiredArgsConstructor -public class GetKodeverkCommand implements Callable> { - private final WebClient webClient; - private final String token; - private final String kodeverksnavn; - - protected static String getMessage(Throwable error) { - return error instanceof WebClientResponseException webClientResponseException ? - webClientResponseException.getResponseBodyAsString() : - error.getMessage(); - } - - @Override - public Mono call() { - return webClient - .get() - .uri(builder -> builder - .path("/api/v1/kodeverk/{kodeverksnavn}/koder/betydninger") - .queryParam("ekskluderUgyldige", "true") - .queryParam("spraak", "nb") - .build(kodeverksnavn) - ) - .header("Authorization", "Bearer " + token) - .header("Nav-Consumer-Id", "testnav-person-export-api") - .header("Nav-Call-Id", UUID.randomUUID().toString()) - .retrieve() - .bodyToMono(KodeverkBetydningerResponse.class) - .onErrorResume(throwable -> { - log.error("Feil i henting av kodeverk: " + getMessage(throwable)); - return Mono.just(KodeverkBetydningerResponse.builder() - .betydninger(Collections.emptyMap()) - .build()); - }); - } -} diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/command/GetTpsfGrupperCommand.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/command/GetTpsfGrupperCommand.java deleted file mode 100644 index 45c1c6a8554..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/command/GetTpsfGrupperCommand.java +++ /dev/null @@ -1,40 +0,0 @@ -package no.nav.testnav.apps.personexportapi.consumer.command; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.apps.personexportapi.consumer.dto.GruppeDTO; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; - -import java.util.Collections; -import java.util.List; -import java.util.concurrent.Callable; - -import static no.nav.testnav.apps.personexportapi.consumer.command.GetKodeverkCommand.getMessage; - -@Slf4j -@RequiredArgsConstructor -public class GetTpsfGrupperCommand implements Callable>> { - private static final ParameterizedTypeReference> RESPONSE_TYPE = new ParameterizedTypeReference<>() { - }; - private final WebClient webClient; - private final String token; - - @Override - public Mono> call() { - return webClient - .get() - .uri(builder -> builder - .path("/api/v1/endringsmelding/skd/grupper") - .build() - ) - .header("Authorization", "Bearer " + token) - .retrieve() - .bodyToMono(RESPONSE_TYPE) - .onErrorResume(throwable -> { - log.error("Feil i henting av tpsf grupper: " + getMessage(throwable)); - return Mono.just(Collections.emptyList()); - }); - } -} diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/command/GetTpsfMeldingerFromPageCommand.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/command/GetTpsfMeldingerFromPageCommand.java deleted file mode 100644 index 7a05226ab7a..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/command/GetTpsfMeldingerFromPageCommand.java +++ /dev/null @@ -1,43 +0,0 @@ -package no.nav.testnav.apps.personexportapi.consumer.command; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.apps.personexportapi.consumer.dto.EndringsmeldingDTO; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; - -import java.util.Collections; -import java.util.List; -import java.util.concurrent.Callable; - -import static no.nav.testnav.apps.personexportapi.consumer.command.GetKodeverkCommand.getMessage; - -@Slf4j -@RequiredArgsConstructor -public class GetTpsfMeldingerFromPageCommand implements Callable>> { - - private static final ParameterizedTypeReference> RESPONSE_TYPE = new ParameterizedTypeReference<>() { - }; - private final WebClient webClient; - private final String token; - private final String avspillingsgruppe; - private final int pageNumber; - - @Override - public Mono> call() { - return webClient - .get() - .uri(builder -> builder - .path("/api/v1/endringsmelding/skd/gruppe/meldinger/{avspillingsgruppe}/{pageNumber}") - .build(avspillingsgruppe, pageNumber) - ) - .header("Authorization", "Bearer " + token) - .retrieve() - .bodyToMono(RESPONSE_TYPE) - .onErrorResume(throwable -> { - log.error("Feil i henting av tpsf mledinger: " + getMessage(throwable)); - return Mono.just(Collections.emptyList()); - }); - } -} diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/DiskresjonskoderType.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/DiskresjonskoderType.java deleted file mode 100644 index 85c3c8b1c46..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/DiskresjonskoderType.java +++ /dev/null @@ -1,30 +0,0 @@ -package no.nav.testnav.apps.personexportapi.consumer.dto; - -public enum DiskresjonskoderType { - - VABO("0", "Vanlig bosatt"), - URIK("1", "I utenrikstjeneste"), - MILI("2", "Militær"), - SVAL("3", "Svalbard"), - KLIE("4", "Klientadresse"), - UFB("5", "Uten fast bobel"), - SPSF("6", "Sperret adresse, strengt fortrolig"), //kode 6 - SPFO("7", "Sperret adresse, fortrolig"), //kode 7 - PEND("8", "Pendler"); - - private String navn; - private String kodeverdi; - - DiskresjonskoderType(final String kode, final String diskresjonskodeNavn){ - kodeverdi = kode; - navn = diskresjonskodeNavn; - } - - public String getName() { - return navn; - } - - public String getKodeverdi() { - return kodeverdi; - } -} \ No newline at end of file diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/EndringsmeldingDTO.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/EndringsmeldingDTO.java deleted file mode 100644 index 32769df7856..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/EndringsmeldingDTO.java +++ /dev/null @@ -1,69 +0,0 @@ -package no.nav.testnav.apps.personexportapi.consumer.dto; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; -import lombok.Value; - -@Value -@NoArgsConstructor(force = true) -@AllArgsConstructor -public class EndringsmeldingDTO { - - private static final String AARSAKSKODE_FOEDSEL = "01"; - private static final String AARSAKSKODE_INNVANDRING = "02"; - - String fodselsdato; - String personnummer; - String fornavn; - String mellomnavn; - String slektsnavn; - String statuskode; - String aarsakskode; - String personkode; - String kommunenummer; - String postnummer; - String flyttedatoAdr; // flyttedato - String adressetype; // O = Offisiell, dvs gateadresse, M = matrikkeladresse - String gateGaard; // gatekode (O) eller gårdsnummer (M) - String adressenavn; // gatenavn (O) eller gårdsnavn (M) - String husBruk; // husnummer (O) eller bruksnummer (M) - String bokstavFestenr; // husbokstav (O) eller festenummer (M) - String bolignr; // eks H0101 - String tilleggsadresse; - String adresse1; - String adresse2; - String adresse3; - String postadrLand; - String sivilstand; - String regdatoSivilstand; - String statsborgerskap; - String regdatoStatsb; - String innvandretFraLand; - String fraLandFlyttedato; - String utvandretTilLand; - String tilLandFlyttedato; - String spesRegType; - String datoSpesRegType; - - @JsonIgnore - public boolean isFoedsel() { - return AARSAKSKODE_FOEDSEL.equals(aarsakskode); - } - - @JsonIgnore - public boolean isInnvandring() { - return AARSAKSKODE_INNVANDRING.equals(aarsakskode); - } - - @JsonIgnore - public boolean isMatrikkeladresse() { - return "M".equals(getAdressetype()); - } - - @JsonIgnore - public boolean isGateadresse() { - return "O".equals(getAdressetype()); - } -} \ No newline at end of file diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/FoedselsdatoFraIdent.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/FoedselsdatoFraIdent.java deleted file mode 100644 index 55acb5dd3b3..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/FoedselsdatoFraIdent.java +++ /dev/null @@ -1,52 +0,0 @@ -package no.nav.testnav.apps.personexportapi.consumer.dto; - -import static java.lang.Integer.parseInt; - -import java.time.LocalDate; -import java.time.LocalDateTime; - -import lombok.experimental.UtilityClass; - -/** - * INDIVID(POS 7-9) 500-749 OG ÅR > 54 => ÅRHUNDRE = 1800 - * INDIVID(POS 7-9) 000-499 => ÅRHUNDRE = 1900 - * INDIVID(POS 7-9) 900-999 OG ÅR > 39 => ÅRHUNDRE = 1900 - * INDIVID(POS 7-9) 500-999 OG ÅR < 40 => ÅRHUNDRE = 2000 - */ -@UtilityClass -public class FoedselsdatoFraIdent { - - public LocalDateTime getFoedselsdato(String ident) { - - int year = parseInt(ident.substring(4, 6)); - int individ = parseInt(ident.substring(6, 9)); - - // Find century - int century; - if (parseInt(ident.substring(6, 10)) == 0) { - century = year <= LocalDate.now().getYear() % 100 ? 2000 : 1900; - } else if (individ < 500 || (individ >= 900 && year > 39)) { - century = 1900; - } else if (individ >= 500 && year < 40) { - century = 2000; - } else if (individ >= 500 && individ < 750 && year > 54) { - century = 1800; - } else { - century = 2000; - } - - return LocalDateTime.of(century + year, getMonth(ident), getDay(ident), 0, 0); - } - - private int getDay(String ident) { - // Fix D-number - return ident.charAt(0) >= '4' ? parseInt(ident.substring(0, 2)) - 40 : - parseInt(ident.substring(0, 2)); - } - - private int getMonth(String ident) { - // Fix B-number - return ident.charAt(2) >= '2' ? parseInt(ident.substring(2, 4)) - 20 : - parseInt(ident.substring(2, 4)); - } -} \ No newline at end of file diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/GruppeDTO.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/GruppeDTO.java deleted file mode 100644 index 136890d4e83..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/GruppeDTO.java +++ /dev/null @@ -1,17 +0,0 @@ -package no.nav.testnav.apps.personexportapi.consumer.dto; - -import java.util.List; - -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; -import lombok.Value; - -@Value -@NoArgsConstructor(force = true) -@AllArgsConstructor -public class GruppeDTO { - String id; - String navn; - List meldinger; - Integer antallSider; -} diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/HusbokstavEncoder.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/HusbokstavEncoder.java deleted file mode 100644 index 23d9bd2b0b7..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/HusbokstavEncoder.java +++ /dev/null @@ -1,55 +0,0 @@ -package no.nav.testnav.apps.personexportapi.consumer.dto; - -import static java.util.Objects.nonNull; - -import org.bouncycastle.asn1.eac.BidirectionalMap; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class HusbokstavEncoder { - - private static BidirectionalMap encodingMap; - - static { - encodingMap = new BidirectionalMap(); - encodingMap.put("A", "9901"); - encodingMap.put("B", "9902"); - encodingMap.put("C", "9903"); - encodingMap.put("D", "9904"); - encodingMap.put("E", "9905"); - encodingMap.put("F", "9906"); - encodingMap.put("G", "9907"); - encodingMap.put("H", "9908"); - encodingMap.put("I", "9909"); - encodingMap.put("J", "9910"); - encodingMap.put("K", "9911"); - encodingMap.put("L", "9912"); - encodingMap.put("M", "9913"); - encodingMap.put("N", "9914"); - encodingMap.put("O", "9915"); - encodingMap.put("P", "9916"); - encodingMap.put("Q", "9917"); - encodingMap.put("R", "9918"); - encodingMap.put("S", "9919"); - encodingMap.put("T", "9920"); - encodingMap.put("U", "9921"); - encodingMap.put("V", "9922"); - encodingMap.put("W", "9923"); - encodingMap.put("X", "9924"); - encodingMap.put("Y", "9925"); - encodingMap.put("Z", "9926"); - encodingMap.put("Æ", "9927"); - encodingMap.put("Ø", "9928"); - encodingMap.put("Å", "9929"); - encodingMap.put("Á", "9930"); - } - - public static String encode(String husbokstav) { - return (String) encodingMap.get(husbokstav); - } - - public static String decode(String skdHusnummerCode) { - return nonNull(skdHusnummerCode) ? (String) encodingMap.getReverse(skdHusnummerCode) : null; - } -} diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/KjoennFraIdent.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/KjoennFraIdent.java deleted file mode 100644 index acacf301959..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/KjoennFraIdent.java +++ /dev/null @@ -1,15 +0,0 @@ -package no.nav.testnav.apps.personexportapi.consumer.dto; - -import static java.lang.Integer.parseInt; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class KjoennFraIdent { - - public KjoennType getKjoenn(String ident){ - - int kjoennNummer = parseInt(ident.substring(8,9)); - return kjoennNummer % 2 == 0 ? KjoennType.K : KjoennType.M; - } -} \ No newline at end of file diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/KjoennType.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/KjoennType.java deleted file mode 100644 index 3c6a9a41085..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/KjoennType.java +++ /dev/null @@ -1,19 +0,0 @@ -package no.nav.testnav.apps.personexportapi.consumer.dto; - -import lombok.Getter; - -@Getter -public enum KjoennType { - - K(0,"Kvinne"), - M(1, "Mann"), - U(2, "Ukjent"); - - private String beskrivelse; - private Integer hdirType; - - KjoennType(Integer hdirType, String beskrivelse) { - this.hdirType = hdirType; - this.beskrivelse = beskrivelse; - } -} diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/LandkodeEncoder.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/LandkodeEncoder.java deleted file mode 100644 index a889015b0e3..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/LandkodeEncoder.java +++ /dev/null @@ -1,288 +0,0 @@ -package no.nav.testnav.apps.personexportapi.consumer.dto; - -import lombok.experimental.UtilityClass; -import org.bouncycastle.asn1.eac.BidirectionalMap; - -import static java.util.Objects.nonNull; - -@UtilityClass -public class LandkodeEncoder { - - private static final BidirectionalMap landkoderMap = new BidirectionalMap(); - - private static final String DEFAULT = "990"; - - static { //NOSONAR - landkoderMap.put("???", DEFAULT); - landkoderMap.put("ABW", "657"); - landkoderMap.put("AFG", "404"); - landkoderMap.put("AGO", "204"); - landkoderMap.put("AIA", "660"); - landkoderMap.put("ALA", "860"); - landkoderMap.put("ALB", "111"); - landkoderMap.put("AND", "114"); - landkoderMap.put("ANT", "656"); - landkoderMap.put("ARE", "426"); - landkoderMap.put("ARG", "705"); - landkoderMap.put("ARM", "406"); - landkoderMap.put("ASM", "802"); - landkoderMap.put("ATF", "628"); - landkoderMap.put("ATG", "603"); - landkoderMap.put("AUS", "805"); - landkoderMap.put("AUT", "153"); - landkoderMap.put("AZE", "407"); - landkoderMap.put("BDI", "216"); - landkoderMap.put("BEL", "112"); - landkoderMap.put("BEN", "229"); - landkoderMap.put("BES", "659"); - landkoderMap.put("BFA", "393"); - landkoderMap.put("BGD", "410"); - landkoderMap.put("BGR", "113"); - landkoderMap.put("BHR", "409"); - landkoderMap.put("BHS", "605"); - landkoderMap.put("BIH", "155"); - landkoderMap.put("BLM", "687"); - landkoderMap.put("BLR", "120"); - landkoderMap.put("BLZ", "604"); - landkoderMap.put("BMU", "606"); - landkoderMap.put("BOL", "710"); - landkoderMap.put("BRA", "715"); - landkoderMap.put("BRB", "602"); - landkoderMap.put("BRN", "416"); - landkoderMap.put("BTN", "412"); - landkoderMap.put("BVT", "875"); - landkoderMap.put("BWA", "205"); - landkoderMap.put("CAF", "337"); - landkoderMap.put("CAN", "612"); - landkoderMap.put("CCK", "808"); - landkoderMap.put("CHE", "141"); - landkoderMap.put("CHL", "725"); - landkoderMap.put("CHN", "484"); - landkoderMap.put("CIV", "239"); - landkoderMap.put("CMR", "270"); - landkoderMap.put("COD", "279"); - landkoderMap.put("COG", "278"); - landkoderMap.put("COK", "809"); - landkoderMap.put("COL", "730"); - landkoderMap.put("COM", "220"); - landkoderMap.put("CPV", "273"); - landkoderMap.put("CRI", "616"); - landkoderMap.put("CSK", "142"); - landkoderMap.put("CUB", "620"); - landkoderMap.put("CUW", "661"); - landkoderMap.put("CXR", "807"); - landkoderMap.put("CYM", "613"); - landkoderMap.put("CYP", "500"); - landkoderMap.put("CZE", "158"); - landkoderMap.put("DDR", "151"); - landkoderMap.put("DEU", "144"); - landkoderMap.put("DJI", "250"); - landkoderMap.put("DMA", "622"); - landkoderMap.put("DNK", "101"); - landkoderMap.put("DOM", "624"); - landkoderMap.put("DZA", "203"); - landkoderMap.put("ECU", "735"); - landkoderMap.put("EGY", "249"); - landkoderMap.put("ERI", "241"); - landkoderMap.put("ESH", "304"); - landkoderMap.put("ESP", "137"); - landkoderMap.put("EST", "115"); - landkoderMap.put("ETH", "246"); - landkoderMap.put("FIN", "103"); - landkoderMap.put("FJI", "811"); - landkoderMap.put("FLK", "740"); - landkoderMap.put("FRA", "117"); - landkoderMap.put("FRO", "104"); - landkoderMap.put("FSM", "826"); - landkoderMap.put("GAB", "254"); - landkoderMap.put("GBR", "139"); - landkoderMap.put("GEO", "430"); - landkoderMap.put("GGY", "162"); - landkoderMap.put("GHA", "260"); - landkoderMap.put("GIB", "118"); - landkoderMap.put("GIN", "264"); - landkoderMap.put("GLP", "631"); - landkoderMap.put("GMB", "256"); - landkoderMap.put("GNB", "266"); - landkoderMap.put("GNQ", "235"); - landkoderMap.put("GRC", "119"); - landkoderMap.put("GRD", "629"); - landkoderMap.put("GRL", "102"); - landkoderMap.put("GTM", "632"); - landkoderMap.put("GUF", "745"); - landkoderMap.put("GUM", "817"); - landkoderMap.put("GUY", "720"); - landkoderMap.put("HKG", "436"); - landkoderMap.put("HMD", "870"); - landkoderMap.put("HND", "644"); - landkoderMap.put("HRV", "122"); - landkoderMap.put("HTI", "636"); - landkoderMap.put("HUN", "152"); - landkoderMap.put("IDN", "448"); - landkoderMap.put("IMN", "164"); - landkoderMap.put("IND", "444"); - landkoderMap.put("IOT", "213"); - landkoderMap.put("IRL", "121"); - landkoderMap.put("IRN", "456"); - landkoderMap.put("IRQ", "452"); - landkoderMap.put("ISL", "105"); - landkoderMap.put("ISR", "460"); - landkoderMap.put("ITA", "123"); - landkoderMap.put("JAM", "648"); - landkoderMap.put("JEY", "163"); - landkoderMap.put("JOR", "476"); - landkoderMap.put("JPN", "464"); - landkoderMap.put("KAZ", "480"); - landkoderMap.put("KEN", "276"); - landkoderMap.put("KGZ", "502"); - landkoderMap.put("KHM", "478"); - landkoderMap.put("KIR", "815"); - landkoderMap.put("KNA", "677"); - landkoderMap.put("KOR", "492"); - landkoderMap.put("KWT", "496"); - landkoderMap.put("LAO", "504"); - landkoderMap.put("LBN", "508"); - landkoderMap.put("LBR", "283"); - landkoderMap.put("LBY", "286"); - landkoderMap.put("LCA", "678"); - landkoderMap.put("LIE", "128"); - landkoderMap.put("LKA", "424"); - landkoderMap.put("LSO", "281"); - landkoderMap.put("LTU", "136"); - landkoderMap.put("LUX", "129"); - landkoderMap.put("LVA", "124"); - landkoderMap.put("MAC", "510"); - landkoderMap.put("MAF", "686"); - landkoderMap.put("MAR", "303"); - landkoderMap.put("MCO", "130"); - landkoderMap.put("MDA", "138"); - landkoderMap.put("MDG", "289"); - landkoderMap.put("MDV", "513"); - landkoderMap.put("MEX", "652"); - landkoderMap.put("MHL", "835"); - landkoderMap.put("MKD", "156"); - landkoderMap.put("MLI", "299"); - landkoderMap.put("MLT", "126"); - landkoderMap.put("MMR", "420"); - landkoderMap.put("MNE", "160"); - landkoderMap.put("MNG", "516"); - landkoderMap.put("MNP", "840"); - landkoderMap.put("MOZ", "319"); - landkoderMap.put("MRT", "306"); - landkoderMap.put("MSR", "654"); - landkoderMap.put("MTQ", "650"); - landkoderMap.put("MUS", "307"); - landkoderMap.put("MWI", "296"); - landkoderMap.put("MYS", "512"); - landkoderMap.put("MYT", "322"); - landkoderMap.put("NAM", "308"); - landkoderMap.put("NCL", "833"); - landkoderMap.put("NER", "309"); - landkoderMap.put("NFK", "822"); - landkoderMap.put("NGA", "313"); - landkoderMap.put("NIC", "664"); - landkoderMap.put("NIU", "821"); - landkoderMap.put("NLD", "127"); - landkoderMap.put("NOR", "000"); - landkoderMap.put("NPL", "528"); - landkoderMap.put("NRU", "818"); - landkoderMap.put("NZL", "820"); - landkoderMap.put("OMN", "520"); - landkoderMap.put("PAK", "534"); - landkoderMap.put("PAN", "668"); - landkoderMap.put("PCN", "828"); - landkoderMap.put("PER", "760"); - landkoderMap.put("PHL", "428"); - landkoderMap.put("PLW", "839"); - landkoderMap.put("PNG", "827"); - landkoderMap.put("POL", "131"); - landkoderMap.put("PRI", "685"); - landkoderMap.put("PRK", "488"); - landkoderMap.put("PRT", "132"); - landkoderMap.put("PRY", "755"); - landkoderMap.put("PSE", "524"); - landkoderMap.put("PYF", "814"); - landkoderMap.put("QAT", "540"); - landkoderMap.put("REU", "323"); - landkoderMap.put("ROU", "133"); - landkoderMap.put("RUS", "140"); - landkoderMap.put("RWA", "329"); - landkoderMap.put("SAU", "544"); - landkoderMap.put("SCG", "125"); - landkoderMap.put("SDN", "356"); - landkoderMap.put("SEN", "336"); - landkoderMap.put("SGP", "548"); - landkoderMap.put("SGS", "865"); - landkoderMap.put("SHN", "209"); - landkoderMap.put("SJM", "744"); - landkoderMap.put("SLB", "806"); - landkoderMap.put("SLE", "339"); - landkoderMap.put("SLV", "672"); - landkoderMap.put("SMR", "134"); - landkoderMap.put("SOM", "346"); - landkoderMap.put("SPM", "676"); - landkoderMap.put("SRB", "159"); - landkoderMap.put("SSD", "355"); - landkoderMap.put("STP", "333"); - landkoderMap.put("SUN", "135"); - landkoderMap.put("SUR", "765"); - landkoderMap.put("SVK", "157"); - landkoderMap.put("SVN", "146"); - landkoderMap.put("SWE", "106"); - landkoderMap.put("SWZ", "357"); - landkoderMap.put("SXM", "658"); - landkoderMap.put("SYC", "338"); - landkoderMap.put("SYR", "564"); - landkoderMap.put("TCA", "681"); - landkoderMap.put("TCD", "373"); - landkoderMap.put("TGO", "376"); - landkoderMap.put("THA", "568"); - landkoderMap.put("TJK", "550"); - landkoderMap.put("TKL", "829"); - landkoderMap.put("TKM", "552"); - landkoderMap.put("TLS", "537"); - landkoderMap.put("TON", "813"); - landkoderMap.put("TTO", "680"); - landkoderMap.put("TUN", "379"); - landkoderMap.put("TUR", "143"); - landkoderMap.put("TUV", "816"); - landkoderMap.put("TWN", "432"); - landkoderMap.put("TZA", "369"); - landkoderMap.put("UGA", "386"); - landkoderMap.put("UKR", "148"); - landkoderMap.put("UMI", "819"); - landkoderMap.put("URY", "770"); - landkoderMap.put("USA", "684"); - landkoderMap.put("UZB", "554"); - landkoderMap.put("VAT", "154"); - landkoderMap.put("VCT", "679"); - landkoderMap.put("VEN", "775"); - landkoderMap.put("VGB", "608"); - landkoderMap.put("VIR", "601"); - landkoderMap.put("VNM", "575"); - landkoderMap.put("VUT", "812"); - landkoderMap.put("WAK", "831"); - landkoderMap.put("WLF", "832"); - landkoderMap.put("WSM", "830"); - landkoderMap.put("XXK", "161"); - landkoderMap.put("XXX", "980"); - landkoderMap.put("YEM", "578"); - landkoderMap.put("YUG", "925"); - landkoderMap.put("ZAF", "359"); - landkoderMap.put("ZMB", "389"); - landkoderMap.put("ZWE", "326"); - landkoderMap.put("349", "349"); - landkoderMap.put("546", "546"); - landkoderMap.put("556", "556"); - landkoderMap.put("669", "669"); - } - - public static String encode(String statsborgerskap) { - return (String) landkoderMap.getOrDefault(statsborgerskap, DEFAULT); - } - - public static String decode(String statsborgerskap) { - return nonNull(landkoderMap.getReverse(statsborgerskap)) ? - (String) landkoderMap.getReverse(statsborgerskap) : "???"; - } -} diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/PersonStatusMapper.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/PersonStatusMapper.java deleted file mode 100644 index 33c38b71841..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/PersonStatusMapper.java +++ /dev/null @@ -1,54 +0,0 @@ -package no.nav.testnav.apps.personexportapi.consumer.dto; - -import lombok.experimental.UtilityClass; -import no.nav.testnav.apps.personexportapi.domain.Person; - -@UtilityClass -public class PersonStatusMapper { - - public static String getPersonstatus(Person person) { - - if (person.isFnr()) { - switch (person.getPersonstatus()) { - - case "1": - return "Bosatt"; - case "2": - return "Utflyttet (ikke i bruk)"; - case "3": - return "Utvandret"; - case "4": - return "Forsvunnet"; - case "5": - return "Død"; - case "6": - return "Utgått fødselsnummer"; - case "7": - return "Fødselsregistrert"; - case "8": - return "Annullert tilgang"; - case "9": - return "Uregistrert person"; - default: - return null; - } - - } else { - switch (person.getPersonstatus()) { - - case "2": - return "I bruk"; - case "5": - return "Utgått, link til fødselsnummer"; - case "6": - return "Utgått, dublett"; - case "7": - return "Utgått, avgang"; - case "9": - return "Utgått, korrigert til nytt D-nummer"; - default: - return null; - } - } - } -} \ No newline at end of file diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/Sivilstatus.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/Sivilstatus.java deleted file mode 100644 index 51a7f5d4d91..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/dto/Sivilstatus.java +++ /dev/null @@ -1,44 +0,0 @@ -package no.nav.testnav.apps.personexportapi.consumer.dto; - -import java.util.HashMap; -import java.util.Map; - -import lombok.Getter; - -@Getter -public enum Sivilstatus { - - UGIFT("1", "UGIF"), - GIFT("2", "GIFT"), - ENKE_ELLER_ENKEMANN("3", "ENKE"), - SKILT("4", "SKIL"), - SEPARERT("5", "SEPR"), - REGISTRERT_PARTNER("6", "REPA"), - SEPARERT_PARTNER("7", "SEPA"), - SKILT_PARTNER("8", "SKPA"), - GJENLEVENDE_PARTNER("9", "GJPA"); - - private static Map map = new HashMap<>(); - - static { - for (Sivilstatus sivilstatus : Sivilstatus.values()) { - map.put(sivilstatus.sivilstandKode, sivilstatus); - } - } - - private final String sivilstandKode; - private final String kodeverkskode; - - Sivilstatus(final String sivilstandKode, String kodeverkkode) { - this.sivilstandKode = sivilstandKode; - this.kodeverkskode = kodeverkkode; - } - - public static Sivilstatus lookup(String sivilstatusKode) { - return map.getOrDefault(sivilstatusKode, UGIFT); - } - - public static boolean exists(String kodeverkkode) { - return map.containsKey(kodeverkkode); - } -} diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/response/KodeverkBetydningerResponse.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/response/KodeverkBetydningerResponse.java deleted file mode 100644 index 45641b68282..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/consumer/response/KodeverkBetydningerResponse.java +++ /dev/null @@ -1,57 +0,0 @@ -package no.nav.testnav.apps.personexportapi.consumer.response; - -import static java.util.Objects.isNull; - -import java.time.LocalDate; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class KodeverkBetydningerResponse { - - private Map> betydninger; - - public Map> getBetydninger() { - if (isNull(betydninger)) { - betydninger = new HashMap<>(); - } - return this.betydninger; - } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - public static class Betydning { - - private LocalDate gyldigFra; - private LocalDate gyldigTil; - private Map beskrivelser; - - public Map getBeskrivelser() { - if (isNull(beskrivelser)) { - beskrivelser = new HashMap<>(); - } - return beskrivelser; - } - } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - public static class Beskrivelse { - - private String term; - private String tekst; - } -} diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/converter/csv/HelsenettCsvConverter.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/converter/csv/HelsenettCsvConverter.java deleted file mode 100644 index ac5ea3e1086..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/converter/csv/HelsenettCsvConverter.java +++ /dev/null @@ -1,145 +0,0 @@ -package no.nav.testnav.apps.personexportapi.converter.csv; - -import java.util.HashMap; -import java.util.Map; - -import no.nav.testnav.apps.personexportapi.consumer.dto.PersonStatusMapper; -import no.nav.testnav.apps.personexportapi.consumer.KodeverkConsumer; -import no.nav.testnav.apps.personexportapi.domain.Person; -import org.springframework.stereotype.Service; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.testnav.libs.csvconverter.CsvConverter; -import no.nav.testnav.libs.csvconverter.CsvHeader; -import no.nav.testnav.libs.csvconverter.ObjectConverter; -import no.nav.testnav.libs.csvconverter.RowConverter; - -@Slf4j -@Service -@RequiredArgsConstructor -public class HelsenettCsvConverter extends CsvConverter { - - private static final String LANDKODER = "Landkoder"; - - private final KodeverkConsumer kodeverkConsumer; - - private enum Headers implements CsvHeader { - FNR("FNR"), - KORTNAVN("KORTNAVN"), - FORNAVN("FORNAVN"), - MELLOMNAVN("MELLOMNAVN"), - ETTERNAVN("ETTERNAVN"), - PIKENAVN("PIKENAVN"), - KJONN("KJONN"), - BESKR_KJONN("BESKR_KJONN"), - FODT_DATO("FODT_DATO"), - DOD_DATO("DOD_DATO"), - PERSONSTATUS("PERSONSTATUS"), - BESKR_PERSONSTATUS("BESKR_PERSONSTATUS"), - PERSONSTATUS_DATO("PERSONSTATUS_DATO"), - SIVILSTAND("SIVILSTAND"), - BESKR_SIVILSTAND("BESKR_SIVILSTAND"), - SIVILSTAND_DATO("SIVILSTAND_DATO"), - STATSBORGERLAND("STATSBORGERLAND"), - STATSBORGER_DATO("STATSBORGER_DATO"), - GATENAVN("GATENAVN"), - CO_ADRESSE("CO_ADRESSE"), - HUSNR("HUSNR"), - HUSBOKSTAV("HUSBOKSTAV"), - BOLIGNR("BOLIGNR"), - GATENR("GATENR"), - GARDSNR("GARDSNR"), - BRUKSNR("BRUKSNR"), - STEDSNAVN("STEDSNAVN"), - KOMMUNENR("KOMMUNENR"), - KOMMUNE("KOMMUNE"), - DATO_ADR_FRA("DATO_ADR_FRA"), - ADRESSEKODE("ADRESSEKODE"), - REG_DATO_ADR_KD("REG_DATO_ADR_KD"), - POSTADR_1("POSTADR_1"), - POSTADR_2("POSTADR_2"), - POSTADR_3("POSTADR_3"), - POSTNR("POSTNR"), - POSTSTED("POSTSTED"), - POSTADR_REG_DATO("POSTADR_REG_DATO"), - POSTADR_LAND("POSTADR_LAND"), - BYDEL("BYDEL"), - BYDELS_NAVN("BYDELS_NAVN"), - INNVANDRET_FRA_LAND("INNVANDRET_FRA_LAND"), - INNVANDRET_DATO("INNVANDRET_DATO"), - UTVANDRET_TIL_LAND("UTVANDRET_TIL_LAND"), - UTVANDRET_DATO("UTVANDRET_DATO"), - SKOLEKRETS("SKOLEKRETS"), - VALGKRETS("VALGKRETS"), - GRUNNKRETS("GRUNNKRETS"); - - private final String header; - - Headers(String header) { - this.header = header; - } - - @Override - public String getValue() { - return header; - } - } - - @Override - protected RowConverter getRowConverter() { - throw new UnsupportedOperationException("Import av person ikke stottet"); - } - - @Override - protected ObjectConverter getObjectConverter() { - return person -> { - Map map = new HashMap<>(); - map.put(Headers.FNR.getValue(), person.getIdent()); - map.put(Headers.FORNAVN.getValue(), person.getFornavn()); - map.put(Headers.MELLOMNAVN.getValue(), person.getMellomnavn()); - map.put(Headers.ETTERNAVN.getValue(), person.getEtternavn()); - map.put(Headers.PERSONSTATUS.getValue(), person.getPersonstatus()); - map.put(Headers.BESKR_PERSONSTATUS.getValue(), PersonStatusMapper.getPersonstatus(person)); - map.put(Headers.ADRESSEKODE.getValue(), person.getAdressetype()); - map.put(Headers.GATENAVN.getValue(), person.getGatenavn()); - map.put(Headers.GATENR.getValue(), person.getGatenr()); - map.put(Headers.HUSNR.getValue(), person.getHusnr()); - map.put(Headers.HUSBOKSTAV.getValue(), person.getHusbokstav()); - map.put(Headers.STEDSNAVN.getValue(), person.getGaardsnavn()); - map.put(Headers.GARDSNR.getValue(), person.getGaardsnr()); - map.put(Headers.BRUKSNR.getValue(), person.getBruksnr()); - map.put(Headers.BOLIGNR.getValue(), person.getBolignr()); - map.put(Headers.CO_ADRESSE.getValue(), person.getTilleggsadresse()); - map.put(Headers.POSTNR.getValue(), person.getPostnummer()); - map.put(Headers.POSTSTED.getValue(), kodeverkConsumer.getKodeverkOppslag("Postnummer", person.getPostnummer())); - map.put(Headers.KOMMUNENR.getValue(), person.getKommunenr()); - map.put(Headers.KOMMUNE.getValue(), kodeverkConsumer.getKodeverkOppslag("Kommuner", person.getKommunenr())); - map.put(Headers.DATO_ADR_FRA.getValue(), person.getFlyttedato()); - map.put(Headers.POSTADR_1.getValue(), person.getAdresse1()); - map.put(Headers.POSTADR_2.getValue(), person.getAdresse2()); - map.put(Headers.POSTADR_3.getValue(), person.getAdresse3()); - map.put(Headers.POSTADR_LAND.getValue(), kodeverkConsumer.getKodeverkOppslag(LANDKODER, person.getPostadrLand())); - map.put(Headers.FODT_DATO.getValue(), person.getFoedselsdato()); - map.put(Headers.KJONN.getValue(), person.getKjoenn()); - map.put(Headers.BESKR_KJONN.getValue(), person.getKjoennBeskrivelse()); - map.put(Headers.SIVILSTAND.getValue(), person.getSivilstand()); - map.put(Headers.BESKR_SIVILSTAND.getValue(), kodeverkConsumer.getKodeverkOppslag("Sivilstander", person.getSivilstandBeskrivelse())); - map.put(Headers.SIVILSTAND_DATO.getValue(), person.getSivilstandRegdato()); - map.put(Headers.STATSBORGERLAND.getValue(), kodeverkConsumer.getKodeverkOppslag(LANDKODER, person.getStatsborgerskap())); - map.put(Headers.STATSBORGER_DATO.getValue(), person.getStatsborgerskapRegdato()); - map.put(Headers.INNVANDRET_FRA_LAND.getValue(), kodeverkConsumer.getKodeverkOppslag(LANDKODER, person.getInnvandretFraLand())); - map.put(Headers.INNVANDRET_DATO.getValue(), person.getInvandretFraLandFlyttedato()); - map.put(Headers.UTVANDRET_TIL_LAND.getValue(), kodeverkConsumer.getKodeverkOppslag(LANDKODER, person.getUtvandretTilLand())); - map.put(Headers.UTVANDRET_DATO.getValue(), person.getUtvandretTilLandFlyttedato()); - - log.info(person.toString()); - return map; - }; - } - - @Override - protected CsvHeader[] getHeaders() { - return Headers.values(); - } -} diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/domain/Person.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/domain/Person.java deleted file mode 100644 index 1d56430e90e..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/domain/Person.java +++ /dev/null @@ -1,205 +0,0 @@ -package no.nav.testnav.apps.personexportapi.domain; - -import static java.lang.Integer.parseInt; -import static java.lang.String.format; -import static java.util.Objects.nonNull; -import static org.apache.logging.log4j.util.Strings.isNotBlank; - -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; -import java.time.temporal.ChronoUnit; -import com.fasterxml.jackson.annotation.JsonIgnore; - -import no.nav.testnav.apps.personexportapi.consumer.dto.EndringsmeldingDTO; -import no.nav.testnav.apps.personexportapi.consumer.dto.FoedselsdatoFraIdent; -import no.nav.testnav.apps.personexportapi.consumer.dto.HusbokstavEncoder; -import no.nav.testnav.apps.personexportapi.consumer.dto.KjoennFraIdent; -import no.nav.testnav.apps.personexportapi.consumer.dto.LandkodeEncoder; -import no.nav.testnav.apps.personexportapi.consumer.dto.Sivilstatus; - -public class Person { - - private static final DateTimeFormatter TPS_DATE_FMT = DateTimeFormatter.ofPattern("yyyyMMdd"); - private static final int MYNDIGHET_ALDER = 18; - - private final EndringsmeldingDTO endringsmeldingDTO; - private final String page; - - public Person(EndringsmeldingDTO endringsmeldingDTO, String page) { - this.endringsmeldingDTO = endringsmeldingDTO; - this.page = page; - } - - public String getPage() { - return page; - } - - public String getIdent() { - return endringsmeldingDTO.getFodselsdato() + endringsmeldingDTO.getPersonnummer(); - } - - public String getFornavn() { - return endringsmeldingDTO.getFornavn(); - } - - public String getMellomnavn() { - return isNotBlank(endringsmeldingDTO.getMellomnavn()) ? endringsmeldingDTO.getMellomnavn() : null; - } - - public String getEtternavn() { - return endringsmeldingDTO.getSlektsnavn(); - } - - public String getAdressetype() { - return endringsmeldingDTO.getSpesRegType(); - } - - public String getGatenavn() { - return endringsmeldingDTO.isGateadresse() ? endringsmeldingDTO.getAdressenavn() : null; - } - - public String getGaardsnavn() { - return endringsmeldingDTO.isMatrikkeladresse() ? endringsmeldingDTO.getAdressenavn() : null; - } - - public String getHusnr() { - return endringsmeldingDTO.isGateadresse() ? endringsmeldingDTO.getHusBruk() : null; - } - - public String getHusbokstav() { - return endringsmeldingDTO.isGateadresse() ? HusbokstavEncoder.decode(endringsmeldingDTO.getBokstavFestenr()) : null; - } - - public String getGatenr() { - return endringsmeldingDTO.isGateadresse() ? endringsmeldingDTO.getGateGaard() : null; - } - - public String getGaardsnr() { - return endringsmeldingDTO.isMatrikkeladresse() ? endringsmeldingDTO.getGateGaard() : null; - } - - public String getBruksnr() { - return endringsmeldingDTO.isMatrikkeladresse() ? endringsmeldingDTO.getHusBruk() : null; - } - - public String getBolignr() { - return isNotBlank(endringsmeldingDTO.getBolignr()) ? endringsmeldingDTO.getBolignr() : null; - } - - public Object getTilleggsadresse() { - return isNotBlank(endringsmeldingDTO.getTilleggsadresse()) ? endringsmeldingDTO.getTilleggsadresse() : null; - } - - public String getPostnummer() { - return isNotBlank(endringsmeldingDTO.getPostnummer()) ? endringsmeldingDTO.getPostnummer() : null; - } - - public String getKommunenr() { - return isNotBlank(endringsmeldingDTO.getKommunenummer()) ? endringsmeldingDTO.getKommunenummer() : null; - } - - public String getFlyttedato() { - return formatDate(endringsmeldingDTO.getFlyttedatoAdr()); - } - - public String getAdresse1() { - return isNotBlank(endringsmeldingDTO.getAdresse1()) ? endringsmeldingDTO.getAdresse1() : null; - } - - public String getAdresse2() { - return isNotBlank(endringsmeldingDTO.getAdresse2()) ? endringsmeldingDTO.getAdresse2() : null; - } - - public String getAdresse3() { - return isNotBlank(endringsmeldingDTO.getAdresse3()) ? endringsmeldingDTO.getAdresse3() : null; - } - - public String getPostadrLand() { - return isNotBlank(endringsmeldingDTO.getPostadrLand()) ? LandkodeEncoder.decode(endringsmeldingDTO.getPostadrLand()) : null; - } - - public String getPersonstatus() { - return isNotBlank(endringsmeldingDTO.getStatuskode()) ? endringsmeldingDTO.getStatuskode() : null; - } - - public String getFoedselsdato() { - return FoedselsdatoFraIdent.getFoedselsdato(getIdent()).format(DateTimeFormatter.ISO_DATE); - } - - public Integer getKjoenn() { - return KjoennFraIdent.getKjoenn(getIdent()).getHdirType(); - } - - public String getKjoennBeskrivelse() { - return KjoennFraIdent.getKjoenn(getIdent()).getBeskrivelse(); - } - - public String getSivilstand() { - if (!isMyndig()) { - return null; - } else { - return isNotBlank(endringsmeldingDTO.getSivilstand()) ? - endringsmeldingDTO.getSivilstand() : "0"; - } - } - - public String getSivilstandBeskrivelse() { - return nonNull(getSivilstand()) ? Sivilstatus.lookup(getSivilstand()).getKodeverkskode() : null; - } - - public String getSivilstandRegdato() { - return formatDate(endringsmeldingDTO.getRegdatoSivilstand()); - } - - public String getStatsborgerskap() { - return isNotBlank(endringsmeldingDTO.getStatsborgerskap()) ? LandkodeEncoder.decode(endringsmeldingDTO.getStatsborgerskap()) : null; - } - - public String getStatsborgerskapRegdato() { - return formatDate(endringsmeldingDTO.getRegdatoStatsb()); - } - - public String getInnvandretFraLand() { - return isNotBlank(endringsmeldingDTO.getInnvandretFraLand()) ? LandkodeEncoder.decode(endringsmeldingDTO.getInnvandretFraLand()) : null; - } - - public String getInvandretFraLandFlyttedato() { - return formatDate(endringsmeldingDTO.getFraLandFlyttedato()); - } - - public String getUtvandretTilLand() { - return isNotBlank(endringsmeldingDTO.getUtvandretTilLand()) ? LandkodeEncoder.decode(endringsmeldingDTO.getUtvandretTilLand()) : null; - } - - public String getUtvandretTilLandFlyttedato() { - return formatDate(endringsmeldingDTO.getTilLandFlyttedato()); - } - - @JsonIgnore - public boolean isFnr() { - return parseInt(Character.toString(endringsmeldingDTO.getFodselsdato().charAt(0))) < 4; - } - - @Override - public String toString() { - return format("Page: %s fnr: %s", getPage(), getIdent()); - } - - private static String formatDate(String tpsDato) { - - try { - return isNotBlank(tpsDato) ? - LocalDate.parse(tpsDato, TPS_DATE_FMT) - .format(DateTimeFormatter.ISO_DATE) : null; - } catch (DateTimeParseException e){ - return null; - } - } - - private boolean isMyndig() { - return ChronoUnit.YEARS.between( - FoedselsdatoFraIdent.getFoedselsdato(getIdent()).toLocalDate(), - LocalDate.now()) > MYNDIGHET_ALDER; - } -} \ No newline at end of file diff --git a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/provider/PersonExportController.java b/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/provider/PersonExportController.java deleted file mode 100644 index 15f57615923..00000000000 --- a/apps/person-export-api/src/main/java/no/nav/testnav/apps/personexportapi/provider/PersonExportController.java +++ /dev/null @@ -1,72 +0,0 @@ -package no.nav.testnav.apps.personexportapi.provider; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.PrintWriter; -import java.time.LocalDateTime; -import java.util.List; -import jakarta.servlet.http.HttpServletResponse; - -import no.nav.testnav.apps.personexportapi.adapter.SlackAdapter; -import no.nav.testnav.apps.personexportapi.consumer.TpsfConsumer; -import no.nav.testnav.apps.personexportapi.converter.csv.HelsenettCsvConverter; -import no.nav.testnav.apps.personexportapi.domain.Person; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@RestController -@RequiredArgsConstructor -@RequestMapping("/api/v1/personer") -public class PersonExportController { - - private final TpsfConsumer consumer; - private final SlackAdapter slackAdapter; - private final HttpServletResponse response; - private final HelsenettCsvConverter helsenettCsvConverter; - - @GetMapping(value = "/nhn/{avspillingsgruppe}") - public void exportHelsenettFormat(@PathVariable("avspillingsgruppe") String avspillingsgruppe) throws IOException { - - long startTime = System.nanoTime(); - - List personer = consumer.getPersoner(avspillingsgruppe); - log.info("Eksporterer {} personer til csv til Slack", personer.size()); - - ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); - PrintWriter pw = new PrintWriter(byteStream); - - helsenettCsvConverter.write(pw, personer); - slackAdapter.uploadFile( - byteStream.toByteArray(), - "testnorge-personer-nhn-" + LocalDateTime.now().toString() + ".csv" - ); - -// log.info("Eksporterer {} personer til http response", personer.size()); -// response.setContentType("text/csv"); -// response.setCharacterEncoding(StandardCharsets.UTF_8.toString()); -// response.setHeader( -// "Content-Disposition", -// "attachment; filename=testnorge-personer-nhn-" + LocalDateTime.now().toString() + ".csv" -// ); -// helsenettCsvConverter.write(response.getWriter(), personer); - - log.info("Medgaatt tid til uttrekk {} ", getReadableTime(System.nanoTime() - startTime)); - } - - private static String getReadableTime(Long nanos) { - - long tempSec = nanos / (1000 * 1000 * 1000); - long sec = tempSec % 60; - long min = (tempSec / 60) % 60; - long hour = (tempSec / (60 * 60)) % 24; - long day = (tempSec / (24 * 60 * 60)) % 24; - - return String.format("%dd %dh %dm %ds", day, hour, min, sec); - } -} diff --git a/apps/person-export-api/src/main/resources/application.yml b/apps/person-export-api/src/main/resources/application.yml deleted file mode 100644 index 13443ecdb4b..00000000000 --- a/apps/person-export-api/src/main/resources/application.yml +++ /dev/null @@ -1,60 +0,0 @@ -AAD_ISSUER_URI: https://login.microsoftonline.com/62366534-1ec3-4962-8869-9b5535279d0b - -consumers: - tps-forvalter: - url: https://tps-forvalteren-proxy.dev-fss-pub.nais.io - cluster: dev-fss - namespace: dolly - name: tps-forvalteren-proxy - threads: 5 - slack: - token: ${SLACK_TOKEN} - channel: ${SLACK_CHANNEL} - baseUrl: https://slack.com - kodeverk: - url: https://testnav-kodeverk-proxy.dev-fss-pub.nais.io - cluster: dev-fss - namespace: dolly - name: testnav-kodeverk-proxy - -spring: - application: - version: application.version.todo //TODO Finn ut hvordan denne kan settes fra gradle - name: testnav-person-export-api - description: Api for å eksportere personer. - security: - oauth2: - resourceserver: - aad: - issuer-uri: ${AAD_ISSUER_URI}/v2.0 - jwk-set-uri: ${AAD_ISSUER_URI}/discovery/v2.0/keys - accepted-audience: ${azure.app.client.id}, api://${azure.app.client.id} - tokenx: - issuer-uri: https://tokenx.dev-gcp.nav.cloud.nais.io - jwk-set-uri: https://tokenx.dev-gcp.nav.cloud.nais.io/jwks - accepted-audience: dev-gcp:dolly:testnav-person-export-api - -springdoc: - swagger-ui: - disable-swagger-default-url: true - url: /v3/api-docs - -management: - endpoints: - enabled-by-default: true - web: - base-path: /internal - exposure.include: prometheus,heapdump,health - path-mapping: - prometheus: metrics - endpoint: - prometheus.enabled: true - heapdump.enabled: true - prometheus: - metrics: - export: - enabled: true -server: - servlet: - encoding: - charset: UTF-8 \ No newline at end of file diff --git a/apps/person-export-api/src/main/resources/bootstrap.yml b/apps/person-export-api/src/main/resources/bootstrap.yml deleted file mode 100644 index 0451449ca23..00000000000 --- a/apps/person-export-api/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,4 +0,0 @@ -spring: - cloud: - vault: - enabled: false \ No newline at end of file diff --git a/apps/person-export-api/src/main/resources/logback-spring.xml b/apps/person-export-api/src/main/resources/logback-spring.xml deleted file mode 100644 index 1a9ce7a5e5c..00000000000 --- a/apps/person-export-api/src/main/resources/logback-spring.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - true - 256 - 10280 - 20 - ^sun\.reflect\..*\.invoke - ^net\.sf\.cglib\.proxy\.MethodProxy\.invoke - java\.util\.concurrent\..* - org\.apache\.catalina\..* - org\.apache\.coyote\..* - org\.apache\.tomcat\..* - - - - - - - - - - - - - %d{HH:mm:ss.SSS} | %5p | %logger{25} | %m%n - - utf8 - - - - - - - - - \ No newline at end of file diff --git a/apps/person-export-api/src/test/java/no/nav/testnav/apps/personexportapi/ApplicationContextTest.java b/apps/person-export-api/src/test/java/no/nav/testnav/apps/personexportapi/ApplicationContextTest.java deleted file mode 100644 index 6c91d039476..00000000000 --- a/apps/person-export-api/src/test/java/no/nav/testnav/apps/personexportapi/ApplicationContextTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package no.nav.testnav.apps.personexportapi; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.security.oauth2.jwt.JwtDecoder; -import org.springframework.test.context.ActiveProfiles; - -@SpringBootTest -@ActiveProfiles("test") -class ApplicationContextTest { - - @MockBean - public JwtDecoder jwtDecoder; - - @Test - @SuppressWarnings("java:S2699") - void load_app_context() { - } -} diff --git a/apps/person-export-api/src/test/resources/application-test.yml b/apps/person-export-api/src/test/resources/application-test.yml deleted file mode 100644 index 1ecf6903fdd..00000000000 --- a/apps/person-export-api/src/test/resources/application-test.yml +++ /dev/null @@ -1,27 +0,0 @@ -spring: - cloud: - vault: - enabled: false - -azure: - app: - client: - id: dummy - secret: dummy - -consumers: - tps-forvalter: - url: http://localhost:${wiremock.server.port:0}/tpsf - cluster: dev-fss - namespace: dolly - name: tps-forvalteren-proxy - threads: 5 - slack: - token: dummy - channel: dummy - baseUrl: dummy - kodeverk: - url: http://localhost:${wiremock.server.port:0}/kodeverk - cluster: dev-fss - namespace: dolly - name: testnav-kodeverk-proxy \ No newline at end of file diff --git a/apps/testnorge-statisk-data-forvalter/README.md b/apps/testnorge-statisk-data-forvalter/README.md index 56e5fdbe6bf..095836cca16 100644 --- a/apps/testnorge-statisk-data-forvalter/README.md +++ b/apps/testnorge-statisk-data-forvalter/README.md @@ -10,7 +10,7 @@ Statisk data forvalter er en applikasjon som har som ansvar å forvalte faste te Denne applikasjonen belager seg på flere andre applikasjoner for å kunne legge inn data. ## Statiske data - +Integrasjonen mot TPSF og TPS er fjernet men ikke oppdatert i figur: ![Faste data flowchart](./doc/images/Faste%20data%20flowchart.png "Faste data flowchart") @@ -53,11 +53,5 @@ Ha naisdevice kjørende og kjør StatiskDataForvalterApplicationStarter med føl -Dspring.cloud.vault.token=[kopier token fra vault] -Dspring.profiles.active=local ``` -NB! Applikasjonen starter på port 4390. Swagger på [http://localhost:4390/swagger](http://localhost:4390/swagger). +Swagger på [http://localhost:8080/swagger](http://localhost:4390/swagger). -### Utviklerimage -I utviklerimage brukes ikke naisdevice og du må legge til følgende ekstra argumenter: -``` --Djavax.net.ssl.trustStore=[path til lokal truststore] --Djavax.net.ssl.trustStorePassword=[passord til lokal truststore] -``` diff --git a/apps/testnorge-statisk-data-forvalter/config.yml b/apps/testnorge-statisk-data-forvalter/config.yml index 208224c162d..5b0c22890ba 100644 --- a/apps/testnorge-statisk-data-forvalter/config.yml +++ b/apps/testnorge-statisk-data-forvalter/config.yml @@ -53,12 +53,6 @@ spec: cluster: dev-gcp outbound: rules: - - application: testnorge-hodejegeren - cluster: dev-fss - - application: testnorge-tp - cluster: dev-fss - - application: testnav-person-service - cluster: dev-gcp - application: generer-navn-service cluster: dev-gcp - application: testnav-organisasjon-service @@ -67,8 +61,6 @@ spec: cluster: dev-gcp - application: testnav-person-faste-data-service cluster: dev-gcp - - application: tps-forvalteren-proxy - cluster: dev-fss - application: krr-stub - application: synthdata-aareg cluster: dev-fss diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/StatiskDataForvalterApplicationStarter.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/StatiskDataForvalterApplicationStarter.java index ec18571f48a..1caf883368d 100644 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/StatiskDataForvalterApplicationStarter.java +++ b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/StatiskDataForvalterApplicationStarter.java @@ -1,11 +1,10 @@ package no.nav.registre.sdforvalter; import lombok.extern.slf4j.Slf4j; +import no.nav.registre.sdforvalter.util.VaultUtil; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import no.nav.registre.sdforvalter.util.VaultUtil; - @Slf4j @SpringBootApplication public class StatiskDataForvalterApplicationStarter { @@ -17,4 +16,4 @@ public static void main(String[] args) { SpringApplication.run(StatiskDataForvalterApplicationStarter.class, args); } -} +} \ No newline at end of file diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/adapter/TpsIdentTagAdapter.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/adapter/TpsIdentTagAdapter.java deleted file mode 100644 index 194423b8668..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/adapter/TpsIdentTagAdapter.java +++ /dev/null @@ -1,30 +0,0 @@ -package no.nav.registre.sdforvalter.adapter; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -import java.util.List; - -import no.nav.registre.sdforvalter.database.model.TagModel; -import no.nav.registre.sdforvalter.database.model.TpsIdentTagModel; -import no.nav.registre.sdforvalter.database.repository.TpsIdentTagRepository; - -@Component -@RequiredArgsConstructor -public class TpsIdentTagAdapter { - private final TpsIdentTagRepository identTagRepository; - - public TpsIdentTagModel save(TpsIdentTagModel model) { - return identTagRepository - .findBy(model.getIdent().getFnr(), model.getTag().getTag()) - .orElseGet(() -> identTagRepository.save(model)); - } - - public List findAllTagsByIdent(String ident) { - return identTagRepository - .findAllByIdent(ident) - .stream() - .map(TpsIdentTagModel::getTag) - .toList(); - } -} diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/adapter/TpsIdenterAdapter.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/adapter/TpsIdenterAdapter.java deleted file mode 100644 index 4f7e44f0b98..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/adapter/TpsIdenterAdapter.java +++ /dev/null @@ -1,101 +0,0 @@ -package no.nav.registre.sdforvalter.adapter; - -import lombok.extern.slf4j.Slf4j; -import no.nav.registre.sdforvalter.database.model.TagModel; -import no.nav.registre.sdforvalter.database.model.TpsIdentModel; -import no.nav.registre.sdforvalter.database.model.TpsIdentTagModel; -import no.nav.registre.sdforvalter.database.repository.TpsIdenterRepository; -import no.nav.registre.sdforvalter.domain.TpsIdent; -import no.nav.registre.sdforvalter.domain.TpsIdentListe; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.stream.StreamSupport; - -@Slf4j -@Component -public class TpsIdenterAdapter extends FasteDataAdapter { - private final TpsIdenterRepository tpsIdenterRepository; - private final TpsIdentTagAdapter tpsIdentTagAdapter; - private final TagsAdapter tagsAdapter; - - public TpsIdenterAdapter( - OpprinnelseAdapter opprinnelseAdapter, - GruppeAdapter gruppeAdapter, - TpsIdenterRepository tpsIdenterRepository, - TpsIdentTagAdapter tpsIdentTagAdapter, - TagsAdapter tagsAdapter - ) { - super(opprinnelseAdapter, gruppeAdapter); - this.tpsIdenterRepository = tpsIdenterRepository; - this.tpsIdentTagAdapter = tpsIdentTagAdapter; - this.tagsAdapter = tagsAdapter; - } - - private TpsIdentListe fetch() { - List list = StreamSupport - .stream(tpsIdenterRepository.findAll().spliterator(), false) - .map(value -> new TpsIdent( - value, - tpsIdentTagAdapter.findAllTagsByIdent(value.getFnr()) - )).toList(); - return new TpsIdentListe(list); - } - - - public TpsIdentListe fetchAll() { - var tpsIdentModels = StreamSupport.stream(tpsIdenterRepository.findAll().spliterator(), false); - List liste = tpsIdentModels.map(tpsIdentModel -> { - List tagModels = fetchTagsByIdent(tpsIdentModel.getFnr()); - return new TpsIdent(tpsIdentModel, tagModels); - }).toList(); - return new TpsIdentListe(liste); - } - - public TpsIdentListe fetchBy(String gruppe) { - log.info("Henter tps identer med gruppe {}", gruppe); - - List tpsIdentModels = tpsIdenterRepository.findByGruppeModel(getGruppe(gruppe)); - List liste = tpsIdentModels.stream().map(tpsIdentModel -> { - List tagModels = fetchTagsByIdent(tpsIdentModel.getFnr()); - return new TpsIdent(tpsIdentModel, tagModels); - }).toList(); - - log.info("Fant {} personer fra gruppe {}", liste.size(), gruppe); - return new TpsIdentListe(liste); - } - - public TpsIdent fetchByIdent(String ident) { - log.info("Henter tps-ident {}", ident); - var tpsIdent = tpsIdenterRepository.findByFnr(ident); - var tags = fetchTagsByIdent(ident); - return tpsIdent != null ? new TpsIdent(tpsIdent, tags) : null; - } - - public List fetchTagsByIdent(String ident) { - return tpsIdentTagAdapter.findAllTagsByIdent(ident); - } - - public TpsIdentListe save(TpsIdentListe liste) { - List list = liste.itemsNotIn(fetch()); - if (list.isEmpty()) { - return new TpsIdentListe(); - } - - List tpsIdents = new ArrayList<>(); - - for (TpsIdent tpsIdent : list) { - var opprinnelse = getOpprinnelse(tpsIdent); - var gruppe = getGruppe(tpsIdent); - TpsIdentModel tpsIdentModel = tpsIdenterRepository.save(new TpsIdentModel(tpsIdent, opprinnelse, gruppe)); - List tagModels = tpsIdent.getTags() == null ? Collections.emptyList() : tpsIdent.getTags().stream().map(tagsAdapter::save).toList(); - tagModels.forEach(tagModel -> tpsIdentTagAdapter.save( - new TpsIdentTagModel(null, tpsIdentModel, tagModel) - )); - tpsIdents.add(new TpsIdent(tpsIdentModel, tagModels)); - } - return new TpsIdentListe(tpsIdents); - } -} diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/config/Consumers.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/config/Consumers.java index e7fe0e1b255..5e896dde510 100644 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/config/Consumers.java +++ b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/config/Consumers.java @@ -26,13 +26,8 @@ public class Consumers { private ServerProperties testnavAaregProxy; private ServerProperties genererNavnService; - private ServerProperties testnorgeHodejegeren; private ServerProperties kodeverk; private ServerProperties testnavOrganisasjonFasteDataService; private ServerProperties testnavOrganisasjonService; private ServerProperties testnavPersonFasteDataService; - private ServerProperties person; - private ServerProperties testnorgeTp; - private ServerProperties tpsForvalterenProxy; - } diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/hodejegeren/HodejegerenConsumer.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/hodejegeren/HodejegerenConsumer.java deleted file mode 100644 index d37b86bcca5..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/hodejegeren/HodejegerenConsumer.java +++ /dev/null @@ -1,50 +0,0 @@ -package no.nav.registre.sdforvalter.consumer.rs.hodejegeren; - -import lombok.extern.slf4j.Slf4j; -import no.nav.registre.sdforvalter.config.Consumers; -import no.nav.registre.sdforvalter.consumer.rs.hodejegeren.command.GetAlleIdenterCommand; -import no.nav.registre.sdforvalter.consumer.rs.hodejegeren.command.GetLevendeIdenterCommand; -import no.nav.testnav.libs.securitycore.domain.ServerProperties; -import no.nav.testnav.libs.servletsecurity.exchange.TokenExchange; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.client.WebClient; - -import java.util.List; - -@Slf4j -@Component -public class HodejegerenConsumer { - - private final WebClient webClient; - private final TokenExchange tokenExchange; - private final ServerProperties serverProperties; - - public HodejegerenConsumer( - Consumers consumers, - TokenExchange tokenExchange - ) { - serverProperties = consumers.getTestnorgeHodejegeren(); - this.tokenExchange = tokenExchange; - this.webClient = WebClient - .builder() - .baseUrl(serverProperties.getUrl()) - .build(); - } - - /** - * @param playgroupId AvspillergruppeId som man ønsker å hente fnr fra - * @return En liste med fnr som eksisterer i gruppen - */ - public List getPlaygroupFnrs(Long playgroupId) { - return tokenExchange.exchange(serverProperties) - .flatMap(accessToken -> new GetAlleIdenterCommand(playgroupId, webClient, accessToken.getTokenValue()).call()) - .block(); - } - - public List getLivingFnrs(Long playgroupId, String environment) { - return tokenExchange.exchange(serverProperties) - .flatMap(accessToken -> new GetLevendeIdenterCommand(playgroupId, environment, webClient, accessToken.getTokenValue()).call()) - .block(); - } - -} diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/hodejegeren/command/GetAlleIdenterCommand.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/hodejegeren/command/GetAlleIdenterCommand.java deleted file mode 100644 index c113efec926..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/hodejegeren/command/GetAlleIdenterCommand.java +++ /dev/null @@ -1,33 +0,0 @@ -package no.nav.registre.sdforvalter.consumer.rs.hodejegeren.command; - -import lombok.RequiredArgsConstructor; -import no.nav.registre.sdforvalter.util.WebClientFilter; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; - -import java.util.List; -import java.util.concurrent.Callable; - -@RequiredArgsConstructor -public class GetAlleIdenterCommand implements Callable>> { - - private static final ParameterizedTypeReference> RESPONSE_TYPE = new ParameterizedTypeReference<>() { - }; - private final Long avspillergruppeId; - private final WebClient webClient; - private final String token; - - @Override - public Mono> call() { - return webClient.get() - .uri(builder -> - builder.path("/api/v1/alle-identer/{avspillergruppeId}") - .build(avspillergruppeId) - ) - .header("Authorization", "Bearer " + token) - .retrieve() - .bodyToMono(RESPONSE_TYPE) - .doOnError(WebClientFilter::logErrorMessage); - } -} diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/hodejegeren/command/GetLevendeIdenterCommand.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/hodejegeren/command/GetLevendeIdenterCommand.java deleted file mode 100644 index 8df3d8117b8..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/hodejegeren/command/GetLevendeIdenterCommand.java +++ /dev/null @@ -1,35 +0,0 @@ -package no.nav.registre.sdforvalter.consumer.rs.hodejegeren.command; - -import lombok.RequiredArgsConstructor; -import no.nav.registre.sdforvalter.util.WebClientFilter; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; - -import java.util.List; -import java.util.concurrent.Callable; - -@RequiredArgsConstructor -public class GetLevendeIdenterCommand implements Callable>> { - - private static final ParameterizedTypeReference> RESPONSE_TYPE = new ParameterizedTypeReference<>() { - }; - private final Long avspillergruppeId; - private final String miljoe; - private final WebClient webClient; - private final String token; - - @Override - public Mono> call() { - return webClient.get() - .uri(builder -> - builder.path("/api/v1/levende-identer/{avspillergruppeId}") - .queryParam("miljoe", miljoe) - .build(avspillergruppeId) - ) - .header("Authorization", "Bearer " + token) - .retrieve() - .bodyToMono(RESPONSE_TYPE) - .doOnError(WebClientFilter::logErrorMessage); - } -} diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/person/PersonConsumer.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/person/PersonConsumer.java deleted file mode 100644 index 33a3cc9dff6..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/person/PersonConsumer.java +++ /dev/null @@ -1,118 +0,0 @@ -package no.nav.registre.sdforvalter.consumer.rs.person; - -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.extern.slf4j.Slf4j; -import no.nav.registre.sdforvalter.config.Consumers; -import no.nav.registre.sdforvalter.domain.TpsIdent; -import no.nav.registre.sdforvalter.domain.TpsIdentListe; -import no.nav.registre.sdforvalter.domain.person.Person; -import no.nav.registre.sdforvalter.exception.UgyldigIdentException; -import no.nav.testnav.libs.commands.CreatePersonCommand; -import no.nav.testnav.libs.commands.GetPersonCommand; -import no.nav.testnav.libs.dto.person.v1.Persondatasystem; -import no.nav.testnav.libs.securitycore.domain.AccessToken; -import no.nav.testnav.libs.securitycore.domain.ServerProperties; -import no.nav.testnav.libs.servletsecurity.exchange.TokenExchange; -import org.springframework.http.MediaType; -import org.springframework.http.codec.json.Jackson2JsonDecoder; -import org.springframework.http.codec.json.Jackson2JsonEncoder; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.client.ExchangeStrategies; -import org.springframework.web.reactive.function.client.WebClient; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Set; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; - -@Slf4j -@Component -public class PersonConsumer { - - private final WebClient webClient; - private final TokenExchange tokenExchange; - private final ServerProperties serverProperties; - private final Executor executor; - - public PersonConsumer( - ObjectMapper objectMapper, - Consumers consumers, - TokenExchange tokenExchange) { - serverProperties = consumers.getPerson(); - this.tokenExchange = tokenExchange; - ExchangeStrategies jacksonStrategy = ExchangeStrategies - .builder() - .codecs( - config -> { - config - .defaultCodecs() - .jackson2JsonEncoder(new Jackson2JsonEncoder(objectMapper, MediaType.APPLICATION_JSON)); - config - .defaultCodecs() - .jackson2JsonDecoder(new Jackson2JsonDecoder(objectMapper, MediaType.APPLICATION_JSON)); - }) - .build(); - this.webClient = WebClient - .builder() - .exchangeStrategies(jacksonStrategy) - .baseUrl(serverProperties.getUrl()) - .build(); - this.executor = Executors.newFixedThreadPool(serverProperties.getThreads()); - } - - private CompletableFuture hentPerson(String ident, AccessToken accessToken) { - var command = new GetPersonCommand(webClient, ident, accessToken.getTokenValue(), Persondatasystem.PDL, null); - return CompletableFuture.supplyAsync( - command::call, - executor - ).thenApply(Person::new); - } - - public List hentPersoner(Set identer) { - AccessToken accessToken = tokenExchange.exchange(serverProperties).block(); - List personer = new ArrayList<>(); - var futures = identer.stream().map(ident -> hentPerson(ident, accessToken)).toList(); - for (CompletableFuture future : futures) { - try { - Person person = future.get(); - personer.add(person != null && person.getFnr() != null ? person : null); - } catch (Exception e) { - log.error("Klarte ikke å hente ut person", e); - Thread.currentThread().interrupt(); - } - } - return personer; - } - - public void opprettPersoner(TpsIdentListe identer) { - AccessToken accessToken = tokenExchange.exchange(serverProperties).block(); - List> futures = identer.stream().map(ident -> CompletableFuture.supplyAsync(() -> { - try { - new CreatePersonCommand(webClient, ident.toDTO(), accessToken.getTokenValue(), ident.getOpprinnelse()).call().block(); - return ident; - } catch (Exception e) { - log.error("Kunne ikke opprette ident {}", ident.getFnr(), e); - return null; - } - }, executor) - ).toList(); - - List opprettedeIdenter = futures.stream().map(future -> { - try { - return future.get(); - } catch (InterruptedException | ExecutionException e) { - log.error("Noe gikk galt ved henting av resultat fra tråd", e); - Thread.currentThread().interrupt(); - return null; - } - }).toList(); - - if (opprettedeIdenter.stream().anyMatch(Objects::isNull)) { - throw new UgyldigIdentException("Klarte ikke å opprette alle identer"); - } - } -} diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/person/PersonFasteDataConsumer.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/person/PersonFasteDataConsumer.java deleted file mode 100644 index 8a901395312..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/person/PersonFasteDataConsumer.java +++ /dev/null @@ -1,54 +0,0 @@ -package no.nav.registre.sdforvalter.consumer.rs.person; - -import lombok.extern.slf4j.Slf4j; -import no.nav.registre.sdforvalter.config.Consumers; -import no.nav.registre.sdforvalter.consumer.rs.person.command.SavePersonFasteDataCommand; -import no.nav.registre.sdforvalter.domain.TpsIdent; -import no.nav.registre.sdforvalter.domain.TpsIdentListe; -import no.nav.testnav.libs.dto.personservice.v1.Gruppe; -import no.nav.testnav.libs.securitycore.domain.AccessToken; -import no.nav.testnav.libs.securitycore.domain.ServerProperties; -import no.nav.testnav.libs.servletsecurity.exchange.TokenExchange; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - - -@Slf4j -@Component -public class PersonFasteDataConsumer { - private final WebClient webClient; - private final ServerProperties serverProperties; - private final TokenExchange tokenExchange; - - public PersonFasteDataConsumer( - Consumers consumers, - TokenExchange tokenExchange) { - serverProperties = consumers.getTestnavPersonFasteDataService(); - this.tokenExchange = tokenExchange; - this.webClient = WebClient - .builder() - .baseUrl(serverProperties.getUrl()) - .build(); - } - - public void opprett(TpsIdentListe tpsIdentListe) { - tokenExchange.exchange(serverProperties) - .flatMapMany(token -> Flux.concat( - tpsIdentListe.getListe().stream().map(value -> opprett(value, token)).toList() - )) - .collectList() - .block(); - } - - public Mono opprett(TpsIdent tpsIdent, AccessToken accessToken) { - var gruppe = tpsIdent.getGruppe() == null ? Gruppe.ANDRE : Gruppe.valueOf(tpsIdent.getGruppe()); - return new SavePersonFasteDataCommand( - webClient, - accessToken.getTokenValue(), - tpsIdent.toDTOV2(), - gruppe - ).call(); - } -} diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/person/command/SavePersonFasteDataCommand.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/person/command/SavePersonFasteDataCommand.java deleted file mode 100644 index f5bc7e8b1cf..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/person/command/SavePersonFasteDataCommand.java +++ /dev/null @@ -1,41 +0,0 @@ -package no.nav.registre.sdforvalter.consumer.rs.person.command; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import no.nav.registre.sdforvalter.util.WebClientFilter; -import no.nav.testnav.libs.dto.personservice.v1.Gruppe; -import no.nav.testnav.libs.dto.personservice.v1.PersonDTO; -import org.springframework.http.HttpHeaders; -import org.springframework.web.reactive.function.BodyInserters; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; -import reactor.util.retry.Retry; - -import java.time.Duration; -import java.util.concurrent.Callable; - -@Slf4j -@RequiredArgsConstructor -public class SavePersonFasteDataCommand implements Callable> { - private final WebClient webClient; - private final String token; - private final PersonDTO dto; - private final Gruppe gruppe; - - - @Override - public Mono call() { - return webClient - .put() - .uri("/api/v1/personer") - .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) - .header("gruppe", gruppe.name()) - .body(BodyInserters.fromPublisher(Mono.just(dto), PersonDTO.class)) - .retrieve() - .bodyToMono(Void.class) - .doOnError(WebClientFilter::logErrorMessage) - .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) - .filter(WebClientFilter::is5xxException)); - } -} diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tp/TpConsumer.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tp/TpConsumer.java deleted file mode 100644 index 3748743c1a6..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tp/TpConsumer.java +++ /dev/null @@ -1,50 +0,0 @@ -package no.nav.registre.sdforvalter.consumer.rs.tp; - -import lombok.extern.slf4j.Slf4j; -import no.nav.registre.sdforvalter.config.Consumers; -import no.nav.registre.sdforvalter.consumer.rs.tp.command.OpprettPersonerTpCommand; -import no.nav.testnav.libs.securitycore.domain.ServerProperties; -import no.nav.testnav.libs.servletsecurity.exchange.TokenExchange; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.client.WebClient; - -import java.util.List; - -import static java.util.Objects.isNull; - -@Slf4j -@Component -public class TpConsumer { - - private final WebClient webClient; - private final TokenExchange tokenExchange; - private final ServerProperties serverProperties; - - public TpConsumer( - TokenExchange tokenExchange, - Consumers consumers) { - serverProperties = consumers.getTestnorgeTp(); - this.tokenExchange = tokenExchange; - this.webClient = WebClient - .builder() - .baseUrl(serverProperties.getUrl()) - .build(); - } - - /** - * @param data Fnr som skal legges til i tp - * @param environment Miljøet de skal legges til i - * @return true hvis den ble lagret i tp, false hvis de ikke ble lagret - */ - public boolean send(List data, String environment) { - var response = tokenExchange.exchange(serverProperties) - .flatMap(accessToken -> new OpprettPersonerTpCommand(webClient, data, environment, accessToken.getTokenValue()).call()) - .block(); - - if (isNull(response)){ - log.warn("Noe skjedde med initialisering av TP i gitt miljø. Det kan være at databasen ikke er koblet opp til miljø {}", environment); - return false; - } - return true; - } -} diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tp/command/OpprettPersonerTpCommand.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tp/command/OpprettPersonerTpCommand.java deleted file mode 100644 index 9e3a58a8be7..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tp/command/OpprettPersonerTpCommand.java +++ /dev/null @@ -1,40 +0,0 @@ -package no.nav.registre.sdforvalter.consumer.rs.tp.command; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.registre.sdforvalter.util.WebClientFilter; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.web.reactive.function.BodyInserters; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; - -import java.util.List; -import java.util.concurrent.Callable; - -@Slf4j -@RequiredArgsConstructor -public class OpprettPersonerTpCommand implements Callable>> { - - private static final ParameterizedTypeReference> RESPONSE_TYPE = new ParameterizedTypeReference<>() { - }; - - private final WebClient webClient; - private final List fnrs; - private final String miljoe; - private final String token; - - @Override - public Mono> call() { - return webClient.post() - .uri(builder -> - builder.path("/api/v1/orkestrering/opprettPersoner/{miljoe}") - .build(miljoe) - ) - .header("Authorization", "Bearer " + token) - .body(BodyInserters.fromValue(fnrs)) - .retrieve() - .bodyToMono(RESPONSE_TYPE) - .doOnError(WebClientFilter::logErrorMessage) - .onErrorResume(throwable -> Mono.empty()); - } -} diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/TpsfConsumer.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/TpsfConsumer.java deleted file mode 100644 index 649fd3ad0f0..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/TpsfConsumer.java +++ /dev/null @@ -1,53 +0,0 @@ -package no.nav.registre.sdforvalter.consumer.rs.tpsf; - -import lombok.extern.slf4j.Slf4j; -import no.nav.registre.sdforvalter.config.Consumers; -import no.nav.registre.sdforvalter.consumer.rs.tpsf.command.GetMeldingsIdsCommand; -import no.nav.registre.sdforvalter.consumer.rs.tpsf.command.PostSendSkdMeldingerTpsCommand; -import no.nav.registre.sdforvalter.consumer.rs.tpsf.request.SendToTpsRequest; -import no.nav.registre.sdforvalter.consumer.rs.tpsf.response.SkdMeldingerTilTpsRespons; -import no.nav.testnav.libs.securitycore.domain.ServerProperties; -import no.nav.testnav.libs.servletsecurity.exchange.TokenExchange; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; - -import java.util.List; - -@Component -@Slf4j -public class TpsfConsumer { - private final WebClient webClient; - private final TokenExchange tokenExchange; - private final ServerProperties serverProperties; - - public TpsfConsumer( - Consumers consumers, - TokenExchange tokenExchange) { - serverProperties = consumers.getTpsForvalterenProxy(); - this.webClient = WebClient - .builder() - .baseUrl(serverProperties.getUrl()) - .build(); - this.tokenExchange = tokenExchange; - } - - private Mono sendSkdmeldingerToTps( - Long gruppeId, - SendToTpsRequest sendToTpsRequest) { - - log.info("Sender skd-meldinger med avspillergruppe {} til tps", gruppeId); - return tokenExchange.exchange(serverProperties).flatMap(accessToken -> - new PostSendSkdMeldingerTpsCommand(gruppeId, sendToTpsRequest, webClient, accessToken.getTokenValue()).call()); - } - - private Mono> getMeldingIdsFromAvspillergruppe(Long gruppeId) { - return tokenExchange.exchange(serverProperties) - .flatMap(accessToken -> new GetMeldingsIdsCommand(gruppeId, webClient, accessToken.getTokenValue()).call()); - } - - public Mono sendTilTps(Long gruppeId, String miljoe) { - return getMeldingIdsFromAvspillergruppe(gruppeId) - .flatMap(meldingIds -> sendSkdmeldingerToTps(gruppeId, new SendToTpsRequest(miljoe, meldingIds))); - } -} diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/command/GetMeldingsIdsCommand.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/command/GetMeldingsIdsCommand.java deleted file mode 100644 index f8c900d48d9..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/command/GetMeldingsIdsCommand.java +++ /dev/null @@ -1,37 +0,0 @@ -package no.nav.registre.sdforvalter.consumer.rs.tpsf.command; - -import lombok.AllArgsConstructor; -import no.nav.registre.sdforvalter.util.WebClientFilter; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; -import reactor.util.retry.Retry; - -import java.time.Duration; -import java.util.List; -import java.util.concurrent.Callable; - -@AllArgsConstructor -public class GetMeldingsIdsCommand implements Callable>> { - - private static final ParameterizedTypeReference> RESPONSE_TYPE = new ParameterizedTypeReference<>() { - }; - private final Long gruppeId; - private final WebClient webClient; - private final String token; - - @Override - public Mono> call() { - return webClient.get() - .uri(builder -> - builder.path("/api/v1/endringsmelding/skd/meldinger/{gruppeId}") - .build(gruppeId) - ) - .header("Authorization", "Bearer " + token) - .retrieve() - .bodyToMono(RESPONSE_TYPE) - .doOnError(WebClientFilter::logErrorMessage) - .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) - .filter(WebClientFilter::is5xxException)); - } -} diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/command/PostSendSkdMeldingerTpsCommand.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/command/PostSendSkdMeldingerTpsCommand.java deleted file mode 100644 index 544ba529a1f..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/command/PostSendSkdMeldingerTpsCommand.java +++ /dev/null @@ -1,38 +0,0 @@ -package no.nav.registre.sdforvalter.consumer.rs.tpsf.command; - -import lombok.AllArgsConstructor; -import no.nav.registre.sdforvalter.consumer.rs.tpsf.request.SendToTpsRequest; -import no.nav.registre.sdforvalter.consumer.rs.tpsf.response.SkdMeldingerTilTpsRespons; -import no.nav.registre.sdforvalter.util.WebClientFilter; -import org.springframework.web.reactive.function.BodyInserters; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; -import reactor.util.retry.Retry; - -import java.time.Duration; -import java.util.concurrent.Callable; - -@AllArgsConstructor -public class PostSendSkdMeldingerTpsCommand implements Callable> { - - private final Long gruppeId; - private final SendToTpsRequest sendToTpsRequest; - private final WebClient webClient; - private final String token; - - @Override - public Mono call() { - return webClient.post() - .uri(builder -> - builder.path("/api/v1/endringsmelding/skd/send/{gruppeId}") - .build(gruppeId) - ) - .header("Authorization", "Bearer " + token) - .body(BodyInserters.fromPublisher(Mono.just(sendToTpsRequest), SendToTpsRequest.class)) - .retrieve() - .bodyToMono(SkdMeldingerTilTpsRespons.class) - .doOnError(WebClientFilter::logErrorMessage) - .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) - .filter(WebClientFilter::is5xxException)); - } -} diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/request/SendToTpsRequest.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/request/SendToTpsRequest.java deleted file mode 100644 index bf5f3be7ea2..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/request/SendToTpsRequest.java +++ /dev/null @@ -1,18 +0,0 @@ -package no.nav.registre.sdforvalter.consumer.rs.tpsf.request; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.util.List; - -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -public class SendToTpsRequest { - - private String environment; - private List ids; -} diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/response/SkdMeldingerTilTpsRespons.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/response/SkdMeldingerTilTpsRespons.java deleted file mode 100644 index 06985b618bd..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/response/SkdMeldingerTilTpsRespons.java +++ /dev/null @@ -1,33 +0,0 @@ -package no.nav.registre.sdforvalter.consumer.rs.tpsf.response; - -import lombok.*; - -import java.util.ArrayList; -import java.util.List; - -import static java.util.Objects.isNull; - -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class SkdMeldingerTilTpsRespons { - - private int antallSendte; - private int antallFeilet; - private List statusFraFeilendeMeldinger; - - - public List getStatusFraFeilendeMeldinger() { - if (isNull(statusFraFeilendeMeldinger)){ - statusFraFeilendeMeldinger = new ArrayList<>(); - } - return statusFraFeilendeMeldinger; - } - - public List getFailedStatus() { - return getStatusFraFeilendeMeldinger().parallelStream().map(StatusPaaAvspiltSkdMelding::toString).toList(); - } - -} diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/response/StatusPaaAvspiltSkdMelding.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/response/StatusPaaAvspiltSkdMelding.java deleted file mode 100644 index 27ca009c305..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/response/StatusPaaAvspiltSkdMelding.java +++ /dev/null @@ -1,17 +0,0 @@ -package no.nav.registre.sdforvalter.consumer.rs.tpsf.response; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -public class StatusPaaAvspiltSkdMelding { - - private String foedselsnummer; - private Long sekvensnummer; - private String status; -} diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/converter/csv/TpsIdentCsvConverter.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/converter/csv/TpsIdentCsvConverter.java deleted file mode 100644 index fad843b1214..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/converter/csv/TpsIdentCsvConverter.java +++ /dev/null @@ -1,92 +0,0 @@ -package no.nav.registre.sdforvalter.converter.csv; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - -import no.nav.registre.sdforvalter.domain.TpsIdent; -import no.nav.testnav.libs.csvconverter.CsvConverter; -import no.nav.testnav.libs.csvconverter.CsvHeader; -import no.nav.testnav.libs.csvconverter.ObjectConverter; -import no.nav.testnav.libs.csvconverter.RowConverter; - -public class TpsIdentCsvConverter extends CsvConverter { - - private static final String LIST_SPLITT_CHARACTER = ","; - static TpsIdentCsvConverter inst; - - private TpsIdentCsvConverter() { - - } - - public static TpsIdentCsvConverter inst() { - if (inst == null) { - inst = new TpsIdentCsvConverter(); - } - return inst; - } - - private enum Headers implements CsvHeader { - FNR("FNR*"), - FIRST_NAME("Fornavn"), - LAST_NAME("Etternavn"), - ADDRESS("Adresse"), - POST_NR("Postnummer"), - CITY("Poststed"), - GRUPPE("Gruppe"), - OPPRINNELSE("Opprinnelse"), - TAGS("Tags"); - - private final String header; - - Headers(String header) { - this.header = header; - } - - @Override - public String getValue() { - return header; - } - } - - @Override - protected RowConverter getRowConverter() { - return map -> TpsIdent - .builder() - .fnr(getString(map, Headers.FNR)) - .firstName(getString(map, Headers.FIRST_NAME)) - .lastName(getString(map, Headers.LAST_NAME)) - .address(getString(map, Headers.ADDRESS)) - .postNr(getString(map, Headers.POST_NR)) - .city(getString(map, Headers.CITY)) - .gruppe(getString(map, Headers.GRUPPE)) - .opprinnelse(getString(map, Headers.OPPRINNELSE)) - .tags(getString(map, Headers.TAGS) == null - ? Collections.emptySet() - : Set.of(getString(map, Headers.TAGS).split(LIST_SPLITT_CHARACTER)) - ).build(); - } - - @Override - protected ObjectConverter getObjectConverter() { - return item -> { - Map map = new HashMap<>(); - map.put(Headers.FNR.getValue(), item.getFnr()); - map.put(Headers.FIRST_NAME.getValue(), item.getFirstName()); - map.put(Headers.LAST_NAME.getValue(), item.getLastName()); - map.put(Headers.ADDRESS.getValue(), item.getAddress()); - map.put(Headers.POST_NR.getValue(), item.getPostNr()); - map.put(Headers.CITY.getValue(), item.getCity()); - map.put(Headers.GRUPPE.getValue(), item.getGruppe()); - map.put(Headers.OPPRINNELSE.getValue(), item.getOpprinnelse()); - map.put(Headers.TAGS.getValue(), String.join(LIST_SPLITT_CHARACTER, item.getTags())); - return map; - }; - } - - @Override - protected CsvHeader[] getHeaders() { - return Headers.values(); - } -} diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/database/model/TpsIdentModel.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/database/model/TpsIdentModel.java deleted file mode 100644 index 2c93c052a7f..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/database/model/TpsIdentModel.java +++ /dev/null @@ -1,55 +0,0 @@ -package no.nav.registre.sdforvalter.database.model; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; -import lombok.extern.slf4j.Slf4j; - -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; - -import no.nav.registre.sdforvalter.domain.TpsIdent; - -@Entity -@ToString(callSuper = true) -@Getter -@Setter -@Slf4j -@Table(name = "tps_identer") -@NoArgsConstructor -@EqualsAndHashCode(callSuper = true) -public class TpsIdentModel extends FasteDataModel { - - @Id - @JsonProperty - private String fnr; - @JsonProperty("fornavn") - private String firstName; - @JsonProperty("etternavn") - private String lastName; - @JsonProperty("adresse") - private String address; - @JsonProperty("postnr") - private String postNr; - @JsonProperty("by") - private String city; - - public TpsIdentModel(TpsIdent tpsIdent, OpprinnelseModel opprinnelseModel, GruppeModel gruppeModel) { - super(gruppeModel, opprinnelseModel); - fnr = tpsIdent.getFnr(); - firstName = tpsIdent.getFirstName(); - lastName = tpsIdent.getLastName(); - address = tpsIdent.getAddress(); - postNr = tpsIdent.getPostNr(); - city = tpsIdent.getCity(); - } - - @Override - public TpsIdent toDomain() { - throw new UnsupportedOperationException("Ikke mulig å convertere til model"); - } -} diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/database/model/TpsIdentTagModel.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/database/model/TpsIdentTagModel.java deleted file mode 100644 index 75e8199a616..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/database/model/TpsIdentTagModel.java +++ /dev/null @@ -1,41 +0,0 @@ -package no.nav.registre.sdforvalter.database.model; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.springframework.data.jpa.domain.support.AuditingEntityListener; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.EntityListeners; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; - -@Entity -@Table(name = "TPS_IDENTER_TAGS") -@Builder -@Getter -@EntityListeners(AuditingEntityListener.class) -@AllArgsConstructor -@NoArgsConstructor -public class TpsIdentTagModel extends AuditModel { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "ID") - private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "IDENT") - private TpsIdentModel ident; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "TAG") - private TagModel tag; -} \ No newline at end of file diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/database/repository/TpsIdentTagRepository.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/database/repository/TpsIdentTagRepository.java deleted file mode 100644 index 8c29d89ccfa..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/database/repository/TpsIdentTagRepository.java +++ /dev/null @@ -1,17 +0,0 @@ -package no.nav.registre.sdforvalter.database.repository; - -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.CrudRepository; - -import java.util.List; -import java.util.Optional; - -import no.nav.registre.sdforvalter.database.model.TpsIdentTagModel; - -public interface TpsIdentTagRepository extends CrudRepository { - @Query(value = "from TpsIdentTagModel m where m.ident.fnr = ?1 and m.tag.tag = ?2") - Optional findBy(String ident, String tag); - - @Query(value = "from TpsIdentTagModel m where m.ident.fnr = ?1") - List findAllByIdent(String ident); -} \ No newline at end of file diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/database/repository/TpsIdenterRepository.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/database/repository/TpsIdenterRepository.java deleted file mode 100644 index 72f41a1464b..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/database/repository/TpsIdenterRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -package no.nav.registre.sdforvalter.database.repository; - -import org.springframework.data.repository.CrudRepository; -import org.springframework.stereotype.Repository; - -import java.util.List; - -import no.nav.registre.sdforvalter.database.model.GruppeModel; -import no.nav.registre.sdforvalter.database.model.TpsIdentModel; - -@Repository -public interface TpsIdenterRepository extends CrudRepository { - List findByGruppeModel(GruppeModel gruppeModel); - - TpsIdentModel findByFnr(String fnr); -} diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/domain/TpsIdent.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/domain/TpsIdent.java deleted file mode 100644 index aa2d5bcb93c..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/domain/TpsIdent.java +++ /dev/null @@ -1,96 +0,0 @@ -package no.nav.registre.sdforvalter.domain; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import lombok.Value; - -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -import no.nav.registre.sdforvalter.database.model.TagModel; -import no.nav.registre.sdforvalter.database.model.TpsIdentModel; -import no.nav.testnav.libs.dto.person.v1.AdresseDTO; -import no.nav.testnav.libs.dto.person.v1.PersonDTO; - -@Value -@NoArgsConstructor(force = true) -@AllArgsConstructor -@JsonIgnoreProperties(ignoreUnknown = true) -@EqualsAndHashCode(callSuper = true) -public class TpsIdent extends FasteData { - - @JsonProperty - private final String fnr; - @JsonProperty("fornavn") - private final String firstName; - @JsonProperty("etternavn") - private final String lastName; - @JsonProperty("adresse") - private final String address; - @JsonProperty("postnr") - private final String postNr; - @JsonProperty("by") - private final String city; - @JsonProperty - private final Set tags; - - public TpsIdent(TpsIdentModel model, List tagModels) { - super(model); - fnr = model.getFnr(); - firstName = model.getFirstName(); - lastName = model.getLastName(); - address = model.getAddress(); - postNr = model.getPostNr(); - city = model.getCity(); - tags = tagModels.stream().map(TagModel::getTag).collect(Collectors.toSet()); - } - - @Builder - public TpsIdent(String fnr, String firstName, String lastName, String address, String postNr, String city, String gruppe, String opprinnelse, Set tags) { - super(gruppe, opprinnelse); - this.fnr = fnr; - this.firstName = firstName; - this.lastName = lastName; - this.address = address; - this.postNr = postNr; - this.city = city; - this.tags = tags; - } - - public PersonDTO toDTO() { - return PersonDTO.builder() - .ident(fnr) - .fornavn(firstName) - .etternavn(lastName) - .adresse(address != null ? new AdresseDTO(address, postNr, city, null) : null) - .build(); - } - - - public no.nav.testnav.libs.dto.personservice.v1.AdresseDTO toAdresseDTO(){ - return no.nav.testnav.libs.dto.personservice.v1.AdresseDTO - .builder() - .gatenavn(address) - .postnummer(postNr) - .poststed(city) - .build(); - } - - public no.nav.testnav.libs.dto.personservice.v1.PersonDTO toDTOV2(){ - return no.nav.testnav.libs.dto.personservice.v1.PersonDTO - .builder() - .ident(fnr) - .fornavn(firstName) - .etternavn(lastName) - .opprinnelse(getOpprinnelse()) - .tags(tags) - .adresse(toAdresseDTO()) - .build(); - } - -} diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/domain/TpsIdentListe.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/domain/TpsIdentListe.java deleted file mode 100644 index 0ccca801681..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/domain/TpsIdentListe.java +++ /dev/null @@ -1,14 +0,0 @@ -package no.nav.registre.sdforvalter.domain; - -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import java.util.List; - -@NoArgsConstructor -@EqualsAndHashCode(callSuper = true) -public final class TpsIdentListe extends FasteDataListe { - public TpsIdentListe(List liste) { - super(liste); - } -} \ No newline at end of file diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/domain/person/Person.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/domain/person/Person.java index 49b15bbe17c..61173660e74 100644 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/domain/person/Person.java +++ b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/domain/person/Person.java @@ -3,9 +3,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import lombok.NoArgsConstructor; import lombok.Value; - -import no.nav.registre.sdforvalter.domain.TpsIdent; -import no.nav.testnav.libs.dto.person.v1.AdresseDTO; import no.nav.testnav.libs.dto.person.v1.PersonDTO; @@ -25,15 +22,6 @@ public class Person { @JsonProperty("by") String city; - public Person(TpsIdent ident) { - fnr = ident.getFnr(); - firstName = ident.getFirstName(); - lastName = ident.getLastName(); - address = ident.getAddress(); - postNr = ident.getPostNr(); - city = ident.getCity(); - } - public Person(PersonDTO dto) { fnr = dto.getIdent(); firstName = dto.getFornavn(); @@ -42,13 +30,4 @@ public Person(PersonDTO dto) { postNr = dto.getAdresse() != null ? dto.getAdresse().getPostnummer() : null; city = dto.getAdresse() != null ? dto.getAdresse().getPoststed() : null; } - - public PersonDTO toDTO () { - return PersonDTO.builder() - .ident(fnr) - .fornavn(firstName) - .etternavn(lastName) - .adresse(address != null ? new AdresseDTO(address, postNr, city, null) : null) - .build(); - } } diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/provider/rs/FileController.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/provider/rs/FileController.java index 5de4ee765e5..d7575067833 100644 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/provider/rs/FileController.java +++ b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/provider/rs/FileController.java @@ -1,18 +1,13 @@ package no.nav.registre.sdforvalter.provider.rs; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import no.nav.registre.sdforvalter.adapter.EregAdapter; -import no.nav.registre.sdforvalter.adapter.TpsIdenterAdapter; import no.nav.registre.sdforvalter.converter.csv.EregCsvConverter; -import no.nav.registre.sdforvalter.converter.csv.TpsIdentCsvConverter; import no.nav.registre.sdforvalter.domain.Ereg; import no.nav.registre.sdforvalter.domain.EregListe; -import no.nav.registre.sdforvalter.domain.TpsIdent; -import no.nav.registre.sdforvalter.domain.TpsIdentListe; -import no.nav.registre.sdforvalter.service.IdentService; import no.nav.testnav.libs.dto.organisasjonfastedataservice.v1.Gruppe; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -24,17 +19,11 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -import jakarta.servlet.http.HttpServletResponse; -import java.io.BufferedReader; import java.io.IOException; -import java.io.InputStream; import java.io.InputStreamReader; -import java.io.Reader; -import java.io.StringReader; import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; import java.util.List; -import java.util.stream.Collectors; @RestController @RequestMapping("/api/v1/faste-data/file") @@ -46,15 +35,13 @@ public class FileController { private final EregAdapter eregAdapter; - private final TpsIdenterAdapter tpsIdenterAdapter; - private final IdentService identService; @Operation(summary = "Hent organisasjoner fra Team Dollys database") @GetMapping("/ereg") public void exportEreg(@RequestParam(name = "gruppe", required = false) Gruppe gruppe, HttpServletResponse response) throws IOException { response.setContentType("text/csv"); response.setCharacterEncoding(StandardCharsets.UTF_8.toString()); - response.setHeader("Content-Disposition", "attachment; filename=ereg-" + LocalDateTime.now().toString() + ".csv"); + response.setHeader("Content-Disposition", "attachment; filename=ereg-" + LocalDateTime.now() + ".csv"); EregListe eregListe = eregAdapter.fetchBy(gruppe != null ? gruppe.name() : null); EregCsvConverter.inst().write(response.getWriter(), eregListe.getListe()); @@ -67,36 +54,4 @@ public ResponseEntity importEreg(@RequestParam("file") MultipartFile eregAdapter.save(new EregListe(list)); return ResponseEntity.ok().build(); } - - @Operation(summary = "Hent personer fra Team Dollys database") - @GetMapping("/tpsIdenter") - public void exportTpsIdenter(@RequestParam(name = "gruppe", required = false) Gruppe gruppe, HttpServletResponse response) throws IOException { - response.setContentType("text/csv"); - response.setCharacterEncoding(StandardCharsets.UTF_8.toString()); - response.setHeader("Content-Disposition", "attachment; filename=tpsIdent-" + LocalDateTime.now().toString() + ".csv"); - - TpsIdentListe tpsIdentListe = tpsIdenterAdapter.fetchBy(gruppe.name()); - TpsIdentCsvConverter.inst().write(response.getWriter(), tpsIdentListe.getListe()); - } - - @Operation(summary = "Legg til personer i Team Dollys database") - @PostMapping(path = "/tpsIdenter", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - public ResponseEntity importTpsIdenter(@RequestParam("file") MultipartFile file, - @Parameter(description = "Hvis true settes tilfeldig navn på personer uten fornavn og etternavn") - @RequestParam(name = "Generer manglende navn", defaultValue = "false") Boolean genererManglendeNavn) throws IOException { - List list = TpsIdentCsvConverter.inst().read(cleanInput(file.getInputStream())); - - identService.save(new TpsIdentListe(list), genererManglendeNavn); - return ResponseEntity.ok().build(); - } - - private Reader cleanInput(InputStream inputStream) { - String character = "\uFEFF"; - return new StringReader( - new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)) - .lines() - .collect(Collectors.joining("\n")).replace(character, "") - ); - } - } \ No newline at end of file diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/provider/rs/OrkestreringsController.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/provider/rs/OrkestreringController.java similarity index 72% rename from apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/provider/rs/OrkestreringsController.java rename to apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/provider/rs/OrkestreringController.java index e518ff7bba1..09176202cc0 100644 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/provider/rs/OrkestreringsController.java +++ b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/provider/rs/OrkestreringController.java @@ -4,53 +4,36 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import no.nav.registre.sdforvalter.adapter.TpsIdenterAdapter; -import no.nav.registre.sdforvalter.consumer.rs.person.PersonConsumer; -import no.nav.registre.sdforvalter.domain.TpsIdentListe; import no.nav.registre.sdforvalter.provider.rs.dto.Orgnummer; import no.nav.registre.sdforvalter.service.EnvironmentInitializationService; import no.nav.testnav.libs.dto.organisasjonfastedataservice.v1.Gruppe; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; @Slf4j @RestController @RequiredArgsConstructor @RequestMapping("/api/v1/orkestrering") @Tag( - name = "OrkestreingController", + name = "OrkestreringController", description = "Initialiserer ulike miljøer med statiske data." ) -public class OrkestreringsController { +public class OrkestreringController { private final EnvironmentInitializationService environmentInitializationService; - private final TpsIdenterAdapter tpsIdenterAdapter; - private final PersonConsumer personConsumer; @PostMapping(value = "/{miljoe}") @Operation( - description = "Orkestrerer testdata i TPS/PDL, testnorge-tp, KRR, AAREG, EREG." + description = "Orkestrerer testdata i KRR, AAREG, EREG." ) public void initializeInEnvironment(@PathVariable String miljoe, @RequestParam(name = "gruppe", required = false) Gruppe gruppe) { environmentInitializationService.initializeEnvironmentWithStaticData(miljoe, gruppe != null ? gruppe.name() : null); } - @PostMapping(value = "/tps/{miljoe}") - @Operation( - description = "Identisk med POST /{miljoe}." - ) - public void initializeTps(@PathVariable String miljoe, @RequestParam(name = "gruppe", required = false) Gruppe gruppe) { - environmentInitializationService.initializeIdent(miljoe, gruppe != null ? gruppe.name() : null); - } - - @PostMapping(value = "/pdl") - @Operation( - description = "Oppretter personer i TPS basert på angitt gruppe." - ) - public void initializePdlGruppe(@RequestParam(name = "gruppe") Gruppe gruppe) { - TpsIdentListe liste = tpsIdenterAdapter.fetchBy(gruppe.name()); - personConsumer.opprettPersoner(liste); - } - @PostMapping(value = "/aareg/{miljoe}") @Operation( description = "Oppretter arbeidsforhold i AAREG basert på angitt gruppe." diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/provider/rs/PersonController.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/provider/rs/PersonController.java deleted file mode 100644 index 19fdbc97dd8..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/provider/rs/PersonController.java +++ /dev/null @@ -1,60 +0,0 @@ -package no.nav.registre.sdforvalter.provider.rs; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.registre.sdforvalter.domain.person.Person; -import no.nav.registre.sdforvalter.domain.person.PersonStatusMap; -import no.nav.registre.sdforvalter.service.PersonService; -import no.nav.testnav.libs.dto.organisasjonfastedataservice.v1.Gruppe; -import no.nav.testnav.libs.dto.person.v1.PersonDTO; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.server.ResponseStatusException; - -import java.util.List; - -@Slf4j -@RestController -@RequiredArgsConstructor -@RequestMapping("/api/v1/person") -@Tag( - name = "PersonController", - description = "Henter ulik personinformasjon basert på identer i database." -) -public class PersonController { - - private final PersonService personService; - - @GetMapping - @Operation( - description = "Hent liste over personer fra tabell TPS_IDENTER basert på angitt gruppe." - ) - public List getPersonByGruppe( - @RequestParam(value = "gruppe") Gruppe gruppe - ) { - return personService.getPerson(gruppe.name()); - } - - @GetMapping("/pdl/status") - @Operation( - description = "Hent liste over status per fødselsnummer basert på angitt gruppe. Personer hentes fra tabell TPS_IDENTER, status på disse fra tjeneste testnav-person-service." - ) - public PersonStatusMap statusByGruppe( - @RequestParam(value = "equal", required = false) Boolean equal, - @RequestParam(value = "gruppe") Gruppe gruppe - ) { - return personService.getStatusMap(gruppe.name(), equal); - } - - @Operation(summary = "Hent person fra Team Dollys database (faste data)") - @GetMapping("/{ident}") - public PersonDTO getPersonByIdent(@PathVariable String ident) { - var person = personService.getPersonByIdent(ident); - if (person == null) { - throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Fant ikke person med ident " + ident); - } - return person.toDTO(); - } -} \ No newline at end of file diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/provider/rs/PersonMigreringController.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/provider/rs/PersonMigreringController.java deleted file mode 100644 index cffbc896744..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/provider/rs/PersonMigreringController.java +++ /dev/null @@ -1,33 +0,0 @@ -package no.nav.registre.sdforvalter.provider.rs; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import no.nav.registre.sdforvalter.adapter.TpsIdenterAdapter; -import no.nav.registre.sdforvalter.consumer.rs.person.PersonFasteDataConsumer; -import no.nav.testnav.libs.dto.organisasjonfastedataservice.v1.Gruppe; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/api/v1/person/migrering") -@RequiredArgsConstructor -@Tag( - name = "PersonMigreringController", - description = "Oppretter personer i testnav-person-faste-data-service." -) -public class PersonMigreringController { - private final TpsIdenterAdapter tpsIdenterAdapter; - private final PersonFasteDataConsumer fasteDataConsumer; - - @PostMapping - @Operation( - description = "Oppretter personer i tjenesten testnav-person-faste-data-service basert på identer fra tabell TPS_IDENTER for angitt gruppe." - ) - public void opprett(@RequestParam(required = false) Gruppe gruppe) { - var eregListe = gruppe == null ? tpsIdenterAdapter.fetchAll() : tpsIdenterAdapter.fetchBy(gruppe.name()); - fasteDataConsumer.opprett(eregListe); - } -} diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/provider/rs/v1/StaticDataControllerV1.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/provider/rs/v1/StaticDataControllerV1.java index 2fd361af13d..b835b43768e 100644 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/provider/rs/v1/StaticDataControllerV1.java +++ b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/provider/rs/v1/StaticDataControllerV1.java @@ -1,22 +1,23 @@ package no.nav.registre.sdforvalter.provider.rs.v1; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.registre.sdforvalter.adapter.AaregAdapter; import no.nav.registre.sdforvalter.adapter.EregAdapter; import no.nav.registre.sdforvalter.adapter.KrrAdapter; -import no.nav.registre.sdforvalter.adapter.TpsIdenterAdapter; import no.nav.registre.sdforvalter.domain.AaregListe; import no.nav.registre.sdforvalter.domain.EregListe; import no.nav.registre.sdforvalter.domain.KrrListe; -import no.nav.registre.sdforvalter.domain.TpsIdentListe; -import no.nav.registre.sdforvalter.service.IdentService; import org.springframework.http.CacheControl; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.TimeUnit; @@ -26,32 +27,16 @@ @RequestMapping("/api/v1/faste-data") @Tag( name = "StaticDataControllerV1", - description = "Operasjoner på statiske TPS-/AAREG-/KRR- og EREG-data lagret i database." + description = "Operasjoner på statiske AAREG-/KRR- og EREG-data lagret i database." ) public class StaticDataControllerV1 { private static final int CACHE_HOURS = 24; - private final IdentService identService; - private final TpsIdenterAdapter tpsIdenterAdapter; private final AaregAdapter aaregAdapter; private final KrrAdapter krrAdapter; private final EregAdapter eregAdapter; - @GetMapping("/tps") - @Operation(description = "Henter TPS-identer fra tabell TPS_IDENTER.") - public TpsIdentListe getTps(@RequestParam(name = "gruppe", required = false) String gruppe) { - return tpsIdenterAdapter.fetchBy(gruppe); - } - - @PostMapping("/tps") - @Operation(description = "Lagrer TPS-identer i tabell TPS_IDENTER.") - public TpsIdentListe createTps(@RequestBody TpsIdentListe liste, - @Parameter(description = "Hvis true settes tilfeldig navn på personer uten fornavn og etternavn") - @RequestParam(name = "genererManglendeNavn", required = false, defaultValue = "false") Boolean genererManglendeNavn) { - return identService.save(liste, genererManglendeNavn); - } - @GetMapping("/aareg") @Operation(description = "Henter AAREG-data fra tabell AAREG.") public AaregListe getAareg(@RequestParam(name = "gruppe", required = false) String gruppe) { diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/service/EnvironmentInitializationService.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/service/EnvironmentInitializationService.java index 84aab5ff62e..9d106b8b33e 100644 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/service/EnvironmentInitializationService.java +++ b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/service/EnvironmentInitializationService.java @@ -2,17 +2,16 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.List; - import no.nav.registre.sdforvalter.adapter.AaregAdapter; import no.nav.registre.sdforvalter.adapter.EregAdapter; import no.nav.registre.sdforvalter.adapter.KrrAdapter; -import no.nav.registre.sdforvalter.consumer.rs.organisasjon.OrganisasjonMottakServiceConsumer; import no.nav.registre.sdforvalter.consumer.rs.krr.KrrConsumer; +import no.nav.registre.sdforvalter.consumer.rs.organisasjon.OrganisasjonMottakServiceConsumer; import no.nav.registre.sdforvalter.domain.EregListe; import no.nav.registre.sdforvalter.domain.status.ereg.OrganisasjonStatusMap; +import org.springframework.stereotype.Service; + +import java.util.List; @Slf4j @Service @@ -27,25 +26,15 @@ public class EnvironmentInitializationService { private final EregAdapter eregAdapter; private final KrrAdapter krrAdapter; private final AaregAdapter aaregAdapter; - private final IdentService identService; - public void initializeEnvironmentWithStaticData(String environment, String gruppe) { log.info("Start init of all static data sets..."); - initializeIdent(environment, gruppe); initializeKrr(gruppe); initializeAareg(environment, gruppe); initializeEreg(environment, gruppe); log.info("Completed init of all static data sets."); } - - public void initializeIdent(String environment, String gruppe) { - log.info("Start init av identer..."); - identService.send(environment, gruppe); - log.info("Init av identer er ferdig."); - } - public void initializeAareg(String environment, String gruppe) { log.info("Start init av Aareg..."); aaregService.sendArbeidsforhold(aaregAdapter.fetchBy(gruppe), environment); diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/service/IdentService.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/service/IdentService.java deleted file mode 100644 index 66121a51a38..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/service/IdentService.java +++ /dev/null @@ -1,113 +0,0 @@ -package no.nav.registre.sdforvalter.service; - -import lombok.extern.slf4j.Slf4j; -import no.nav.registre.sdforvalter.adapter.TpsIdenterAdapter; -import no.nav.registre.sdforvalter.consumer.rs.navn.GenererNavnConsumer; -import no.nav.registre.sdforvalter.consumer.rs.hodejegeren.HodejegerenConsumer; -import no.nav.registre.sdforvalter.consumer.rs.person.PersonConsumer; -import no.nav.registre.sdforvalter.consumer.rs.tp.TpConsumer; -import no.nav.registre.sdforvalter.consumer.rs.tpsf.TpsfConsumer; -import no.nav.registre.sdforvalter.domain.TpsIdent; -import no.nav.registre.sdforvalter.domain.TpsIdentListe; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import static java.util.Objects.isNull; -import static java.util.Objects.nonNull; - -@Service -@Slf4j -public class IdentService { - private final TpsIdenterAdapter tpsIdenterAdapter; - private final HodejegerenConsumer hodejegerenConsumer; - private final TpConsumer tpConsumer; - private final GenererNavnConsumer genererNavnConsumer; - private final PersonConsumer personConsumer; - private final TpsfConsumer tpsfConsumer; - private final Long staticDataPlaygroup; - - public IdentService( - TpsIdenterAdapter tpsIdenterAdapter, - HodejegerenConsumer hodejegerenConsumer, - GenererNavnConsumer genererNavnConsumer, - PersonConsumer personConsumer, - TpConsumer tpConsumer, - TpsfConsumer tpsfConsumer, - @Value("${tps.statisk.avspillergruppeId}") Long staticDataPlaygroup - ) { - this.tpsIdenterAdapter = tpsIdenterAdapter; - this.hodejegerenConsumer = hodejegerenConsumer; - this.tpConsumer = tpConsumer; - this.genererNavnConsumer = genererNavnConsumer; - this.personConsumer = personConsumer; - this.tpsfConsumer = tpsfConsumer; - this.staticDataPlaygroup = staticDataPlaygroup; - } - - public void send(String environment, String gruppe) { - TpsIdentListe liste = tpsIdenterAdapter.fetchBy(gruppe); - var exisistingFnrs = hodejegerenConsumer.getPlaygroupFnrs(staticDataPlaygroup); - var identer = new TpsIdentListe(liste.stream() - .filter(item -> !exisistingFnrs.contains(item.getFnr())) - .toList() - ); - sendTilTps(staticDataPlaygroup, environment); - - //Person får ikke aktør-id automatisk ved opprettelse i TPS lenger. Må opprettes i PDL også for å få aktør-id - opprettPersonerIPdl(identer); - - /* - Order of method calls are important to ensure that the values exist in the databases. - Some methods may fail if at the very least TPS-ident (SKD) have not been created. - TP and SAM are also critical databases for the fag applications - */ - var livingFnrs = hodejegerenConsumer.getLivingFnrs(staticDataPlaygroup, environment); - tpConsumer.send(livingFnrs, environment); - } - - private void sendTilTps(Long playgroup, String environment) { - tpsfConsumer.sendTilTps(playgroup, environment).subscribe(response -> { - if (isNull(response) || response.getAntallFeilet() != 0) { - log.warn("Fikk ikke opprettet alle identene i TPS, burde bli manuelt sjekket for overlapp. " + - "Kan også være mulig at man prøver å initialisere et miljø som er allerede initialisert"); - } - if (nonNull(response)) { - response.getFailedStatus().forEach(s -> log.error("Status på feilende melding: {}", s)); - } - }); - } - - public void opprettPersonerIPdl(TpsIdentListe tpsIdentListe) { - try { - personConsumer.opprettPersoner(tpsIdentListe); - } catch (Exception e) { - log.info("En eller flere personer ble ikke opprettet i PDL, og fikk dermed ikke aktør-id"); - } - } - - public TpsIdentListe save(TpsIdentListe liste, Boolean genererManglendeNavn) { - var tpsIdentListe = genererManglendeNavn ? leggTilNavn(liste) : liste; - - return tpsIdenterAdapter.save(tpsIdentListe); - } - - private TpsIdentListe leggTilNavn(TpsIdentListe liste) { - var tpsIdentListe = liste.stream().map(ident -> { - if (ident.getLastName() == null || ident.getFirstName() == null) { - var navn = genererNavnConsumer.genereNavn(); - return new TpsIdent(ident.getFnr(), - navn.getAdjektiv(), - navn.getSubstantiv(), - ident.getAddress(), - ident.getPostNr(), - ident.getCity(), - ident.getGruppe(), - ident.getOpprinnelse(), - ident.getTags()); - } else { - return ident; - } - }).toList(); - return new TpsIdentListe(tpsIdentListe); - } -} diff --git a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/service/PersonService.java b/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/service/PersonService.java deleted file mode 100644 index 0dc3848a3f7..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/service/PersonService.java +++ /dev/null @@ -1,52 +0,0 @@ -package no.nav.registre.sdforvalter.service; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; - -import no.nav.registre.sdforvalter.adapter.TpsIdenterAdapter; -import no.nav.registre.sdforvalter.consumer.rs.person.PersonConsumer; -import no.nav.registre.sdforvalter.domain.TpsIdent; -import no.nav.registre.sdforvalter.domain.TpsIdentListe; -import no.nav.registre.sdforvalter.domain.person.Person; -import no.nav.registre.sdforvalter.domain.person.PersonStatus; -import no.nav.registre.sdforvalter.domain.person.PersonStatusMap; - -@Service -@RequiredArgsConstructor -public class PersonService { - private final PersonConsumer personConsumer; - private final TpsIdenterAdapter tpsIdenterAdapter; - - public PersonStatusMap getStatusMap(String gruppe, Boolean equal) { - TpsIdentListe tpsIdentListe = tpsIdenterAdapter.fetchBy(gruppe); - Set identer = tpsIdentListe.stream().map(TpsIdent::getFnr).collect(Collectors.toSet()); - Map personMap = personConsumer - .hentPersoner(identer) - .stream() - .filter(Objects::nonNull) - .collect(Collectors.toMap(Person::getFnr, person -> person)); - - return new PersonStatusMap( - tpsIdentListe - .stream() - .map(ident -> new PersonStatus(new Person(ident), personMap.get(ident.getFnr()))) - .filter(personStatus -> equal == null || personStatus.isEqual() == equal) - .toList() - ); - } - - public List getPerson(String gruppe) { - TpsIdentListe tpsIdentListe = tpsIdenterAdapter.fetchBy(gruppe); - return tpsIdentListe.stream().map(Person::new).toList(); - } - - public TpsIdent getPersonByIdent(String ident) { - return tpsIdenterAdapter.fetchByIdent(ident); - } -} diff --git a/apps/testnorge-statisk-data-forvalter/src/main/resources/application-local.yml b/apps/testnorge-statisk-data-forvalter/src/main/resources/application-local.yml index 48233b76ecf..4e356d4f598 100644 --- a/apps/testnorge-statisk-data-forvalter/src/main/resources/application-local.yml +++ b/apps/testnorge-statisk-data-forvalter/src/main/resources/application-local.yml @@ -18,24 +18,11 @@ spring: ereg.api: dummy -tps: - statisk: - avspillergruppeId: 1 - VAULT_URL: dummy -server: - port: 4390 - consumers: testnav-bruker-service: name: testnav-bruker-service-dev url: https://testnav-bruker-service-dev.intern.dev.nav.no - tps-forvalteren-proxy: - url: https://tps-forvalteren-proxy.dev-fss-pub.nais.io - testnorge-hodejegeren: - url: https://testnorge-hodejegeren.intern.dev.nav.no - testnorge-tp: - url: https://testnorge-tp.intern.dev.nav.no synthdata-aareg: url: https://nais-synthdata-aareg.dev.intern.nav.no \ No newline at end of file diff --git a/apps/testnorge-statisk-data-forvalter/src/main/resources/application.yml b/apps/testnorge-statisk-data-forvalter/src/main/resources/application.yml index da286bffcbd..c5394d92d07 100644 --- a/apps/testnorge-statisk-data-forvalter/src/main/resources/application.yml +++ b/apps/testnorge-statisk-data-forvalter/src/main/resources/application.yml @@ -38,12 +38,6 @@ kafka: groupid: organisasjon-forvalter-v1 consumers: - person: - url: https://testnav-person-service.intern.dev.nav.no - threads: 5 - cluster: dev-gcp - namespace: dolly - name: testnav-person-service generer-navn-service: url: https://generer-navn-service.intern.dev.nav.no cluster: dev-gcp @@ -65,21 +59,6 @@ consumers: name: testnav-person-faste-data-service cluster: dev-gcp namespace: dolly - tps-forvalteren-proxy: - url: http://tps-forvalteren-proxy.dolly.svc.nais.local - cluster: dev-fss - namespace: dolly - name: tps-forvalteren-proxy - testnorge-hodejegeren: - url: http://testnorge-hodejegeren.dolly.svc.nais.local - name: testnorge-hodejegeren - cluster: dev-fss - namespace: dolly - testnorge-tp: - url: http://testnorge-tp.dolly.svc.nais.local - name: testnorge-tp - cluster: dev-fss - namespace: dolly krr-stub: url: https://krr-stub-%s.dev.intern.nav.no/api synthdata-aareg: diff --git a/apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/TpsfConsumerTest.java b/apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/TpsfConsumerTest.java deleted file mode 100644 index 3b197209171..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/consumer/rs/tpsf/TpsfConsumerTest.java +++ /dev/null @@ -1,106 +0,0 @@ -package no.nav.registre.sdforvalter.consumer.rs.tpsf; - -import no.nav.testnav.libs.securitycore.domain.AccessToken; -import no.nav.testnav.libs.securitycore.domain.ServerProperties; -import no.nav.testnav.libs.servletsecurity.exchange.TokenExchange; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentMatchers; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; -import reactor.core.publisher.Mono; - -import java.util.ArrayList; -import java.util.List; - -import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; -import static com.github.tomakehurst.wiremock.client.WireMock.post; -import static com.github.tomakehurst.wiremock.client.WireMock.get; -import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo; -import static com.github.tomakehurst.wiremock.client.WireMock.equalToJson; -import static com.github.tomakehurst.wiremock.client.WireMock.ok; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.when; - -@RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@AutoConfigureWireMock(port = 0) -@TestPropertySource(locations = "classpath:application-test.yml") -@ActiveProfiles("test") -public class TpsfConsumerTest { - - @MockBean - private TokenExchange tokenService; - - @Autowired - private TpsfConsumer tpsfConsumer; - - private final long avspillergruppeId = 10L; - private final String environment = "t9"; - private List ids; - private int expectedAntallSendte; - private int expectedAntallFeilet; - private String expectedFoedselnummer; - private Long expectedSekvensnummer; - private String expectedStatus; - - @Before - public void before() { - when(tokenService.exchange(ArgumentMatchers.any(ServerProperties.class))).thenReturn(Mono.just(new AccessToken("token"))); - } - - @Test - public void shouldSendSkdMeldingTilTpsf() { - ids = new ArrayList<>(); - ids.add(123L); - ids.add(321L); - - expectedAntallSendte = 1; - expectedAntallFeilet = 0; - expectedFoedselnummer = "01010101010"; - expectedSekvensnummer = 10L; - expectedStatus = "ok"; - - stubTpsfConsumerSendSkdMelding(); - stubTpsfGetMeldingsIder(); - - var response = tpsfConsumer.sendTilTps(avspillergruppeId, environment).block(); - - assertThat(response).isNotNull(); - assertThat(expectedAntallSendte).isEqualTo(response.getAntallSendte()); - assertThat(expectedAntallFeilet).isEqualTo(response.getAntallFeilet()); - - assertThat(expectedFoedselnummer).isEqualTo(response.getStatusFraFeilendeMeldinger().get(0).getFoedselsnummer()); - assertThat(expectedSekvensnummer).isEqualTo(response.getStatusFraFeilendeMeldinger().get(0).getSekvensnummer()); - assertThat(expectedStatus).isEqualTo(response.getStatusFraFeilendeMeldinger().get(0).getStatus()); - } - - - private void stubTpsfConsumerSendSkdMelding() { - stubFor(post(urlPathEqualTo("/tpsf/api/v1/endringsmelding/skd/send/" + avspillergruppeId)) - .withRequestBody(equalToJson( - "{\"environment\":\"" + environment - + "\",\"ids\":[" + ids.get(0) + ", " + ids.get(1) + "]}")) - .willReturn(ok() - .withHeader("content-type", "application/json") - .withBody("{\"antallSendte\": \"" + expectedAntallSendte - + "\", \"antallFeilet\": \"" + expectedAntallFeilet - + "\", \"statusFraFeilendeMeldinger\": [{\"foedselsnummer\": \"" + expectedFoedselnummer - + "\", \"sekvensnummer\": " + expectedSekvensnummer - + ", \"status\": \"" + expectedStatus + "\"}]}"))); - } - - private void stubTpsfGetMeldingsIder() { - stubFor(get(urlPathEqualTo("/tpsf/api/v1/endringsmelding/skd/meldinger/" + avspillergruppeId)) - .willReturn(ok() - .withHeader("content-type", "application/json") - .withBody("[" + ids.get(0) + ", " + ids.get(1) + "]"))); - } - -} diff --git a/apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/FileControllerIntegrationTest.java b/apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/FileControllerIntegrationTest.java deleted file mode 100644 index c352d42c142..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/FileControllerIntegrationTest.java +++ /dev/null @@ -1,147 +0,0 @@ -package no.nav.registre.sdforvalter.provider.rs; - -import no.nav.registre.sdforvalter.database.model.GruppeModel; -import no.nav.registre.sdforvalter.database.model.OpprinnelseModel; -import no.nav.registre.sdforvalter.database.model.TpsIdentModel; -import no.nav.registre.sdforvalter.database.repository.*; -import no.nav.registre.sdforvalter.domain.TpsIdent; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; - -import java.util.List; -import java.util.Set; - -import static com.github.tomakehurst.wiremock.client.WireMock.reset; -import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.jwt; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@ExtendWith(MockitoExtension.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@AutoConfigureWireMock(port = 0) -@AutoConfigureMockMvc -@TestPropertySource( - locations = "classpath:application-test.yml" -) -class FileControllerIntegrationTest { - - @Autowired - private MockMvc mvc; - - @Autowired - private TpsIdenterRepository tpsIdenterRepository; - @Autowired - private GruppeRepository gruppeRepository; - @Autowired - private OpprinnelseRepository opprinnelseRepository; - @Autowired - private TagRepository tagRepository; - @Autowired - private EregTagRepository eregTagRepository; - @Autowired - private TpsIdentTagRepository tpsIdentTagRepository; - - @BeforeEach - public void setup() { - GruppeModel gruppeModel = new GruppeModel(null, "Gruppen", "Gruppenbeskrivelse"); - gruppeRepository.save(gruppeModel); - - OpprinnelseModel opprinnelseModel = new OpprinnelseModel(null, "Test"); - opprinnelseRepository.save(opprinnelseModel); - } - - public void assertListOfPersonsFromCsvIsSavedInDatabase(List expectedTpsIdenterListe, String csvInnhold) throws Exception { - - MockHttpServletRequestBuilder builder = MockMvcRequestBuilders - .multipart("/api/v1/faste-data/file/tpsIdenter") - .file("file", csvInnhold.getBytes()) - .with(jwt()) - .characterEncoding("UTF_8"); - - mvc.perform(builder).andExpect(status().isOk()); - - assertThat(tpsIdenterRepository.findAll()) - .containsAll(expectedTpsIdenterListe); - - } - - @AfterEach - public void cleanUp() { - reset(); - eregTagRepository.deleteAll(); - tpsIdentTagRepository.deleteAll(); - tagRepository.deleteAll(); - tpsIdenterRepository.deleteAll(); - opprinnelseRepository.deleteAll(); - gruppeRepository.deleteAll(); - } - - @Test - void should_save_one_ident_from_csv_to_tps_ident_database() throws Exception { - String csvInnhold = "FNR*;Fornavn;Etternavn;Adresse;Postnummer;Poststed;Gruppe;Opprinnelse;Tags\n" + - "12345678912;Dolly;Dollesen;Dollygata 2;9999;Dollyville;Gruppen;Test;OTP"; - - TpsIdent expectedTpsPerson = TpsIdent.builder() - .fnr("12345678912") - .firstName("Dolly") - .lastName("Dollesen") - .address("Dollygata 2") - .postNr("9999") - .city("Dollyville") - .tags(Set.of("OTP")) - .build(); - List expectedTpsIdenterListe = List.of(new TpsIdentModel( - expectedTpsPerson, - new OpprinnelseModel(null, "Test"), - new GruppeModel(null, "Gruppen", "Gruppenbeskrivelse") - ) - ); - - assertListOfPersonsFromCsvIsSavedInDatabase(expectedTpsIdenterListe, csvInnhold); - } - - @Test - void should_save_two_idents_from_csv_to_tps_ident_database() throws Exception { - String csvInnhold = """ - FNR*;Fornavn;Etternavn;Adresse;Postnummer;Poststed;Gruppe;Opprinnelse;Tags - 12345678910;Dolly;Dollesen;Dollygata 2;9999;Dollyville;Gruppen;Test;OTP - 12345678911;Donald;Dollesen;Dollygata 3;2222;Dollyby;Gruppen;Test;"""; - - TpsIdent expectedTpsPerson1 = TpsIdent.builder() - .fnr("12345678910") - .firstName("Dolly") - .lastName("Dollesen") - .address("Dollygata 2") - .postNr("9999") - .city("Dollyville") - .tags(Set.of("OTP")) - .build(); - TpsIdent expectedTpsPerson2 = TpsIdent.builder() - .fnr("12345678911") - .firstName("Donald") - .lastName("Dollesen") - .address("Dollygata 3") - .postNr("2222") - .city("Dollyby") - .build(); - var opprinnelse = new OpprinnelseModel(null, "Test"); - var gruppe = new GruppeModel(null, "Gruppen", "Gruppenbeskrivelse"); - List expectedTpsIdenterListe = List.of( - new TpsIdentModel(expectedTpsPerson1, opprinnelse, gruppe), - new TpsIdentModel(expectedTpsPerson2, opprinnelse, gruppe) - ); - - assertListOfPersonsFromCsvIsSavedInDatabase(expectedTpsIdenterListe, csvInnhold); - } -} diff --git a/apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/OrkestreringsControllerAaregIntegrationTest.java b/apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/OrkestreringControllerAaregIntegrationTest.java similarity index 98% rename from apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/OrkestreringsControllerAaregIntegrationTest.java rename to apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/OrkestreringControllerAaregIntegrationTest.java index dd7e900ab3c..e402a493d0a 100644 --- a/apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/OrkestreringsControllerAaregIntegrationTest.java +++ b/apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/OrkestreringControllerAaregIntegrationTest.java @@ -1,22 +1,19 @@ package no.nav.registre.sdforvalter.provider.rs; -import static com.github.tomakehurst.wiremock.client.WireMock.reset; -import static no.nav.registre.sdforvalter.ResourceUtils.getResourceFileContent; -import static org.mockito.Mockito.when; -import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.jwt; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import no.nav.registre.sdforvalter.consumer.rs.aareg.request.RsAaregSyntetiseringsRequest; import no.nav.registre.sdforvalter.consumer.rs.kodeverk.response.KodeverkResponse; +import no.nav.registre.sdforvalter.database.model.AaregModel; +import no.nav.registre.sdforvalter.database.repository.AaregRepository; import no.nav.testnav.libs.dto.aareg.v1.Arbeidsforhold; import no.nav.testnav.libs.securitycore.domain.AccessToken; import no.nav.testnav.libs.securitycore.domain.ServerProperties; import no.nav.testnav.libs.servletsecurity.exchange.TokenExchange; +import no.nav.testnav.libs.testing.JsonWiremockHelper; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.beans.factory.annotation.Autowired; @@ -29,18 +26,18 @@ import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.TestPropertySource; import org.springframework.test.web.servlet.MockMvc; -import com.fasterxml.jackson.core.type.TypeReference; - +import reactor.core.publisher.Mono; import java.util.Collections; import java.util.List; -import no.nav.registre.sdforvalter.database.model.AaregModel; -import no.nav.registre.sdforvalter.database.repository.AaregRepository; -import no.nav.testnav.libs.testing.JsonWiremockHelper; -import reactor.core.publisher.Mono; - +import static com.github.tomakehurst.wiremock.client.WireMock.reset; +import static no.nav.registre.sdforvalter.ResourceUtils.getResourceFileContent; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.jwt; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @ExtendWith(MockitoExtension.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @@ -48,7 +45,7 @@ @AutoConfigureMockMvc @TestPropertySource(locations = "classpath:application-test.yml") @ActiveProfiles("test") -class OrkestreringsControllerAaregIntegrationTest { +class OrkestreringControllerAaregIntegrationTest { @Autowired private MockMvc mvc; @@ -69,7 +66,7 @@ class OrkestreringsControllerAaregIntegrationTest { private final String tokenResponse = "{\"access_token\": \"dummy\"}"; private final KodeverkResponse kodeverkResponse = new KodeverkResponse(Collections.singletonList("yrke")); private static String syntString; - private TypeReference> SYNT_RESPONSE = new TypeReference<>() { + private final TypeReference> SYNT_RESPONSE = new TypeReference<>() { }; @BeforeAll diff --git a/apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/OrkestreringsControllerKrrIntegrationTest.java b/apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/OrkestreringControllerKrrIntegrationTest.java similarity index 89% rename from apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/OrkestreringsControllerKrrIntegrationTest.java rename to apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/OrkestreringControllerKrrIntegrationTest.java index 6f1b6f6d8a5..72594780743 100644 --- a/apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/OrkestreringsControllerKrrIntegrationTest.java +++ b/apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/OrkestreringControllerKrrIntegrationTest.java @@ -29,7 +29,7 @@ @AutoConfigureWireMock(port = 0) @AutoConfigureMockMvc(addFilters = false) @DirtiesContext -class OrkestreringsControllerKrrIntegrationTest { +class OrkestreringControllerKrrIntegrationTest { @Autowired private MockMvc mockMvc; @@ -46,16 +46,6 @@ public void cleanUp() { repository.deleteAll(); } - private KrrModel createKrr(String fnr) { - KrrModel model = new KrrModel(); - model.setFnr(fnr); - return model; - } - - private KrrRequest createKrrRequest(KrrModel model) { - return new KrrRequest(new Krr(model)); - } - @Test void shouldInitiateKrrFromDatabase() throws Exception { diff --git a/apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/OrkestreringsControllerIdentIntegrationTest.java b/apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/OrkestreringsControllerIdentIntegrationTest.java deleted file mode 100644 index df43218bc2a..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/OrkestreringsControllerIdentIntegrationTest.java +++ /dev/null @@ -1,185 +0,0 @@ -package no.nav.registre.sdforvalter.provider.rs; - -import static com.github.tomakehurst.wiremock.client.WireMock.reset; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; -import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.jwt; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import com.fasterxml.jackson.databind.ObjectMapper; -import no.nav.registre.sdforvalter.consumer.rs.tpsf.request.SendToTpsRequest; -import no.nav.registre.sdforvalter.consumer.rs.tpsf.response.SkdMeldingerTilTpsRespons; -import no.nav.testnav.libs.securitycore.domain.AccessToken; -import no.nav.testnav.libs.securitycore.domain.ServerProperties; -import no.nav.testnav.libs.servletsecurity.exchange.TokenExchange; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.web.servlet.MockMvc; - -import java.util.Collections; -import java.util.List; - -import no.nav.registre.sdforvalter.database.model.TpsIdentModel; -import no.nav.registre.sdforvalter.database.repository.TpsIdenterRepository; -import no.nav.testnav.libs.testing.JsonWiremockHelper; -import reactor.core.publisher.Mono; - -@ExtendWith(MockitoExtension.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@AutoConfigureWireMock(port = 0) -@AutoConfigureMockMvc -@TestPropertySource(locations = "classpath:application-test.yml") -@ActiveProfiles("test") -class OrkestreringsControllerIdentIntegrationTest { - - @Value("${tps.statisk.avspillergruppeId}") - private Long staticDataPlaygroup; - - private static final String ENVIRONMENT = "t1"; - private static final String FNR = "01010101011"; - - @Autowired - private MockMvc mvc; - - @MockBean - private TokenExchange tokenExchange; - - @Autowired - private ObjectMapper objectMapper; - - @Autowired - private TpsIdenterRepository tpsIdenterRepository; - - private String hodejegerenUrlPattern; - private String levendeIdenterUrlPattern; - private String tpsfGetMeldingerUrlPattern; - private String tpsfSendSkdmeldingerUrlPattern; - private String tpOpprettPersonerUrlPattern; - private List identer = Collections.singletonList(FNR); - private List skdMeldinger = Collections.singletonList(1234567L); - private final String tokenResponse = "{\"access_token\": \"dummy\"}"; - - @BeforeEach - public void setup() { - hodejegerenUrlPattern = "(.*)/hodejegeren/api/v1/alle-identer/" + staticDataPlaygroup; - levendeIdenterUrlPattern = "(.*)/hodejegeren/api/v1/levende-identer/" + staticDataPlaygroup; - tpsfGetMeldingerUrlPattern = "(.*)/tpsf/api/v1/endringsmelding/skd/meldinger/" + staticDataPlaygroup; - tpsfSendSkdmeldingerUrlPattern = "(.*)/tpsf/api/v1/endringsmelding/skd/send/" + staticDataPlaygroup; - tpOpprettPersonerUrlPattern = "(.*)/testnorge-tp/api/v1/orkestrering/opprettPersoner/" + ENVIRONMENT; - - JsonWiremockHelper.builder(objectMapper).withUrlPathMatching("(.*)/v1/orkestrering/opprettPersoner/(.*)").stubPost(HttpStatus.OK); - } - - - @Test - void shouldInitiateIdent() throws Exception { - final TpsIdentModel tpsIdent = create(FNR, "Test", "Testen"); - tpsIdenterRepository.save(tpsIdent); - - var sendToTpsfRequest = new SendToTpsRequest(ENVIRONMENT, skdMeldinger); - var skdResponse = SkdMeldingerTilTpsRespons.builder() - .antallSendte(1) - .antallFeilet(0) - .build(); - - when(tokenExchange.exchange(any(ServerProperties.class))).thenReturn(Mono.just(new AccessToken("dummy"))); - - JsonWiremockHelper - .builder(objectMapper) - .withUrlPathMatching(hodejegerenUrlPattern) - .withResponseBody(Collections.EMPTY_SET) - .stubGet(); - - JsonWiremockHelper - .builder(objectMapper) - .withUrlPathMatching(tpsfGetMeldingerUrlPattern) - .withResponseBody(Collections.singletonList((1234567))) - .stubGet(); - - JsonWiremockHelper - .builder(objectMapper) - .withUrlPathMatching(tpsfSendSkdmeldingerUrlPattern) - .withRequestBody(sendToTpsfRequest) - .withResponseBody(skdResponse) - .stubPost(HttpStatus.OK); - - JsonWiremockHelper - .builder(objectMapper) - .withUrlPathMatching(levendeIdenterUrlPattern) - .withResponseBody(identer) - .stubGet(); - - JsonWiremockHelper - .builder(objectMapper) - .withUrlPathMatching(tpOpprettPersonerUrlPattern) - .withRequestBody(identer) - .withResponseBody(identer) - .stubPost(HttpStatus.OK); - - mvc.perform(post("/api/v1/orkestrering/tps/" + ENVIRONMENT) - .contentType(MediaType.APPLICATION_JSON).with(jwt())) - .andExpect(status().isOk()); - - JsonWiremockHelper - .builder(objectMapper) - .withUrlPathMatching(hodejegerenUrlPattern) - .withResponseBody(Collections.EMPTY_SET) - .verifyGet(); - - JsonWiremockHelper - .builder(objectMapper) - .withUrlPathMatching(tpsfGetMeldingerUrlPattern) - .withResponseBody(Collections.singletonList((1234567))) - .verifyGet(); - - JsonWiremockHelper - .builder(objectMapper) - .withUrlPathMatching(tpsfSendSkdmeldingerUrlPattern) - .withRequestBody(sendToTpsfRequest) - .withResponseBody(skdResponse) - .verifyPost(); - - JsonWiremockHelper - .builder(objectMapper) - .withUrlPathMatching(levendeIdenterUrlPattern) - .withResponseBody(identer) - .verifyGet(); - - JsonWiremockHelper - .builder(objectMapper) - .withUrlPathMatching(tpOpprettPersonerUrlPattern) - .withRequestBody(identer) - .withResponseBody(identer) - .verifyPost(); - } - - private TpsIdentModel create(String fnr, String firstName, String lastName) { - TpsIdentModel model = new TpsIdentModel(); - model.setFnr(fnr); - model.setFirstName(firstName); - model.setLastName(lastName); - return model; - } - - @AfterEach - public void cleanUp() { - reset(); - tpsIdenterRepository.deleteAll(); - } - - -} diff --git a/apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/v1/StaticDataControllerV1TpsIntegrationTest.java b/apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/v1/StaticDataControllerV1TpsIntegrationTest.java deleted file mode 100644 index 23ebb9a3398..00000000000 --- a/apps/testnorge-statisk-data-forvalter/src/test/java/no/nav/registre/sdforvalter/provider/rs/v1/StaticDataControllerV1TpsIntegrationTest.java +++ /dev/null @@ -1,145 +0,0 @@ -package no.nav.registre.sdforvalter.provider.rs.v1; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.Lists; - -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.MediaType; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.web.servlet.MockMvc; - -import java.util.ArrayList; -import java.util.Arrays; - -import no.nav.registre.sdforvalter.database.model.OpprinnelseModel; -import no.nav.registre.sdforvalter.database.model.TpsIdentModel; -import no.nav.registre.sdforvalter.database.repository.OpprinnelseRepository; -import no.nav.registre.sdforvalter.database.repository.TpsIdenterRepository; -import no.nav.registre.sdforvalter.domain.Opprinnelse; -import no.nav.registre.sdforvalter.domain.TpsIdent; -import no.nav.registre.sdforvalter.domain.TpsIdentListe; - -import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.jwt; - - -@ExtendWith(MockitoExtension.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@AutoConfigureMockMvc -@TestPropertySource( - locations = "classpath:application-test.yml" -) -class StaticDataControllerV1TpsIntegrationTest { - @Autowired - private MockMvc mvc; - - @Autowired - private ObjectMapper objectMapper; - - @Autowired - private TpsIdenterRepository tpsIdenterRepository; - - @Autowired - private OpprinnelseRepository opprinnelseRepository; - - @Test - void shouldGiveUnauthorizedWithoutJwt() throws Exception { - - TpsIdent tpsIdent = createIdent("01010101011", "Petter", "Petterson"); - mvc.perform(post("/api/v1/faste-data/tps?genererManglendeNavn=false") - .content(objectMapper.writeValueAsString(createTpsIdenter(tpsIdent))) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isUnauthorized()); - } - - @Test - void shouldGetTpsIdentSetWithOpprinnelse() throws Exception { - OpprinnelseModel altinn = opprinnelseRepository.save(new OpprinnelseModel("Altinn")); - TpsIdentModel tpsIdentModel = createIdentModel("01010101011", "Petter", "Petterson", altinn); - tpsIdenterRepository.save(tpsIdentModel); - - String json = mvc.perform(get("/api/v1/faste-data/tps?genererManglendeNavn=false") - .contentType(MediaType.APPLICATION_JSON).with(jwt())) - .andExpect(status().isOk()) - .andReturn() - .getResponse() - .getContentAsString(); - - TpsIdentListe response = objectMapper.readValue(json, TpsIdentListe.class); - assertThat(response.getListe()).containsOnly(new TpsIdent(tpsIdentModel, new ArrayList<>())); - } - - @Test - void shouldAddTpsIdentSetToDatabase() throws Exception { - - TpsIdent tpsIdent = createIdent("01010101011", "Petter", "Petterson"); - mvc.perform(post("/api/v1/faste-data/tps?genererManglendeNavn=false") - .content(objectMapper.writeValueAsString(createTpsIdenter(tpsIdent))) - .contentType(MediaType.APPLICATION_JSON).with(jwt())) - .andExpect(status().isOk()); - - assertThat(tpsIdenterRepository.findAll()).containsOnly(new TpsIdentModel(tpsIdent, null, null)); - } - - @Test - void shouldAddOpprinnelseToDatabase() throws Exception { - Opprinnelse altinn = new Opprinnelse("Altinn"); - final TpsIdent hans = createIdent("01010101011", "Hans", "Hansen"); - final TpsIdent petter = createIdent("01010101021", "Petter", "Petterson", altinn); - - mvc.perform(post("/api/v1/faste-data/tps?genererManglendeNavn=false") - .content(objectMapper.writeValueAsString(createTpsIdenter(hans, petter))) - .contentType(MediaType.APPLICATION_JSON).with(jwt())) - .andExpect(status().isOk()); - - assertThat(Lists.newArrayList(opprinnelseRepository.findAll())) - .hasSize(1) - .first() - .isEqualToComparingOnlyGivenFields( - new OpprinnelseModel(altinn), - "navn" - ); - } - - @AfterEach - public void cleanUp() { - tpsIdenterRepository.deleteAll(); - opprinnelseRepository.deleteAll(); - } - - - private TpsIdentModel createIdentModel(String fnr, String firstName, String lastName, OpprinnelseModel opprinnelseModel) { - TpsIdentModel model = new TpsIdentModel(); - model.setFnr(fnr); - model.setFirstName(firstName); - model.setLastName(lastName); - model.setOpprinnelseModel(opprinnelseModel); - return model; - } - - private TpsIdentModel createIdentModel(String fnr, String firstName, String lastName) { - return createIdentModel(fnr, firstName, lastName, null); - } - - private TpsIdent createIdent(String fnr, String firstName, String lastName) { - return new TpsIdent(createIdentModel(fnr, firstName, lastName), new ArrayList<>()); - } - - private TpsIdent createIdent(String fnr, String firstName, String lastName, Opprinnelse opprinnelse) { - return new TpsIdent(createIdentModel(fnr, firstName, lastName, new OpprinnelseModel(opprinnelse)), new ArrayList<>()); - } - - private TpsIdentListe createTpsIdenter(TpsIdent... tpsIdenter) { - return new TpsIdentListe(Arrays.asList(tpsIdenter)); - } -} diff --git a/apps/testnorge-statisk-data-forvalter/src/test/resources/application-test.yml b/apps/testnorge-statisk-data-forvalter/src/test/resources/application-test.yml index 1987a95c5e4..796bbf785f2 100644 --- a/apps/testnorge-statisk-data-forvalter/src/test/resources/application-test.yml +++ b/apps/testnorge-statisk-data-forvalter/src/test/resources/application-test.yml @@ -18,12 +18,6 @@ spring: AAD_ISSUER_URI: http://localhost:${wiremock.server.port:0}/token consumers: - person: - url: http://localhost:${wiremock.server.port:0}/person - cluster: dummy - namespace: dummy - name: testnav-person-service-test - threads: 5 generer-navn-service: url: http://localhost:${wiremock.server.port:0}/generer-navn cluster: dummy @@ -45,15 +39,6 @@ consumers: name: testnav-person-faste-data-service cluster: dummy namespace: dolly - tps-forvalteren-proxy: - url: http://localhost:${wiremock.server.port:0}/tpsf - cluster: dev-fss - namespace: dummy - name: tps-forvalteren-proxy - testnorge-hodejegeren: - url: http://localhost:${wiremock.server.port:0}/hodejegeren - testnorge-tp: - url: http://localhost:${wiremock.server.port:0}/testnorge-tp krr-stub: url: http://localhost:${wiremock.server.port:0}/krr-stub/api synthdata-aareg: @@ -69,8 +54,6 @@ consumers: aareg: pageSize: 2 -tps.statisk.avspillergruppeId: 1 - controller.staticdata.cache.hours: 24 azure.app.client.id: dummy diff --git a/apps/testnorge-tp/Dockerfile b/apps/testnorge-tp/Dockerfile deleted file mode 100644 index 44c2cf1c827..00000000000 --- a/apps/testnorge-tp/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM ghcr.io/navikt/baseimages/temurin:21 -LABEL maintainer="Team Registre" - -ADD /build/libs/app.jar /app/app.jar - -ENV JAVA_OPTS="-Dspring.profiles.active=prod" - -EXPOSE 8080 \ No newline at end of file diff --git a/apps/testnorge-tp/README.md b/apps/testnorge-tp/README.md deleted file mode 100644 index 677f3d12383..00000000000 --- a/apps/testnorge-tp/README.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -layout: default -title: Testnorge TP -parent: Applikasjoner ---- - -# Testnorge-TP -Testnorge-TP (Tjeneste Pensjon) er integrasjonen mellom Orkestratoren og TJPEN databasen. Testnorge-TP går mot TJPEN i gitte miljøer. - -## Swagger -Swagger finnes under [/api](https://testnorge-tp.dev.intern.nav.no/api) -endepunktet til applikasjonen. - -## Lokal kjøring -Ha naisdevice kjørende og kjør TestnorgeTpApplicationStarter med følgende argumenter: -``` --Dspring.cloud.vault.token=[kopier token fra vault] --Dspring.profiles.active=local -``` - -### Utviklerimage -I utviklerimage brukes ikke naisdevice og du må legge til følgende ekstra argumenter: -``` --Djavax.net.ssl.trustStore=[path til lokal truststore] --Djavax.net.ssl.trustStorePassword=[passord til lokal truststore] -``` \ No newline at end of file diff --git a/apps/testnorge-tp/build.gradle b/apps/testnorge-tp/build.gradle deleted file mode 100644 index 362799e7848..00000000000 --- a/apps/testnorge-tp/build.gradle +++ /dev/null @@ -1,84 +0,0 @@ -plugins { - id 'java' - id "org.sonarqube" version "4.0.0.2929" - id 'org.springframework.boot' version "3.1.4" - id 'io.spring.dependency-management' version "1.1.3" - id "jacoco" -} - -test { - useJUnitPlatform() -} - -jacocoTestReport { - reports { - xml.required = true - } -} - -sonarqube { - properties { - property "sonar.coverage.jacoco.xmlReportPaths", "${project.buildDir}/reports/jacoco/test/jacocoTestReport.xml" - property "sonar.dynamicAnalysis", "reuseReports" - property "sonar.host.url", "https://sonarcloud.io" - property "sonar.java.coveragePlugin", "jacoco" - property "sonar.language", "java" - property "sonar.login", System.getenv("SONAR_TOKEN") - property "sonar.organization", "navikt" - property "sonar.project.monorepo.enabled", true - property "sonar.projectKey", "testnorge-tp" - property "sonar.projectName", "testnorge-tp" - property "sonar.sourceEncoding", "UTF-8" - } -} - -bootJar { - archiveFileName = "app.jar" -} - -dependencyManagement { - applyMavenExclusions = false - imports { - mavenBom 'org.springframework.cloud:spring-cloud-dependencies:2022.0.4' - } -} - -repositories { - mavenCentral() - mavenLocal() -} - -dependencies { - implementation 'no.nav.testnav.libs:security-core' - implementation 'no.nav.testnav.libs:servlet-core' - implementation 'no.nav.testnav.libs:servlet-security' - - - implementation 'org.springframework.cloud:spring-cloud-starter-vault-config' - - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-webflux' - implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' - implementation 'org.springframework.boot:spring-boot-configuration-processor' - - implementation 'jakarta.validation:jakarta.validation-api:3.0.2' - - implementation 'net.logstash.logback:logstash-logback-encoder:7.4' - - implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0' - - implementation 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' - testAnnotationProcessor 'org.projectlombok:lombok' - - testImplementation 'junit:junit:4.13.2' //TODO upgrade to JUnit5 - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'org.springframework.cloud:spring-cloud-contract-wiremock' -} - -description = 'testnorge-tp' -java { - toolchain { - languageVersion = JavaLanguageVersion.of(21) - } -} diff --git a/apps/testnorge-tp/config.yml b/apps/testnorge-tp/config.yml deleted file mode 100644 index 63a0c2c3c80..00000000000 --- a/apps/testnorge-tp/config.yml +++ /dev/null @@ -1,52 +0,0 @@ -apiVersion: "nais.io/v1alpha1" -kind: "Application" -metadata: - name: testnorge-tp - namespace: dolly - labels: - team: dolly -spec: - port: 8080 - liveness: - path: /internal/isAlive - periodSeconds: 30 - initialDelay: 30 - readiness: - path: /internal/isReady - initialDelay: 30 - prometheus: - enabled: true - path: /internal/metrics - replicas: - min: 1 - max: 1 - resources: - limits: - memory: 2048Mi - requests: - cpu: 500m - memory: 1024Mi - image: {{ image }} - ingresses: - - "https://testnorge-tp.dev.intern.nav.no" # dev-fss - webproxy: true - azure: - application: - allowAllUsers: true - enabled: true - tenant: nav.no - accessPolicy: - inbound: - rules: - - application: testnorge-statisk-data-forvalter - - application: testnav-oversikt-frontend - cluster: dev-gcp - - application: team-dolly-lokal-app - cluster: dev-gcp - outbound: - rules: - - application: testnorge-hodejegeren - - application: pensjon-testdata-server-q1 - namespace: pensjontestdata - - application: pensjon-testdata-server-q2 - namespace: pensjontestdata diff --git a/apps/testnorge-tp/gradle/wrapper/gradle-wrapper.jar b/apps/testnorge-tp/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL diff --git a/apps/testnorge-tp/gradle/wrapper/gradle-wrapper.properties b/apps/testnorge-tp/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index e411586a54a..00000000000 --- a/apps/testnorge-tp/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/apps/testnorge-tp/gradlew b/apps/testnorge-tp/gradlew deleted file mode 100755 index 3da45c161b0..00000000000 --- a/apps/testnorge-tp/gradlew +++ /dev/null @@ -1,234 +0,0 @@ -#!/bin/sh - -# -# Copyright ? 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions ?$var?, ?${var}?, ?${var:-default}?, ?${var+SET}?, -# ?${var#prefix}?, ?${var%suffix}?, and ?$( cmd )?; -# * compound commands having a testable exit status, especially ?case?; -# * various built-in commands including ?command?, ?set?, and ?ulimit?. -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/apps/testnorge-tp/gradlew.bat b/apps/testnorge-tp/gradlew.bat deleted file mode 100644 index ac1b06f9382..00000000000 --- a/apps/testnorge-tp/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/apps/testnorge-tp/gradlewUpdate.sh b/apps/testnorge-tp/gradlewUpdate.sh deleted file mode 100755 index e5ee6361152..00000000000 --- a/apps/testnorge-tp/gradlewUpdate.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -gradle wrapper \ No newline at end of file diff --git a/apps/testnorge-tp/settings.gradle b/apps/testnorge-tp/settings.gradle deleted file mode 100644 index 8d15f15864d..00000000000 --- a/apps/testnorge-tp/settings.gradle +++ /dev/null @@ -1,16 +0,0 @@ -plugins { - id "com.gradle.enterprise" version "3.12.3" -} - -rootProject.name = 'testnorge-tp' - -includeBuild '../../libs/security-core' -includeBuild '../../libs/servlet-core' -includeBuild '../../libs/servlet-security' - -gradleEnterprise { - buildScan { - termsOfServiceUrl = "https://gradle.com/terms-of-service" - termsOfServiceAgree = "yes" - } -} diff --git a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/TestnorgeTpApplicationStarter.java b/apps/testnorge-tp/src/main/java/no/nav/registre/tp/TestnorgeTpApplicationStarter.java deleted file mode 100644 index 466001438e5..00000000000 --- a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/TestnorgeTpApplicationStarter.java +++ /dev/null @@ -1,12 +0,0 @@ -package no.nav.registre.tp; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class TestnorgeTpApplicationStarter { - - public static void main(String[] args) { - SpringApplication.run(TestnorgeTpApplicationStarter.class, args); - } -} diff --git a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/config/AppConfig.java b/apps/testnorge-tp/src/main/java/no/nav/registre/tp/config/AppConfig.java deleted file mode 100644 index 3c6cf8017ab..00000000000 --- a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/config/AppConfig.java +++ /dev/null @@ -1,14 +0,0 @@ -package no.nav.registre.tp.config; - -import no.nav.testnav.libs.servletcore.config.ApplicationCoreConfig; -import no.nav.testnav.libs.servletsecurity.config.SecureOAuth2ServerToServerConfiguration; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; - -@Configuration -@Import(value = { - ApplicationCoreConfig.class, - SecureOAuth2ServerToServerConfiguration.class -}) -public class AppConfig { -} diff --git a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/config/Consumers.java b/apps/testnorge-tp/src/main/java/no/nav/registre/tp/config/Consumers.java deleted file mode 100644 index dbf7fe25e30..00000000000 --- a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/config/Consumers.java +++ /dev/null @@ -1,29 +0,0 @@ -package no.nav.registre.tp.config; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import no.nav.testnav.libs.securitycore.domain.ServerProperties; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -import static lombok.AccessLevel.PACKAGE; - -/** - * Samler alle placeholders for ulike {@code consumers.*}-konfigurasjon her, dvs. subklasser av {@code ServerProperties}. - *

- * Husk at Spring Boot bruker
relaxed binding - * mellom configuration properties og field names. - * - * @see ServerProperties - */ -@Configuration -@ConfigurationProperties(prefix = "consumers") -@NoArgsConstructor(access = PACKAGE) -@Getter -@Setter(PACKAGE) -public class Consumers { - - private ServerProperties hodejegeren; - -} diff --git a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/config/OpenApiConfig.java b/apps/testnorge-tp/src/main/java/no/nav/registre/tp/config/OpenApiConfig.java deleted file mode 100644 index 211de2a53ea..00000000000 --- a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/config/OpenApiConfig.java +++ /dev/null @@ -1,68 +0,0 @@ -package no.nav.registre.tp.config; - -import io.swagger.v3.oas.models.Components; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.info.Contact; -import io.swagger.v3.oas.models.info.Info; -import io.swagger.v3.oas.models.info.License; -import io.swagger.v3.oas.models.security.SecurityRequirement; -import io.swagger.v3.oas.models.security.SecurityScheme; -import no.nav.testnav.libs.securitycore.config.UserConstant; -import no.nav.testnav.libs.servletcore.config.ApplicationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -import java.util.Arrays; - - -@Configuration -public class OpenApiConfig implements WebMvcConfigurer { - - @Bean - public OpenAPI openApi(ApplicationProperties applicationProperties) { - return new OpenAPI() - .components(new Components() - .addSecuritySchemes("bearer-jwt", new SecurityScheme() - .type(SecurityScheme.Type.HTTP) - .scheme("bearer") - .bearerFormat("JWT") - .in(SecurityScheme.In.HEADER) - .name("Authorization") - .description("Trenger ikke \"Bearer \" foran") - ) - .addSecuritySchemes("user-jwt", new SecurityScheme() - .type(SecurityScheme.Type.APIKEY) - .scheme("bearer") - .bearerFormat("JWT") - .in(SecurityScheme.In.HEADER) - .name(UserConstant.USER_HEADER_JWT) - )) - .addSecurityItem( - new SecurityRequirement() - .addList("bearer-jwt", Arrays.asList("read", "write")) - .addList("user-jwt", Arrays.asList("read", "write")) - ) - .info(new Info() - .title(applicationProperties.getName()) - .version(applicationProperties.getVersion()) - .description(applicationProperties.getDescription()) - .termsOfService("https://nav.no") - .contact(new Contact() - .url("https://nav-it.slack.com/archives/CA3P9NGA2") - .email("dolly@nav.no") - .name("Team Dolly") - ) - .license(new License() - .name("MIT License") - .url("https://opensource.org/licenses/MIT") - ) - ); - } - - @Override - public void addViewControllers(ViewControllerRegistry registry) { - registry.addViewController("/swagger").setViewName("redirect:/swagger-ui.html"); - } -} diff --git a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/config/SecurityConfig.java b/apps/testnorge-tp/src/main/java/no/nav/registre/tp/config/SecurityConfig.java deleted file mode 100644 index 2876f548482..00000000000 --- a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/config/SecurityConfig.java +++ /dev/null @@ -1,37 +0,0 @@ -package no.nav.registre.tp.config; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.annotation.Order; -import org.springframework.security.config.Customizer; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; -import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.web.SecurityFilterChain; - -@Slf4j -@Configuration -@Order(1) -public class SecurityConfig { - - @Bean - public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { - - httpSecurity.sessionManagement(sessionConfig -> sessionConfig.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) - .csrf(AbstractHttpConfigurer::disable) - .authorizeHttpRequests(authorizeConfig -> authorizeConfig.requestMatchers( - "/internal/**", - "/webjars/**", - "/swagger-resources/**", - "/v3/api-docs/**", - "/swagger-ui/**", - "/swagger", - "/error", - "/swagger-ui.html" - ).permitAll().requestMatchers("/api/**").fullyAuthenticated()) - .oauth2ResourceServer(oauth2RSConfig -> oauth2RSConfig.jwt(Customizer.withDefaults())); - - return httpSecurity.build(); - } -} diff --git a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/config/dev/VaultConfig.java b/apps/testnorge-tp/src/main/java/no/nav/registre/tp/config/dev/VaultConfig.java deleted file mode 100644 index c26a619ad80..00000000000 --- a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/config/dev/VaultConfig.java +++ /dev/null @@ -1,37 +0,0 @@ -package no.nav.registre.tp.config.dev; - -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.vault.annotation.VaultPropertySource; -import org.springframework.vault.authentication.ClientAuthentication; -import org.springframework.vault.authentication.TokenAuthentication; -import org.springframework.vault.client.VaultEndpoint; -import org.springframework.vault.config.AbstractVaultConfiguration; - -import static io.micrometer.common.util.StringUtils.isBlank; - -@Configuration -@Profile("local") -@VaultPropertySource(value = "kv/preprod/fss/testnorge-tp/local", ignoreSecretNotFound = false) -@VaultPropertySource(value = "secret/dolly/lokal", ignoreSecretNotFound = false) -public class VaultConfig extends AbstractVaultConfiguration { - - private static final String VAULT_TOKEN = "spring.cloud.vault.token"; - - @Override - public VaultEndpoint vaultEndpoint() { - return VaultEndpoint.create("vault.adeo.no", 443); - } - - @Override - public ClientAuthentication clientAuthentication() { - if (System.getenv().containsKey("VAULT_TOKEN")) { - System.setProperty(VAULT_TOKEN, System.getenv("VAULT_TOKEN")); - } - var token = System.getProperty(VAULT_TOKEN); - if (isBlank(token)) { - throw new IllegalArgumentException("Påkrevet property 'spring.cloud.vault.token' er ikke satt."); - } - return new TokenAuthentication(System.getProperty(VAULT_TOKEN)); - } -} \ No newline at end of file diff --git a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/HodejegerenConsumer.java b/apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/HodejegerenConsumer.java deleted file mode 100644 index 6a2a334ff3a..00000000000 --- a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/HodejegerenConsumer.java +++ /dev/null @@ -1,42 +0,0 @@ -package no.nav.registre.tp.consumer; - -import lombok.extern.slf4j.Slf4j; -import no.nav.registre.tp.config.Consumers; -import no.nav.registre.tp.consumer.command.GetLevendeIdenterCommand; -import no.nav.testnav.libs.securitycore.domain.ServerProperties; -import no.nav.testnav.libs.servletsecurity.exchange.TokenExchange; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.client.WebClient; - -import java.util.List; - - -@Component -@Slf4j -public class HodejegerenConsumer { - - private final WebClient webClient; - private final TokenExchange tokenExchange; - private final ServerProperties serverProperties; - - public HodejegerenConsumer( - Consumers consumers, - TokenExchange tokenExchange - ) { - serverProperties = consumers.getHodejegeren(); - this.tokenExchange = tokenExchange; - this.webClient = WebClient - .builder() - .baseUrl(serverProperties.getUrl()) - .build(); - } - - public List getLevende( - Long avspillergruppeId - ) { - return tokenExchange.exchange(serverProperties) - .flatMap(accessToken -> new GetLevendeIdenterCommand(avspillergruppeId, accessToken.getTokenValue(), webClient).call()) - .block(); - } - -} diff --git a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/TpConsumer.java b/apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/TpConsumer.java deleted file mode 100644 index ae486b77901..00000000000 --- a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/TpConsumer.java +++ /dev/null @@ -1,38 +0,0 @@ -package no.nav.registre.tp.consumer; - -import lombok.extern.slf4j.Slf4j; -import no.nav.registre.tp.consumer.command.CreateMissingPersonsCommand; -import no.nav.registre.tp.consumer.command.FindExistingPersonsCommand; -import no.nav.registre.tp.consumer.command.RemovePersonsCommand; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.client.WebClient; - -import java.util.Arrays; -import java.util.List; - -@Component -@Slf4j -public class TpConsumer { - - private final WebClient webClient; - - public TpConsumer(@Value("${pensjon-testdata-server-q2.url}") String serverUrl) { - - this.webClient = WebClient.builder() - .baseUrl(serverUrl) - .build(); - } - - public List createMissingPersons(List fnrs) { - return Arrays.asList(new CreateMissingPersonsCommand(fnrs, webClient).call().block()); - } - - public List findExistingPersons(List fnrs) { - return Arrays.asList(new FindExistingPersonsCommand(fnrs, webClient).call().block()); - } - - public List removePersons(List fnrs) { - return Arrays.asList(new RemovePersonsCommand(fnrs, webClient).call().block()); - } -} diff --git a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/command/CreateMissingPersonsCommand.java b/apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/command/CreateMissingPersonsCommand.java deleted file mode 100644 index 52ee6836978..00000000000 --- a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/command/CreateMissingPersonsCommand.java +++ /dev/null @@ -1,13 +0,0 @@ -package no.nav.registre.tp.consumer.command; - -import org.springframework.web.reactive.function.client.WebClient; - -import java.util.List; - -public class CreateMissingPersonsCommand extends TpPostStringListCommand { - - public CreateMissingPersonsCommand(List fnrs, WebClient webClient) { - super("/api/tp/missing-persons", fnrs, webClient); - } - -} diff --git a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/command/FindExistingPersonsCommand.java b/apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/command/FindExistingPersonsCommand.java deleted file mode 100644 index 03eed593b9a..00000000000 --- a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/command/FindExistingPersonsCommand.java +++ /dev/null @@ -1,12 +0,0 @@ -package no.nav.registre.tp.consumer.command; - -import org.springframework.web.reactive.function.client.WebClient; - -import java.util.List; - -public class FindExistingPersonsCommand extends TpPostStringListCommand { - - public FindExistingPersonsCommand(List fnrs, WebClient webClient) { - super("/api/tp/find-persons", fnrs, webClient); - } -} diff --git a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/command/GetLevendeIdenterCommand.java b/apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/command/GetLevendeIdenterCommand.java deleted file mode 100644 index bdfa091f3f3..00000000000 --- a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/command/GetLevendeIdenterCommand.java +++ /dev/null @@ -1,30 +0,0 @@ -package no.nav.registre.tp.consumer.command; - -import lombok.RequiredArgsConstructor; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; - -import java.util.List; -import java.util.concurrent.Callable; - -@RequiredArgsConstructor -public class GetLevendeIdenterCommand implements Callable>> { - private static final ParameterizedTypeReference> RESPONSE_TYPE = new ParameterizedTypeReference<>() { - }; - private final Long avspillergruppeId; - private final String token; - private final WebClient webClient; - - @Override - public Mono> call() { - return webClient.get() - .uri(builder -> - builder.path("/api/v1/alle-levende-identer/{avspillergruppeId}") - .build(avspillergruppeId) - ) - .header("Authorization", "Bearer " + token) - .retrieve() - .bodyToMono(RESPONSE_TYPE); - } -} diff --git a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/command/RemovePersonsCommand.java b/apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/command/RemovePersonsCommand.java deleted file mode 100644 index fadae698337..00000000000 --- a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/command/RemovePersonsCommand.java +++ /dev/null @@ -1,12 +0,0 @@ -package no.nav.registre.tp.consumer.command; - -import org.springframework.web.reactive.function.client.WebClient; - -import java.util.List; - -public class RemovePersonsCommand extends TpPostStringListCommand { - - public RemovePersonsCommand(List fnrs, WebClient webClient) { - super("/api/tp/remove-persons", fnrs, webClient); - } -} diff --git a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/command/TpPostListCommand.java b/apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/command/TpPostListCommand.java deleted file mode 100644 index d2e532c10f9..00000000000 --- a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/command/TpPostListCommand.java +++ /dev/null @@ -1,34 +0,0 @@ -package no.nav.registre.tp.consumer.command; - -import lombok.RequiredArgsConstructor; -import no.nav.registre.tp.util.WebClientFilter; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; -import reactor.util.retry.Retry; - -import java.time.Duration; -import java.util.List; -import java.util.concurrent.Callable; - -@RequiredArgsConstructor -public class TpPostListCommand implements Callable> { - - private final String url; - private final Class bodyType; - private final T emptyValue; - private final List fnrs; - private final WebClient webClient; - - public Mono call() { - return webClient.post() - .uri(builder -> builder.path(url).build()) - .bodyValue(fnrs) - .retrieve() - - .bodyToMono(bodyType) - .defaultIfEmpty(emptyValue) - .retryWhen(Retry.backoff(3, Duration.ofSeconds(10)) - .filter(WebClientFilter::is5xxException)); - } - -} diff --git a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/command/TpPostStringListCommand.java b/apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/command/TpPostStringListCommand.java deleted file mode 100644 index c1d1f6d2e06..00000000000 --- a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/consumer/command/TpPostStringListCommand.java +++ /dev/null @@ -1,12 +0,0 @@ -package no.nav.registre.tp.consumer.command; - -import org.springframework.web.reactive.function.client.WebClient; - -import java.util.List; - -public class TpPostStringListCommand extends TpPostListCommand { - - public TpPostStringListCommand(String url, List fnrs, WebClient webClient) { - super(url, String[].class, new String[0], fnrs, webClient); - } -} diff --git a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/provider/OrkestreringController.java b/apps/testnorge-tp/src/main/java/no/nav/registre/tp/provider/OrkestreringController.java deleted file mode 100644 index 26abbac9a97..00000000000 --- a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/provider/OrkestreringController.java +++ /dev/null @@ -1,63 +0,0 @@ -package no.nav.registre.tp.provider; - -import io.swagger.v3.oas.annotations.Operation; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.registre.tp.provider.request.OrkestreringRequest; -import no.nav.registre.tp.service.TpService; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -@Slf4j -@RestController -@RequiredArgsConstructor -@RequestMapping("api/v1/orkestrering") -public class OrkestreringController { - - private final TpService tpService; - - @Operation(description = "Dette endepunktet kan benyttes for å initialisere en database i et gitt miljø. Identer som ikke finnes i TJPEN databasen, men i avspillergruppen på det gitte miljøet vil bli " - + "opprettet uten noen tilhørende ytelser.") - @PostMapping("/init") - public ResponseEntity initializeDatabase( - @RequestBody OrkestreringRequest request - ) { - var count = tpService.initializeTpDbForEnvironment(request.getAvspillergruppeId()); - return ResponseEntity.ok(count); - } - - @Operation(description = "Dette endepunktet kan benyttes for å opprette gitte personer. De vil bli opprettet i TJPEN. Det er ikke noen verifikasjon av FNR mot TPS eller om det er et gyldig FNR.") - @PostMapping("/opprettPersoner/{miljoe}") - public ResponseEntity> addPeople( - @PathVariable String miljoe, - @RequestBody List fnrs - ) { - var people = tpService.createPeople(fnrs); - var feilet = fnrs.parallelStream().filter(fnr -> !people.contains(fnr)) - .toList(); - return ResponseEntity.ok(feilet); - } - - @Operation(description = "Dette endepunktet kan benyttes for å hente personer fra en gitt liste som finnes i TP.") - @PostMapping("/hentPersonerITp/{miljoe}") - public List getPeopleInTp( - @PathVariable String miljoe, - @RequestBody List fnrs - ) { - return tpService.filterTpOnFnrs(fnrs); - } - - @Operation(description = "Enkel implementasjon for å fjerne personer i en gitt liste fra TP. Personene fjernes kun hvis de ikke" - + "har tilhørende forhold. Returnerer en liste med de personene som ble slettet.") - @DeleteMapping("/fjernPersoner/{miljoe}") - public List removeIdentsFromTp(@PathVariable String miljoe, @RequestBody List fnrs) { - return tpService.removeFnrsFromTp(fnrs); - } -} diff --git a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/provider/request/OrkestreringRequest.java b/apps/testnorge-tp/src/main/java/no/nav/registre/tp/provider/request/OrkestreringRequest.java deleted file mode 100644 index ff89e8e67b0..00000000000 --- a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/provider/request/OrkestreringRequest.java +++ /dev/null @@ -1,24 +0,0 @@ -package no.nav.registre.tp.provider.request; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import jakarta.validation.constraints.NotNull; - -@Getter -@Setter -@AllArgsConstructor -@NoArgsConstructor -public class OrkestreringRequest { - - @NotNull - @JsonProperty("avspillergruppeId") - private Long avspillergruppeId; - @NotNull - @JsonProperty("miljoe") - private String miljoe; - -} diff --git a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/service/TpService.java b/apps/testnorge-tp/src/main/java/no/nav/registre/tp/service/TpService.java deleted file mode 100644 index 78a770f30d2..00000000000 --- a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/service/TpService.java +++ /dev/null @@ -1,49 +0,0 @@ -package no.nav.registre.tp.service; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.registre.tp.consumer.HodejegerenConsumer; -import no.nav.registre.tp.consumer.TpConsumer; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Slf4j -@Service -@RequiredArgsConstructor -public class TpService { - - private static final String EIER = "synt"; - - private final HodejegerenConsumer hodejegerenConsumer; - - private final TpConsumer tpConsumer; - - public int initializeTpDbForEnvironment( - Long id - ) { - var allIdentities = getLivingIdentities(id); - var created = tpConsumer.createMissingPersons(allIdentities); - - log.info("Opprettet {} personer i tp", created.size()); - return created.size(); - } - - public List createPeople(List fnrs) { - return tpConsumer.createMissingPersons(fnrs); - } - - public List filterTpOnFnrs(List fnrs) { - return tpConsumer.findExistingPersons(fnrs); - } - - public List removeFnrsFromTp(List fnrs) { - return tpConsumer.removePersons(fnrs); - } - - private List getLivingIdentities( - Long id - ) { - return hodejegerenConsumer.getLevende(id); - } -} diff --git a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/util/WebClientFilter.java b/apps/testnorge-tp/src/main/java/no/nav/registre/tp/util/WebClientFilter.java deleted file mode 100644 index 87306e9ec9b..00000000000 --- a/apps/testnorge-tp/src/main/java/no/nav/registre/tp/util/WebClientFilter.java +++ /dev/null @@ -1,14 +0,0 @@ -package no.nav.registre.tp.util; - -import lombok.experimental.UtilityClass; -import org.springframework.web.reactive.function.client.WebClientResponseException; - -@UtilityClass -public class WebClientFilter { - - public static boolean is5xxException(Throwable throwable) { - - return throwable instanceof WebClientResponseException wce && - wce.getStatusCode().is5xxServerError(); - } -} diff --git a/apps/testnorge-tp/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/apps/testnorge-tp/src/main/resources/META-INF/additional-spring-configuration-metadata.json deleted file mode 100644 index 5e12ba366d6..00000000000 --- a/apps/testnorge-tp/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "properties": [ - { - "name": "syntrest.rest.api.url", - "type": "java.lang.String", - "description": "Description for syntrest.rest.api.url." - }, - { - "name": "testnorge.inntektstub.rest.api.url", - "type": "java.lang.String", - "description": "Description for testnorge.inntektstub.rest.api.url." - }, - { - "name": "tpDataSource.url", - "type": "java.lang.String", - "description": "Description for tpDataSource.url." - }, - { - "name": "tpDataSource.username", - "type": "java.lang.String", - "description": "Description for tpDataSource.username." - }, - { - "name": "tpDataSource.password", - "type": "java.lang.String", - "description": "Description for tpDataSource.password." - } - ] -} diff --git a/apps/testnorge-tp/src/main/resources/application-local.properties b/apps/testnorge-tp/src/main/resources/application-local.properties deleted file mode 100644 index 906d52777f1..00000000000 --- a/apps/testnorge-tp/src/main/resources/application-local.properties +++ /dev/null @@ -1 +0,0 @@ -environments=q2 \ No newline at end of file diff --git a/apps/testnorge-tp/src/main/resources/application-prod.properties b/apps/testnorge-tp/src/main/resources/application-prod.properties deleted file mode 100644 index e427483cb13..00000000000 --- a/apps/testnorge-tp/src/main/resources/application-prod.properties +++ /dev/null @@ -1,3 +0,0 @@ -environments=q2 - -spring.main.banner-mode=off diff --git a/apps/testnorge-tp/src/main/resources/application.properties b/apps/testnorge-tp/src/main/resources/application.properties deleted file mode 100644 index 719c45a1fb6..00000000000 --- a/apps/testnorge-tp/src/main/resources/application.properties +++ /dev/null @@ -1,31 +0,0 @@ -application.version=application.version.todo -application.name=testnorge-tp - -springdoc.swagger-ui.disable-swagger-default-url=true -springdoc.swagger-ui.url=/v3/api-docs - -AAD_ISSUER_URI=https://login.microsoftonline.com/62366534-1ec3-4962-8869-9b5535279d0b - -spring.cloud.vault.enabled=false - -spring.security.oauth2.resourceserver.aad.issuer-uri=${AAD_ISSUER_URI}/v2.0 -spring.security.oauth2.resourceserver.aad.jwk-set-uri=${AAD_ISSUER_URI}/discovery/v2.0/keys -spring.security.oauth2.resourceserver.aad.accepted-audience=${azure.app.client.id}, api://${azure.app.client.id} - -pensjon-testdata-server-q1.url=https://pensjon-testdata-server-q1.dev.intern.nav.no -pensjon-testdata-server-q2.url=https://pensjon-testdata-server-q2.dev.intern.nav.no - -management.endpoints.enabled-by-default=true -management.endpoints.web.base-path=/internal -management.endpoints.web.exposure.include=prometheus,heapdump,health -management.endpoints.web.path-mapping.prometheus=metrics -management.endpoint.prometheus.enabled=true -management.endpoint.heapdump.enabled=true -management.prometheus.metrics.export.enabled=true - -consumers.hodejegeren.url=https://testnorge-hodejegeren.dev.intern.nav.no -consumers.hodejegeren.cluster=dev-fss -consumers.hodejegeren.namespace=dolly -consumers.hodejegeren.name=testnorge-hodejegeren - -server.servlet.encoding.charset=UTF-8 diff --git a/apps/testnorge-tp/src/main/resources/logback-spring.xml b/apps/testnorge-tp/src/main/resources/logback-spring.xml deleted file mode 100644 index 887bc4b4b5a..00000000000 --- a/apps/testnorge-tp/src/main/resources/logback-spring.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - true - 256 - 10280 - 20 - ^sun\.reflect\..*\.invoke - ^net\.sf\.cglib\.proxy\.MethodProxy\.invoke - java\.util\.concurrent\..* - org\.apache\.catalina\..* - org\.apache\.coyote\..* - org\.apache\.tomcat\..* - - bestillingId - - - - - - - - - - - UTF-8 - - %d{HH:mm:ss.SSS} %highlight(%p) | %yellow(%logger{0}): %m%n - - - - - - - - - - - diff --git a/apps/testnorge-tp/src/test/java/no/nav/registre/tp/ApplicationContextTest.java b/apps/testnorge-tp/src/test/java/no/nav/registre/tp/ApplicationContextTest.java deleted file mode 100644 index df377120cbe..00000000000 --- a/apps/testnorge-tp/src/test/java/no/nav/registre/tp/ApplicationContextTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package no.nav.registre.tp; - - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.security.oauth2.jwt.JwtDecoder; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - - -@RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@TestPropertySource(locations = "classpath:application-test.properties") -public class ApplicationContextTest { - - @MockBean - public JwtDecoder jwtDecoder; - - /** - * Used to test app runtime dependency and properties - */ - @Test - @SuppressWarnings("java:S2699") - public void load_app_context() { - } -} diff --git a/apps/testnorge-tp/src/test/java/no/nav/registre/tp/provider/OrkestreringControllerTest.java b/apps/testnorge-tp/src/test/java/no/nav/registre/tp/provider/OrkestreringControllerTest.java deleted file mode 100644 index e5af127d3ce..00000000000 --- a/apps/testnorge-tp/src/test/java/no/nav/registre/tp/provider/OrkestreringControllerTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package no.nav.registre.tp.provider; - -import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.Mockito.when; - -import no.nav.registre.tp.provider.request.OrkestreringRequest; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.springframework.http.ResponseEntity; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -import no.nav.registre.tp.service.TpService; - -@RunWith(SpringJUnit4ClassRunner.class) -public class OrkestreringControllerTest { - - @Mock - private TpService tpService; - - @InjectMocks - private OrkestreringController orkestreringController; - - @Test - public void initializeDatabase() { - when(tpService.initializeTpDbForEnvironment(anyLong())).thenReturn(1); - ResponseEntity entity = orkestreringController.initializeDatabase(new OrkestreringRequest(1L, "q2")); - assertEquals(1, entity.getBody()); - } - - @Test - public void addPeople() { - List fnrs = new ArrayList<>(); - fnrs.add("123"); - fnrs.add("132"); - fnrs.add("321"); - - List feiletPersoner = new ArrayList<>(1); - feiletPersoner.add("123"); - when(tpService.createPeople(any())).thenReturn(feiletPersoner); - var entity = orkestreringController.addPeople("q", fnrs); - assertEquals(2, Objects.requireNonNull(entity.getBody()).size()); - - } -} \ No newline at end of file diff --git a/apps/testnorge-tp/src/test/resources/application-test.properties b/apps/testnorge-tp/src/test/resources/application-test.properties deleted file mode 100644 index ad119321bfa..00000000000 --- a/apps/testnorge-tp/src/test/resources/application-test.properties +++ /dev/null @@ -1,9 +0,0 @@ -consumers.hodejegeren.url = http://localhost:${wiremock.server.port:0}/hodejegeren - -environments=q11, q2 - -spring.cloud.vault.enabled=false - -AAD_ISSUER_URI=http://localhost:${wiremock.server.port:0}/aad -azure.app.client.id: dummy -azure.app.client.secret: dummy diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/applikasjonsanalyseservice/v1/ApplicationInfoDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/applikasjonsanalyseservice/v1/ApplicationInfoDTO.java deleted file mode 100644 index e8f5da336ef..00000000000 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/applikasjonsanalyseservice/v1/ApplicationInfoDTO.java +++ /dev/null @@ -1,19 +0,0 @@ -package no.nav.testnav.libs.dto.applikasjonsanalyseservice.v1; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.NoArgsConstructor; -import lombok.Value; - -import java.util.Set; - -@Value -@Builder -@AllArgsConstructor -@NoArgsConstructor(force = true) -public class ApplicationInfoDTO { - String name; - String cluster; - String namespace; - Set dependencies; -} diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/applikasjonsanalyseservice/v1/DependencyDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/applikasjonsanalyseservice/v1/DependencyDTO.java deleted file mode 100644 index 46e925dda9e..00000000000 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/applikasjonsanalyseservice/v1/DependencyDTO.java +++ /dev/null @@ -1,16 +0,0 @@ -package no.nav.testnav.libs.dto.applikasjonsanalyseservice.v1; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.NoArgsConstructor; -import lombok.Value; - -@Value -@Builder -@AllArgsConstructor -@NoArgsConstructor(force = true) -public class DependencyDTO { - String name; - String cluster; - String namespace; -} diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/bridge/v1/ContentDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/bridge/v1/ContentDTO.java deleted file mode 100644 index a1fd00727cd..00000000000 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/bridge/v1/ContentDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -package no.nav.testnav.libs.dto.bridge.v1; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.NoArgsConstructor; -import lombok.Value; - -@Value -@Builder -@AllArgsConstructor -@NoArgsConstructor(force = true) -public class ContentDTO { - String key; - byte[] content; -} \ No newline at end of file diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/dependencyanalysis/v1/ApplicationDependenciesDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/dependencyanalysis/v1/ApplicationDependenciesDTO.java deleted file mode 100644 index 3510677fed7..00000000000 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/dependencyanalysis/v1/ApplicationDependenciesDTO.java +++ /dev/null @@ -1,22 +0,0 @@ -package no.nav.testnav.libs.dto.dependencyanalysis.v1; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import lombok.Value; - -import java.util.Set; - -@Value -@Builder -@AllArgsConstructor -@NoArgsConstructor(force = true) -@EqualsAndHashCode -public class ApplicationDependenciesDTO { - @JsonProperty(required = true) - String applicationName; - @JsonProperty(required = true) - Set dependencies; -} diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/dependencyanalysis/v1/DependencyDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/dependencyanalysis/v1/DependencyDTO.java deleted file mode 100644 index 48397e84023..00000000000 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/dependencyanalysis/v1/DependencyDTO.java +++ /dev/null @@ -1,19 +0,0 @@ -package no.nav.testnav.libs.dto.dependencyanalysis.v1; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.NoArgsConstructor; -import lombok.Value; - -@Value -@Builder -@AllArgsConstructor -@NoArgsConstructor(force = true) -public class DependencyDTO { - - @JsonProperty(required = true) - String name; - @JsonProperty(required = true) - Boolean external; -} diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/hendelse/v1/HendelseDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/hendelse/v1/HendelseDTO.java deleted file mode 100644 index c97c7066027..00000000000 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/hendelse/v1/HendelseDTO.java +++ /dev/null @@ -1,24 +0,0 @@ -package no.nav.testnav.libs.dto.hendelse.v1; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.NoArgsConstructor; -import lombok.Value; - -import java.time.LocalDate; - -@Value -@Builder -@AllArgsConstructor -@NoArgsConstructor(force = true) -public class HendelseDTO { - @JsonProperty(required = true) - String ident; - @JsonProperty(required = true) - LocalDate fom; - @JsonProperty - LocalDate tom; - @JsonProperty(required = true) - HendelseType type; -} diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/hendelse/v1/HendelseType.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/hendelse/v1/HendelseType.java deleted file mode 100644 index a5201198291..00000000000 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/hendelse/v1/HendelseType.java +++ /dev/null @@ -1,6 +0,0 @@ -package no.nav.testnav.libs.dto.hendelse.v1; - -public enum HendelseType { - SYKEMELDING_OPPRETTET, - ARBEIDSFORHOLD_OPPRETTET -} \ No newline at end of file diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/identpool/v1/FiktiveNavnDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/identpool/v1/FiktiveNavnDTO.java deleted file mode 100644 index c4048ac2004..00000000000 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/identpool/v1/FiktiveNavnDTO.java +++ /dev/null @@ -1,18 +0,0 @@ -package no.nav.testnav.libs.dto.identpool.v1; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.NoArgsConstructor; -import lombok.Value; - -@Value -@Builder -@AllArgsConstructor -@NoArgsConstructor(force = true) -public class FiktiveNavnDTO { - @JsonProperty - String fornavn; - @JsonProperty - String etternavn; -} diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organiasjonbestilling/v1/ItemDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organisajonbestilling/v1/ItemDTO.java similarity index 80% rename from libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organiasjonbestilling/v1/ItemDTO.java rename to libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organisajonbestilling/v1/ItemDTO.java index 67426c36c2e..b5abdea12a1 100644 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organiasjonbestilling/v1/ItemDTO.java +++ b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organisajonbestilling/v1/ItemDTO.java @@ -1,4 +1,4 @@ -package no.nav.testnav.libs.dto.organiasjonbestilling.v1; +package no.nav.testnav.libs.dto.organisajonbestilling.v1; import lombok.AllArgsConstructor; diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organiasjonbestilling/v1/OrderDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organisajonbestilling/v1/OrderDTO.java similarity index 80% rename from libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organiasjonbestilling/v1/OrderDTO.java rename to libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organisajonbestilling/v1/OrderDTO.java index 52670e1b395..a557e89f9dd 100644 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organiasjonbestilling/v1/OrderDTO.java +++ b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organisajonbestilling/v1/OrderDTO.java @@ -1,4 +1,4 @@ -package no.nav.testnav.libs.dto.organiasjonbestilling.v1; +package no.nav.testnav.libs.dto.organisajonbestilling.v1; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organiasjonbestilling/v1/Status.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organisajonbestilling/v1/Status.java similarity index 61% rename from libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organiasjonbestilling/v1/Status.java rename to libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organisajonbestilling/v1/Status.java index e2fa1476287..34cf934e588 100644 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organiasjonbestilling/v1/Status.java +++ b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organisajonbestilling/v1/Status.java @@ -1,4 +1,4 @@ -package no.nav.testnav.libs.dto.organiasjonbestilling.v1; +package no.nav.testnav.libs.dto.organisajonbestilling.v1; public enum Status { NOT_STARTED, diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organiasjonbestilling/v2/OrderDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organisajonbestilling/v2/OrderDTO.java similarity index 89% rename from libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organiasjonbestilling/v2/OrderDTO.java rename to libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organisajonbestilling/v2/OrderDTO.java index d111af26dcb..45666c91ba3 100644 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organiasjonbestilling/v2/OrderDTO.java +++ b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organisajonbestilling/v2/OrderDTO.java @@ -1,4 +1,4 @@ -package no.nav.testnav.libs.dto.organiasjonbestilling.v2; +package no.nav.testnav.libs.dto.organisajonbestilling.v2; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organiasjonbestilling/v2/Status.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organisajonbestilling/v2/Status.java similarity index 87% rename from libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organiasjonbestilling/v2/Status.java rename to libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organisajonbestilling/v2/Status.java index 3afab0c6fe8..c22e2b03845 100644 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organiasjonbestilling/v2/Status.java +++ b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organisajonbestilling/v2/Status.java @@ -1,4 +1,4 @@ -package no.nav.testnav.libs.dto.organiasjonbestilling.v2; +package no.nav.testnav.libs.dto.organisajonbestilling.v2; public enum Status { diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organiasjonbestilling/v2/StatusDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organisajonbestilling/v2/StatusDTO.java similarity index 94% rename from libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organiasjonbestilling/v2/StatusDTO.java rename to libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organisajonbestilling/v2/StatusDTO.java index d56d4e14ed5..53f2eab4b61 100644 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organiasjonbestilling/v2/StatusDTO.java +++ b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organisajonbestilling/v2/StatusDTO.java @@ -1,4 +1,4 @@ -package no.nav.testnav.libs.dto.organiasjonbestilling.v2; +package no.nav.testnav.libs.dto.organisajonbestilling.v2; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/rapprtering/v1/EntryStatus.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/rapprtering/v1/EntryStatus.java deleted file mode 100644 index 731f65a4c08..00000000000 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/rapprtering/v1/EntryStatus.java +++ /dev/null @@ -1,7 +0,0 @@ -package no.nav.testnav.libs.dto.rapprtering.v1; - -public enum EntryStatus { - INFO, - WARNING, - ERROR -} diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/samhandlerregisteret/v1/IdentDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/samhandlerregisteret/v1/IdentDTO.java deleted file mode 100644 index e1a4aa0730d..00000000000 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/samhandlerregisteret/v1/IdentDTO.java +++ /dev/null @@ -1,18 +0,0 @@ -package no.nav.testnav.libs.dto.samhandlerregisteret.v1; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.NoArgsConstructor; -import lombok.Value; - -@Value -@Builder -@AllArgsConstructor -@NoArgsConstructor(force = true) -public class IdentDTO { - @JsonProperty("ident") - private final String ident; - @JsonProperty("ident_type_kode") - private final String identTypeKode; -} diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/samhandlerregisteret/v1/SamhandlerDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/samhandlerregisteret/v1/SamhandlerDTO.java deleted file mode 100644 index d19a7a57528..00000000000 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/samhandlerregisteret/v1/SamhandlerDTO.java +++ /dev/null @@ -1,22 +0,0 @@ -package no.nav.testnav.libs.dto.samhandlerregisteret.v1; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.NoArgsConstructor; -import lombok.Value; - -import java.util.List; - -@Value -@Builder -@AllArgsConstructor -@NoArgsConstructor(force = true) -public class SamhandlerDTO { - - @JsonProperty("samh_ident") - private final List identer; - - @JsonProperty("samh_type_kode") - private final String kode; -} \ No newline at end of file diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/statistikkservice/v1/StatistikkDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/statistikkservice/v1/StatistikkDTO.java deleted file mode 100644 index fa40033cea0..00000000000 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/statistikkservice/v1/StatistikkDTO.java +++ /dev/null @@ -1,22 +0,0 @@ -package no.nav.testnav.libs.dto.statistikkservice.v1; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.NoArgsConstructor; -import lombok.Value; - -@Value -@Builder -@AllArgsConstructor -@NoArgsConstructor(force = true) -public class StatistikkDTO { - @JsonProperty(required = true) - StatistikkType type; - @JsonProperty - String description; - @JsonProperty(required = true) - Double value; - @JsonProperty(required = true) - StatistikkValueType valueType; -} diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/statistikkservice/v1/StatistikkType.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/statistikkservice/v1/StatistikkType.java deleted file mode 100644 index 1b67ab1fea5..00000000000 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/statistikkservice/v1/StatistikkType.java +++ /dev/null @@ -1,9 +0,0 @@ -package no.nav.testnav.libs.dto.statistikkservice.v1; - -public enum StatistikkType { - ANTALL_ARBEIDSTAKERE_SYKEMELDT, - ANTALL_ARBEIDSTAKERE_SOM_ER_I_ARBEIDSSTYRKEN, - ANDEL_PERSONER_ALDER_0_19, - ANDEL_PERSONER_ALDER_20_64, - ANDEL_PERSONER_ALDER_OVER_65 -} diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/statistikkservice/v1/StatistikkValueType.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/statistikkservice/v1/StatistikkValueType.java deleted file mode 100644 index f25624d7787..00000000000 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/statistikkservice/v1/StatistikkValueType.java +++ /dev/null @@ -1,6 +0,0 @@ -package no.nav.testnav.libs.dto.statistikkservice.v1; - -public enum StatistikkValueType { - PERCENTAGE, - COUNT -} diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/v1/AdresseDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/v1/AdresseDTO.java deleted file mode 100644 index 015842c0e26..00000000000 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/v1/AdresseDTO.java +++ /dev/null @@ -1,18 +0,0 @@ -package no.nav.testnav.libs.dto.v1; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.NoArgsConstructor; -import lombok.Value; - -@Value -@Builder -@AllArgsConstructor -@NoArgsConstructor(force = true) -public class AdresseDTO { - - String gatenavn; - String postnummer; - String poststed; - String kommunenummer; -} diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/v1/PersonDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/v1/PersonDTO.java deleted file mode 100644 index f6635b6ba98..00000000000 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/v1/PersonDTO.java +++ /dev/null @@ -1,23 +0,0 @@ -package no.nav.testnav.libs.dto.v1; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.NoArgsConstructor; -import lombok.Value; - -import java.util.Set; - -@Value -@Builder -@AllArgsConstructor -@NoArgsConstructor(force = true) -public class PersonDTO { - String ident; - String fornavn; - String etternavn; - String adresse; - String postnr; - String by; - String opprinnelse; - Set tags; -} diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/v1/Persondatasystem.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/v1/Persondatasystem.java deleted file mode 100644 index 586aaa9bf71..00000000000 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/v1/Persondatasystem.java +++ /dev/null @@ -1,6 +0,0 @@ -package no.nav.testnav.libs.dto.v1; - -public enum Persondatasystem { - TPS, - PDL -} diff --git a/proxies/kodeverk-proxy/config.yml b/proxies/kodeverk-proxy/config.yml index f7d53901b76..68586f77a9c 100644 --- a/proxies/kodeverk-proxy/config.yml +++ b/proxies/kodeverk-proxy/config.yml @@ -33,8 +33,6 @@ spec: cluster: dev-gcp - application: testnav-oversikt-frontend cluster: dev-gcp - - application: testnav-person-export-api - cluster: dev-gcp - application: app-1 namespace: plattformsikkerhet cluster: dev-gcp diff --git a/proxies/statisk-data-forvalter-proxy/Dockerfile b/proxies/statisk-data-forvalter-proxy/Dockerfile deleted file mode 100644 index 4a36f93546f..00000000000 --- a/proxies/statisk-data-forvalter-proxy/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM ghcr.io/navikt/baseimages/temurin:21 -LABEL maintainer="Team Dolly" - -ENV JAVA_OPTS="-Dspring.profiles.active=prod" - -ADD /build/libs/app.jar /app/app.jar - -EXPOSE 8080 diff --git a/proxies/statisk-data-forvalter-proxy/build.gradle b/proxies/statisk-data-forvalter-proxy/build.gradle deleted file mode 100644 index 9b560f4f315..00000000000 --- a/proxies/statisk-data-forvalter-proxy/build.gradle +++ /dev/null @@ -1,80 +0,0 @@ -plugins { - id 'java' - id "org.sonarqube" version "4.0.0.2929" - id 'org.springframework.boot' version "3.1.4" - id 'io.spring.dependency-management' version "1.1.3" - id "jacoco" -} - -test { - useJUnitPlatform() -} - -jacocoTestReport { - reports { - xml.required = true - } -} - -sonarqube { - properties { - property "sonar.coverage.jacoco.xmlReportPaths", "${project.buildDir}/reports/jacoco/test/jacocoTestReport.xml" - property "sonar.dynamicAnalysis", "reuseReports" - property "sonar.host.url", "https://sonarcloud.io" - property "sonar.java.coveragePlugin", "jacoco" - property "sonar.language", "java" - property "sonar.login", System.getenv("SONAR_TOKEN") - property "sonar.organization", "navikt" - property "sonar.project.monorepo.enabled", true - property "sonar.projectKey", "testnav-statisk-data-forvalter-proxy" - property "sonar.projectName", "testnav-statisk-data-forvalter-proxy" - property "sonar.sourceEncoding", "UTF-8" - } -} - -bootJar { - archiveFileName = "app.jar" -} - -dependencyManagement { - applyMavenExclusions = false - imports { - mavenBom 'org.springframework.cloud:spring-cloud-dependencies:2022.0.4' - } -} - -repositories { - mavenCentral() - mavenLocal() -} - -dependencies { - - implementation 'no.nav.testnav.libs:security-core' - 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.4' - implementation 'org.hibernate.validator:hibernate-validator' - - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'org.springframework.cloud:spring-cloud-contract-wiremock' - - annotationProcessor 'org.projectlombok:lombok' - implementation 'org.projectlombok:lombok' - testAnnotationProcessor 'org.projectlombok:lombok' -} -java { - toolchain { - languageVersion = JavaLanguageVersion.of(21) - } -} diff --git a/proxies/statisk-data-forvalter-proxy/config.yml b/proxies/statisk-data-forvalter-proxy/config.yml deleted file mode 100644 index 290dcac8cc9..00000000000 --- a/proxies/statisk-data-forvalter-proxy/config.yml +++ /dev/null @@ -1,57 +0,0 @@ -apiVersion: "nais.io/v1alpha1" -kind: "Application" -metadata: - name: testnav-statisk-data-forvalter-proxy - namespace: dolly - labels: - team: dolly -spec: - image: {{image}} - port: 8080 - webproxy: true - azure: - application: - allowAllUsers: true - enabled: true - tenant: nav.no - accessPolicy: - inbound: - rules: - - application: team-dolly-lokal-app - cluster: dev-gcp - - application: dolly-frontend - cluster: dev-gcp - - application: dolly-idporten - cluster: dev-gcp - - application: dolly-frontend-dev - cluster: dev-gcp - - application: testnav-oversikt-frontend - cluster: dev-gcp - - application: app-1 - namespace: plattformsikkerhet - cluster: dev-gcp - outbound: - rules: - - application: testnorge-statisk-data-forvalter - cluster: dev-fss - liveness: - path: /internal/isAlive - initialDelay: 4 - periodSeconds: 5 - failureThreshold: 500 - readiness: - path: /internal/isReady - initialDelay: 4 - periodSeconds: 5 - failureThreshold: 500 - replicas: - min: 1 - max: 1 - resources: - requests: - cpu: 200m - memory: 1024Mi - limits: - memory: 2048Mi - ingresses: - - "https://testnav-statisk-data-forvalter-proxy.dev-fss-pub.nais.io" diff --git a/proxies/statisk-data-forvalter-proxy/gradle/wrapper/gradle-wrapper.jar b/proxies/statisk-data-forvalter-proxy/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index e708b1c023ec8b20f512888fe07c5bd3ff77bb8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59203 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

K7UpUK$>l@ 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 E2O(~oYXATM diff --git a/proxies/statisk-data-forvalter-proxy/gradle/wrapper/gradle-wrapper.properties b/proxies/statisk-data-forvalter-proxy/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index e411586a54a..00000000000 --- a/proxies/statisk-data-forvalter-proxy/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/proxies/statisk-data-forvalter-proxy/gradlew b/proxies/statisk-data-forvalter-proxy/gradlew deleted file mode 100755 index 4f906e0c811..00000000000 --- a/proxies/statisk-data-forvalter-proxy/gradlew +++ /dev/null @@ -1,185 +0,0 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 the original author or authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -exec "$JAVACMD" "$@" diff --git a/proxies/statisk-data-forvalter-proxy/gradlew.bat b/proxies/statisk-data-forvalter-proxy/gradlew.bat deleted file mode 100644 index 107acd32c4e..00000000000 --- a/proxies/statisk-data-forvalter-proxy/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/proxies/statisk-data-forvalter-proxy/settings.gradle b/proxies/statisk-data-forvalter-proxy/settings.gradle deleted file mode 100644 index 05588c69ea3..00000000000 --- a/proxies/statisk-data-forvalter-proxy/settings.gradle +++ /dev/null @@ -1,19 +0,0 @@ -plugins { - id "com.gradle.enterprise" version "3.12.3" -} - -rootProject.name = 'statisk-data-forvalter-proxy' - - -includeBuild '../../libs/security-core' -includeBuild '../../libs/reactive-core' -includeBuild '../../libs/reactive-proxy' -includeBuild '../../libs/reactive-security' -includeBuild '../../libs/data-transfer-objects' - -gradleEnterprise { - buildScan { - termsOfServiceUrl = "https://gradle.com/terms-of-service" - termsOfServiceAgree = "yes" - } -} diff --git a/proxies/statisk-data-forvalter-proxy/src/main/java/no/nav/testnav/proxies/statiskdataforvalterproxy/Consumers.java b/proxies/statisk-data-forvalter-proxy/src/main/java/no/nav/testnav/proxies/statiskdataforvalterproxy/Consumers.java deleted file mode 100644 index 04809bcf12a..00000000000 --- a/proxies/statisk-data-forvalter-proxy/src/main/java/no/nav/testnav/proxies/statiskdataforvalterproxy/Consumers.java +++ /dev/null @@ -1,29 +0,0 @@ -package no.nav.testnav.proxies.statiskdataforvalterproxy; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import no.nav.testnav.libs.securitycore.domain.ServerProperties; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -import static lombok.AccessLevel.PACKAGE; - -/** - * Samler alle placeholders for ulike {@code consumers.*}-konfigurasjon her, dvs. subklasser av {@code ServerProperties}. - *

- * Husk at Spring Boot bruker relaxed binding - * mellom configuration properties og field names. - * - * @see ServerProperties - */ -@Configuration -@ConfigurationProperties(prefix = "consumers") -@NoArgsConstructor(access = PACKAGE) -@Getter -@Setter(PACKAGE) -public class Consumers { - - private ServerProperties statiskdataforvalter; - -} diff --git a/proxies/statisk-data-forvalter-proxy/src/main/java/no/nav/testnav/proxies/statiskdataforvalterproxy/StatiskDataForvalterProxyApplicationStarter.java b/proxies/statisk-data-forvalter-proxy/src/main/java/no/nav/testnav/proxies/statiskdataforvalterproxy/StatiskDataForvalterProxyApplicationStarter.java deleted file mode 100644 index 634d061bcee..00000000000 --- a/proxies/statisk-data-forvalter-proxy/src/main/java/no/nav/testnav/proxies/statiskdataforvalterproxy/StatiskDataForvalterProxyApplicationStarter.java +++ /dev/null @@ -1,51 +0,0 @@ -package no.nav.testnav.proxies.statiskdataforvalterproxy; - -import no.nav.testnav.libs.reactivecore.config.CoreConfig; -import no.nav.testnav.libs.reactiveproxy.config.DevConfig; -import no.nav.testnav.libs.reactiveproxy.config.SecurityConfig; -import no.nav.testnav.libs.reactiveproxy.filter.AddAuthenticationRequestGatewayFilterFactory; -import no.nav.testnav.libs.reactivesecurity.config.SecureOAuth2ServerToServerConfiguration; -import no.nav.testnav.libs.reactivesecurity.exchange.azuread.NavAzureAdTokenService; -import no.nav.testnav.libs.securitycore.domain.AccessToken; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.gateway.route.RouteLocator; -import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; - -@Import({ - CoreConfig.class, - DevConfig.class, - SecurityConfig.class, - SecureOAuth2ServerToServerConfiguration.class -}) -@SpringBootApplication -public class StatiskDataForvalterProxyApplicationStarter { - - public static void main(String[] args) { - SpringApplication.run(StatiskDataForvalterProxyApplicationStarter.class, args); - } - - @Bean - public RouteLocator customRouteLocator( - RouteLocatorBuilder builder, - NavAzureAdTokenService tokenService, - Consumers consumers - ) { - var addAuthenticationHeaderDevFilter = AddAuthenticationRequestGatewayFilterFactory - .bearerAuthenticationHeaderFilter( - () -> tokenService - .exchange(consumers.getStatiskdataforvalter()) - .map(AccessToken::getTokenValue)); - return builder - .routes() - .route( - spec -> spec - .path("/**") - .filters(filterSpec -> filterSpec.filter(addAuthenticationHeaderDevFilter)) - .uri(consumers.getStatiskdataforvalter().getUrl())) - .build(); - } - -} 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 deleted file mode 100644 index e73d70ea184..00000000000 --- a/proxies/statisk-data-forvalter-proxy/src/main/java/no/nav/testnav/proxies/statiskdataforvalterproxy/StatusController.java +++ /dev/null @@ -1,64 +0,0 @@ -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; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; - -import java.util.Map; - -@RestController -public class StatusController { - private static final String TEAM = "Team Dolly"; - - @GetMapping(value = "/internal/status", produces = MediaType.APPLICATION_JSON_VALUE) - 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); - - return Map.of( - "testnorge-statisk-data-forvalter", status - ); - } - - 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) - .blockOptional() - .orElse("Error: Empty response") - ); - status.setReady( - checkStatus(webClient, readyUrl) - .blockOptional() - .orElse("Error: Empty response") - ); - }); - blockingThread.start(); - try { - blockingThread.join(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - - return status; - } - - 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"); - } -} diff --git a/proxies/statisk-data-forvalter-proxy/src/main/resources/application.yml b/proxies/statisk-data-forvalter-proxy/src/main/resources/application.yml deleted file mode 100644 index fd8fefcd209..00000000000 --- a/proxies/statisk-data-forvalter-proxy/src/main/resources/application.yml +++ /dev/null @@ -1,28 +0,0 @@ -AAD_ISSUER_URI: https://login.microsoftonline.com/62366534-1ec3-4962-8869-9b5535279d0b - -spring: - application: - name: testnav-statisk-data-forvalter-proxy - description: Proxy for statisk data forvalter som legger på sikkerhet. - security: - oauth2: - resourceserver: - aad: - issuer-uri: ${AAD_ISSUER_URI}/v2.0 - jwk-set-uri: ${AAD_ISSUER_URI}/discovery/v2.0/keys - accepted-audience: ${azure.app.client.id}, api://${azure.app.client.id} - tokenx: - issuer-uri: https://tokenx.dev-gcp.nav.cloud.nais.io - jwk-set-uri: https://tokenx.dev-gcp.nav.cloud.nais.io/jwks - accepted-audience: ${TOKEN_X_CLIENT_ID} - cloud: - gateway: - httpclient: - response-timeout: 30s - -consumers: - statiskdataforvalter: - name: testnorge-statisk-data-forvalter - namespace: dolly - url: http://testnorge-statisk-data-forvalter.dolly.svc.nais.local - cluster: dev-fss diff --git a/proxies/statisk-data-forvalter-proxy/src/main/resources/bootstrap.yml b/proxies/statisk-data-forvalter-proxy/src/main/resources/bootstrap.yml deleted file mode 100644 index 0451449ca23..00000000000 --- a/proxies/statisk-data-forvalter-proxy/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,4 +0,0 @@ -spring: - cloud: - vault: - enabled: false \ No newline at end of file diff --git a/proxies/statisk-data-forvalter-proxy/src/main/resources/logback-spring.xml b/proxies/statisk-data-forvalter-proxy/src/main/resources/logback-spring.xml deleted file mode 100644 index 52c15597b3c..00000000000 --- a/proxies/statisk-data-forvalter-proxy/src/main/resources/logback-spring.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - true - 256 - 10280 - 20 - ^sun\.reflect\..*\.invoke - ^net\.sf\.cglib\.proxy\.MethodProxy\.invoke - java\.util\.concurrent\..* - org\.apache\.catalina\..* - org\.apache\.coyote\..* - org\.apache\.tomcat\..* - - - - - - - - - - - - - %d{HH:mm:ss.SSS} | %5p | %logger{25} | %m%n - - utf8 - - - - - - - - - \ No newline at end of file diff --git a/proxies/statisk-data-forvalter-proxy/src/test/java/no/nav/testnav/proxies/statiskdataforvalterproxy/ApplicationContextTest.java b/proxies/statisk-data-forvalter-proxy/src/test/java/no/nav/testnav/proxies/statiskdataforvalterproxy/ApplicationContextTest.java deleted file mode 100644 index a5a3818f74a..00000000000 --- a/proxies/statisk-data-forvalter-proxy/src/test/java/no/nav/testnav/proxies/statiskdataforvalterproxy/ApplicationContextTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package no.nav.testnav.proxies.statiskdataforvalterproxy; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.security.oauth2.jwt.ReactiveJwtDecoder; -import org.springframework.test.context.ActiveProfiles; - -@SpringBootTest -@ActiveProfiles("test") -class ApplicationContextTest { - - @MockBean - public ReactiveJwtDecoder reactiveJwtDecoder; - - @Test - @SuppressWarnings("java:S2699") - void load_app_context() { - } -} diff --git a/proxies/statisk-data-forvalter-proxy/src/test/resources/application-test.properties b/proxies/statisk-data-forvalter-proxy/src/test/resources/application-test.properties deleted file mode 100644 index 18ea64dc24a..00000000000 --- a/proxies/statisk-data-forvalter-proxy/src/test/resources/application-test.properties +++ /dev/null @@ -1,4 +0,0 @@ -spring.cloud.vault.token=dummy -azure.app.client.id=dummy -azure.app.client.secret=dummy -proxy.url=http://localhost \ No newline at end of file diff --git a/proxies/tps-forvalteren-proxy/config.yml b/proxies/tps-forvalteren-proxy/config.yml index cb513b61997..fe5c16c953e 100644 --- a/proxies/tps-forvalteren-proxy/config.yml +++ b/proxies/tps-forvalteren-proxy/config.yml @@ -36,12 +36,8 @@ spec: cluster: dev-gcp - application: dolly-backend cluster: dev-gcp - - application: testnav-person-export-api - cluster: dev-gcp - application: testnorge-hodejegeren cluster: dev-fss - - application: testnorge-statisk-data-forvalter - cluster: dev-fss liveness: path: /internal/isAlive initialDelay: 4 diff --git a/settings.gradle b/settings.gradle index 2bcf524ddf1..4c0e59d4e0f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -22,7 +22,6 @@ gradleEnterprise { } includeBuild './proxies/kodeverk-proxy' -includeBuild './proxies/statisk-data-forvalter-proxy' includeBuild './proxies/udistub-proxy' includeBuild './proxies/skjermingsregister-proxy' includeBuild './proxies/batch-adeo-proxy' @@ -80,14 +79,12 @@ includeBuild './apps/endringsmelding-service' includeBuild './apps/adresse-service' includeBuild './apps/pdl-forvalter' includeBuild './apps/amelding-service' -includeBuild './apps/arbeidsforhold-export-api' includeBuild './apps/arbeidsforhold-service' includeBuild './apps/varslinger-service' includeBuild './apps/dolly-frontend' includeBuild './apps/budpro-service' includeBuild './apps/dolly-backend' includeBuild './apps/synt-sykemelding-api' -includeBuild './apps/import-person-service' includeBuild './apps/jenkins-batch-status-service' includeBuild './apps/organisasjon-bestilling-service' includeBuild './apps/geografiske-kodeverk-service' @@ -97,7 +94,6 @@ includeBuild './apps/organisasjon-forvalter' includeBuild './apps/organisasjon-tilgang-service' includeBuild './apps/person-organisasjon-tilgang-service' includeBuild './apps/bruker-service' -includeBuild './apps/testnorge-tp' includeBuild './apps/testnorge-statisk-data-forvalter' includeBuild './apps/generer-arbeidsforhold-populasjon-service' includeBuild './apps/mn-synt-arbeidsforhold-service' @@ -119,7 +115,6 @@ includeBuild './apps/oppsummeringsdokument-service' includeBuild './apps/sykemelding-api' includeBuild './apps/person-search-service' includeBuild './apps/person-faste-data-service' -includeBuild './apps/person-export-api' includeBuild './apps/organisasjon-service' includeBuild './apps/hodejegeren' includeBuild './apps/tilbakemelding-api' From 42a7bae149ee3c3b8daea7f1c013d45388f082b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristen=20H=C3=A6rum?= Date: Wed, 13 Dec 2023 10:47:42 +0100 Subject: [PATCH 5/5] Opddatert bostedsadresse utland for NPID #deploy-test-pdl-forvalter (#3354) --- .../no/nav/pdl/forvalter/service/BostedAdresseService.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/BostedAdresseService.java b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/BostedAdresseService.java index 103aaca157c..076e87b22fb 100644 --- a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/BostedAdresseService.java +++ b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/BostedAdresseService.java @@ -126,13 +126,6 @@ private void handle(BostedadresseDTO bostedadresse, PersonDTO person) { person.setBostedsadresse(null); return; } - - } else { - - person.setBostedsadresse(new ArrayList(person.getBostedsadresse().stream() - .filter(adresse -> isTrue(adresse.getIsNew())) - .toList())); - return; } buildBoadresse(bostedadresse, person);