diff --git a/apps/organisasjon-forvalter/build.gradle b/apps/organisasjon-forvalter/build.gradle index 50db6abb5e5..fbe57eb5f33 100644 --- a/apps/organisasjon-forvalter/build.gradle +++ b/apps/organisasjon-forvalter/build.gradle @@ -23,7 +23,7 @@ dependencies { implementation 'no.nav.testnav.libs:security-core' implementation 'no.nav.testnav.libs:database' implementation 'no.nav.testnav.libs:servlet-security' - implementation 'no.nav.testnav.libs:commands' + implementation 'no.nav.testnav.libs:reactive-core' implementation 'no.nav.testnav.libs:data-transfer-objects' implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' diff --git a/apps/organisasjon-forvalter/settings.gradle b/apps/organisasjon-forvalter/settings.gradle index a196306f3e1..dd5c7f21ef4 100644 --- a/apps/organisasjon-forvalter/settings.gradle +++ b/apps/organisasjon-forvalter/settings.gradle @@ -7,13 +7,13 @@ rootProject.name = 'organisasjon-forvalter' includeBuild "../../plugins/java" includeBuild '../../libs/avro-schema' -includeBuild '../../libs/commands' includeBuild '../../libs/data-transfer-objects' includeBuild '../../libs/database' includeBuild '../../libs/kafka-config' includeBuild '../../libs/kafka-producers' includeBuild '../../libs/security-core' includeBuild '../../libs/servlet-core' +includeBuild '../../libs/reactive-core' includeBuild '../../libs/servlet-security' includeBuild '../../libs/testing' diff --git a/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/GenererNavnServiceConsumer.java b/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/GenererNavnServiceConsumer.java index 93226c6a644..e04b155cd30 100644 --- a/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/GenererNavnServiceConsumer.java +++ b/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/GenererNavnServiceConsumer.java @@ -2,22 +2,16 @@ import lombok.extern.slf4j.Slf4j; import no.nav.organisasjonforvalter.config.Consumers; -import no.nav.testnav.libs.commands.generernavnservice.v1.GenererNavnCommand; +import no.nav.organisasjonforvalter.consumer.command.GenererNavnCommand; 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.Service; -import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.reactive.function.client.WebClientResponseException; -import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import static java.lang.String.format; -import static java.lang.System.currentTimeMillis; -import static java.util.Objects.requireNonNull; @Slf4j @Service @@ -40,30 +34,16 @@ public GenererNavnServiceConsumer( public List getOrgName(Integer antall) { - long startTime = currentTimeMillis(); - try { - var accessToken = tokenExchange.exchange(serverProperties); - var navn = new GenererNavnCommand(webClient, accessToken.block().getTokenValue(), antall).call(); - - log.info("Generer-navn-service svarte etter {} ms", currentTimeMillis() - startTime); - return Arrays.stream(navn) - .map(value -> format("%s %s", value.getAdjektiv(), value.getSubstantiv())) - .collect(Collectors.toList()); - - } catch (WebClientResponseException e) { - log.error(e.getMessage(), e); - throw new HttpClientErrorException(e.getStatusCode(), requireNonNull(e.getMessage())); - - } catch (RuntimeException e) { - - log.error(e.getMessage(), e); - throw new HttpClientErrorException(HttpStatus.GATEWAY_TIMEOUT, e.getMessage()); - } + return tokenExchange.exchange(serverProperties) + .flatMapMany(token -> new GenererNavnCommand(webClient, antall, token.getTokenValue()).call()) + .map(value -> format("%s %s", value.getAdjektiv(), value.getSubstantiv())) + .collect(Collectors.toList()) + .block(); } public String getOrgName() { List orgName = getOrgName(1); - return orgName.isEmpty() ? null : orgName.get(0); + return orgName.isEmpty() ? null : orgName.getFirst(); } } diff --git a/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/MiljoerServiceConsumer.java b/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/MiljoerServiceConsumer.java index 46bf8302db2..11a478c19b1 100644 --- a/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/MiljoerServiceConsumer.java +++ b/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/MiljoerServiceConsumer.java @@ -10,6 +10,7 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.time.Duration; import java.util.Arrays; import java.util.Set; import java.util.stream.Collectors; @@ -33,7 +34,6 @@ public MiljoerServiceConsumer( this.tokenExchange = tokenExchange; } - // @Cacheable(CACHE_MILJOER) public Set getOrgMiljoer() { return tokenExchange.exchange(serverProperties) @@ -43,6 +43,7 @@ public Set getOrgMiljoer() { .filter(env -> !env.equals("t13") && !env.equals("qx")) .collect(Collectors.toSet())) .flatMap(Mono::from) + .cache(Duration.ofMinutes(5)) .block(); } } diff --git a/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/OrganisasjonServiceConsumer.java b/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/OrganisasjonServiceConsumer.java index 3bf3779ccd2..aa98e03918f 100644 --- a/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/OrganisasjonServiceConsumer.java +++ b/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/OrganisasjonServiceConsumer.java @@ -1,30 +1,20 @@ package no.nav.organisasjonforvalter.consumer; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.organisasjonforvalter.config.Consumers; -import no.nav.testnav.libs.commands.organisasjonservice.v1.GetOrganisasjonCommand; +import no.nav.organisasjonforvalter.consumer.command.OrganisasjonServiceCommand; import no.nav.testnav.libs.dto.organisasjon.v1.OrganisasjonDTO; import no.nav.testnav.libs.securitycore.domain.ServerProperties; import no.nav.testnav.libs.servletsecurity.exchange.TokenExchange; import org.springframework.stereotype.Service; - import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; import java.util.Map; -import java.util.Optional; import java.util.Set; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.stream.Collectors; -import static java.lang.System.currentTimeMillis; -import static java.util.Objects.nonNull; - @Slf4j @Service public class OrganisasjonServiceConsumer { @@ -32,7 +22,6 @@ public class OrganisasjonServiceConsumer { private final TokenExchange tokenExchange; private final WebClient webClient; private final ServerProperties serverProperties; - private final ExecutorService executorService; public OrganisasjonServiceConsumer( Consumers consumers, @@ -42,107 +31,20 @@ public OrganisasjonServiceConsumer( .baseUrl(serverProperties.getUrl()) .build(); this.tokenExchange = tokenExchange; - this.executorService = Executors.newFixedThreadPool(serverProperties.getThreads()); - } - - public Optional getStatus(String orgnummer, String miljoe) { - - try { - return getStatus(Set.of(orgnummer), Set.of(miljoe)).get(miljoe).get(orgnummer); - } catch (RuntimeException e) { - log.error(e.getMessage(), e); - return Optional.empty(); - } - } - - public Map>> getStatus(Set orgnummer, Set miljoer) { - - long startTime = currentTimeMillis(); - - var token = tokenExchange.exchange(serverProperties).block().getTokenValue(); - - var completables = miljoer.stream() - .map(miljoe -> OrgFutureDTO.builder() - .miljoe(miljoe) - .futureDto(orgnummer.stream() - .map(orgnr -> FutureDTO.builder() - .orgnr(orgnr) - .completableFuture( - CompletableFuture.supplyAsync(() -> - new GetOrganisasjonCommand(webClient, token, orgnr, miljoe).call(), - executorService)) - .build()) - .collect(Collectors.toMap(entry -> entry.getOrgnr(), entry -> entry.getCompletableFuture()))) - .build()) - .collect(Collectors.toMap(entry -> entry.getMiljoe(), entry -> entry.getFutureDto())); - - var organisasjoner = completables.keySet().stream() - .map(miljoe -> MiljoeOrgnrOrgDTO.builder() - .miljoe(miljoe) - .orgnrOrgDTO( - completables.get(miljoe).keySet().stream() - .map(orgnr -> - OrganisasjonServiceConsumer.OrgnrOrgDTO.builder() - .orgnr(orgnr) - .organisasjonDTO(resolveCompleteable(completables.get(miljoe).get(orgnr))) - .build()) - .collect(Collectors.toMap(entry -> entry.getOrgnr(), entry -> entry.getOrganisasjonDTO()))) - .build()) - .collect(Collectors.toMap(entry -> entry.getMiljoe(), entry -> entry.getOrgnrOrgDTO())); - - log.info("Organisasjon-Service svarte med funnet etter {} ms", currentTimeMillis() - startTime); - - return organisasjoner; - } - - private Optional resolveCompleteable(CompletableFuture future) { - - try { - var result = future.get(); - return nonNull(result) ? Optional.of(result) : Optional.empty(); - } catch (Exception e) { - log.error(e.getMessage(), e); - return Optional.empty(); - } - } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - private static class OrgFutureDTO { - - private String miljoe; - private Map> futureDto; - } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - private static class FutureDTO { - - private String orgnr; - private CompletableFuture completableFuture; } - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - private static class MiljoeOrgnrOrgDTO { + public Flux> getStatus(String orgnummer, String miljoe) { - private String miljoe; - private Map> orgnrOrgDTO; + return getStatus(Set.of(orgnummer), Set.of(miljoe)); } - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - private static class OrgnrOrgDTO { + public Flux> getStatus(Set orgnummere, Set miljoer) { - private String orgnr; - private Optional organisasjonDTO; + return tokenExchange.exchange(serverProperties) + .flatMapMany(token -> Flux.fromIterable(miljoer) + .map(orgnr -> Flux.fromIterable(orgnummere) + .flatMap(miljoe -> new OrganisasjonServiceCommand(webClient, orgnr, miljoe, token.getTokenValue()).call()) + .collect(Collectors.toMap(orgMap -> orgnr, orgMap -> orgMap)))) + .flatMap(Mono::flux); } } diff --git a/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/AdresseServiceCommand.java b/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/AdresseServiceCommand.java index 76981d582a1..0f0d3168aea 100644 --- a/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/AdresseServiceCommand.java +++ b/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/AdresseServiceCommand.java @@ -1,8 +1,8 @@ package no.nav.organisasjonforvalter.consumer.command; import lombok.RequiredArgsConstructor; -import no.nav.testnav.libs.commands.utils.WebClientFilter; import no.nav.testnav.libs.dto.adresseservice.v1.VegadresseDTO; +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; @@ -28,6 +28,7 @@ public Mono call() { .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) .retrieve() .bodyToMono(VegadresseDTO[].class) + .doOnError(WebClientFilter::logErrorMessage) .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) .filter(WebClientFilter::is5xxException)); } diff --git a/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/GenererNavnCommand.java b/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/GenererNavnCommand.java new file mode 100644 index 00000000000..3a1dfc82a0d --- /dev/null +++ b/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/GenererNavnCommand.java @@ -0,0 +1,38 @@ +package no.nav.organisasjonforvalter.consumer.command; + +import lombok.RequiredArgsConstructor; +import no.nav.testnav.libs.dto.generernavnservice.v1.NavnDTO; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; +import org.springframework.http.HttpHeaders; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.util.retry.Retry; + +import java.time.Duration; +import java.util.concurrent.Callable; + +@RequiredArgsConstructor +public class GenererNavnCommand implements Callable> { + + private final WebClient webClient; + private final Integer antall; + private final String accessToken; + + @Override + public Flux call() { + return webClient + .get() + .uri(builder -> builder + .path("/api/v1/navn") + .queryParam("antall", antall) + .build()) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) + .retrieve() + .bodyToFlux(NavnDTO.class) + .doOnError(WebClientFilter::logErrorMessage) + .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) + .filter(WebClientFilter::is5xxException)) + .onErrorResume(throwable -> Mono.empty()); + } +} \ No newline at end of file diff --git a/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/MiljoerServiceCommand.java b/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/MiljoerServiceCommand.java index f04d38614b4..6213f155ac8 100644 --- a/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/MiljoerServiceCommand.java +++ b/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/MiljoerServiceCommand.java @@ -1,7 +1,7 @@ package no.nav.organisasjonforvalter.consumer.command; import lombok.RequiredArgsConstructor; -import no.nav.testnav.libs.commands.utils.WebClientFilter; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; diff --git a/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/OrganisasjonBestillingIdsCommand.java b/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/OrganisasjonBestillingIdsCommand.java index d69c82d309e..1b1f9197b29 100644 --- a/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/OrganisasjonBestillingIdsCommand.java +++ b/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/OrganisasjonBestillingIdsCommand.java @@ -3,7 +3,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.organisasjonforvalter.jpa.entity.Status; -import no.nav.testnav.libs.commands.utils.WebClientFilter; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.web.reactive.function.client.WebClient; @@ -32,7 +32,7 @@ public Mono call() { .accept(MediaType.APPLICATION_JSON) .retrieve() .bodyToMono(String[].class) - .doOnNext(resultat -> log.info("Melding mottatt {}", resultat)) + .doOnNext(resultat -> log.info("Melding mottatt {}", Arrays.toString(resultat))) .map(resultat -> Arrays.stream(resultat) .mapToInt(Integer::parseInt) .max() diff --git a/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/OrganisasjonBestillingStatusCommand.java b/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/OrganisasjonBestillingStatusCommand.java index 0c2ba7eb14b..8ec1b4c7173 100644 --- a/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/OrganisasjonBestillingStatusCommand.java +++ b/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/OrganisasjonBestillingStatusCommand.java @@ -5,10 +5,9 @@ import no.nav.organisasjonforvalter.dto.responses.BestillingStatus; import no.nav.organisasjonforvalter.dto.responses.StatusDTO; import no.nav.organisasjonforvalter.jpa.entity.Status; -import no.nav.testnav.libs.commands.utils.WebClientFilter; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.reactive.function.client.WebClientResponseException; import reactor.core.publisher.Mono; import reactor.util.retry.Retry; @@ -29,8 +28,8 @@ public class OrganisasjonBestillingStatusCommand implements Callable call() { return webClient.get() - .uri(STATUS_URL.replace("{uuid}", status.getUuid()) - .replace("{id}", status.getBestId())) + .uri(uriBuilder -> uriBuilder.path(STATUS_URL) + .build(status.getUuid(), status.getBestId())) .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) .retrieve() .bodyToMono(StatusDTO.class) @@ -42,24 +41,13 @@ public Mono call() { .build())) .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) .filter(WebClientFilter::is5xxException)) - .doOnError(throwable -> log.error(getMessage(throwable))) - .onErrorResume(throwable -> getError(status, getMessage(throwable))); - } - - private static String getMessage(Throwable throwable) { - - return throwable instanceof WebClientResponseException webClientResponseException ? - webClientResponseException.getResponseBodyAsString() : - throwable.getMessage(); - } - - private static Mono getError(Status status, String description) { - - return Mono.just(BestillingStatus.builder() - .orgnummer(status.getOrganisasjonsnummer()) - .uuid(status.getUuid()) - .miljoe(status.getMiljoe()) - .feilmelding(description) - .build()); + .doOnError(WebClientFilter::logErrorMessage) + .onErrorResume(throwable -> + Mono.just(BestillingStatus.builder() + .orgnummer(status.getOrganisasjonsnummer()) + .uuid(status.getUuid()) + .miljoe(status.getMiljoe()) + .feilmelding(WebClientFilter.getMessage(throwable)) + .build())); } } \ No newline at end of file diff --git a/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/OrganisasjonOrgnummerServiceCommand.java b/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/OrganisasjonOrgnummerServiceCommand.java index 2405c489d16..02efac52271 100644 --- a/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/OrganisasjonOrgnummerServiceCommand.java +++ b/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/OrganisasjonOrgnummerServiceCommand.java @@ -1,7 +1,7 @@ package no.nav.organisasjonforvalter.consumer.command; import lombok.RequiredArgsConstructor; -import no.nav.testnav.libs.commands.utils.WebClientFilter; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; @@ -28,6 +28,7 @@ public Mono call() { .header("antall", antall.toString()) .retrieve() .bodyToMono(String[].class) + .doOnError(WebClientFilter::logErrorMessage) .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) .filter(WebClientFilter::is5xxException)); } diff --git a/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/OrganisasjonServiceCommand.java b/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/OrganisasjonServiceCommand.java index aaa7485984f..c8d26cc1a83 100644 --- a/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/OrganisasjonServiceCommand.java +++ b/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/consumer/command/OrganisasjonServiceCommand.java @@ -1,18 +1,21 @@ package no.nav.organisasjonforvalter.consumer.command; import lombok.RequiredArgsConstructor; -import no.nav.testnav.libs.commands.utils.WebClientFilter; +import lombok.extern.slf4j.Slf4j; import no.nav.testnav.libs.dto.organisasjon.v1.OrganisasjonDTO; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.util.retry.Retry; import java.time.Duration; import java.util.concurrent.Callable; +@Slf4j @RequiredArgsConstructor -public class OrganisasjonServiceCommand implements Callable> { +public class OrganisasjonServiceCommand implements Callable> { private static final String STATUS_URL = "/api/v1/organisasjoner/{orgnummer}"; private static final String MILJOE = "miljo"; @@ -23,14 +26,21 @@ public class OrganisasjonServiceCommand implements Callable call() { + public Flux call() { + + log.info("Henter organisasjon {} fra miljø {} ", orgnummer, environment); return webClient.get() - .uri(STATUS_URL.replace("{orgnummer}", orgnummer)) + .uri(uriBuilder -> uriBuilder.path(STATUS_URL) + .build(orgnummer)) .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) .header(MILJOE, environment) .retrieve() - .bodyToMono(OrganisasjonDTO.class) + .bodyToFlux(OrganisasjonDTO.class) + .doOnError(WebClientFilter::logErrorMessage) + .onErrorResume(throwable -> Mono.just(OrganisasjonDTO.builder() + .error(WebClientFilter.getMessage(throwable)) + .build())) .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) .filter(WebClientFilter::is5xxException)); } diff --git a/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/service/ImportService.java b/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/service/ImportService.java index 62cdca4b877..d122c6ab820 100644 --- a/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/service/ImportService.java +++ b/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/service/ImportService.java @@ -1,28 +1,23 @@ package no.nav.organisasjonforvalter.service; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import ma.glasnost.orika.MapperFacade; import no.nav.organisasjonforvalter.consumer.MiljoerServiceConsumer; import no.nav.organisasjonforvalter.consumer.OrganisasjonServiceConsumer; import no.nav.organisasjonforvalter.dto.responses.RsOrganisasjon; -import no.nav.organisasjonforvalter.jpa.entity.Organisasjon; -import no.nav.organisasjonforvalter.jpa.repository.OrganisasjonRepository; -import no.nav.testnav.libs.dto.organisasjon.v1.OrganisasjonDTO; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import reactor.core.publisher.Flux; -import java.util.HashSet; import java.util.Map; -import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import static java.util.Objects.nonNull; +import static org.apache.commons.lang3.StringUtils.isNotBlank; +@Slf4j @Service @RequiredArgsConstructor public class ImportService { @@ -30,14 +25,6 @@ public class ImportService { private final MiljoerServiceConsumer miljoerServiceConsumer; private final OrganisasjonServiceConsumer organisasjonServiceConsumer; private final MapperFacade mapperFacade; - private final OrganisasjonRepository organisasjonRepository; - - private static Set getAllOrgnr(Organisasjon organisasjon, Set orgnr) { - - orgnr.add(organisasjon.getOrganisasjonsnummer()); - organisasjon.getUnderenheter().forEach(org -> getAllOrgnr(org, orgnr)); - return orgnr; - } @Transactional public Map getOrganisasjoner(String orgnummer, Set miljoer) { @@ -48,58 +35,12 @@ public Map getOrganisasjoner(String orgnummer, Set getAllOrgnr(organisasjon, - new HashSet<>())).orElseGet(() -> Set.of(orgnummer)), miljoerAaSjekke); - - return organisasjoner.keySet().stream() - .filter(env -> !organisasjoner.get(env).entrySet().isEmpty()) - .map(env -> OrganisasjonMiljoe.builder() - .organisasjon(getOrganisasjon(env, orgnummer, organisasjoner)) - .miljoe(env) - .build()) - .filter(org -> nonNull(org.getOrganisasjon())) - .collect(Collectors.toMap(OrganisasjonMiljoe::getMiljoe, OrganisasjonMiljoe::getOrganisasjon)); - } - - private RsOrganisasjon getOrganisasjon(String env, String orgnummer, - Map>> organisasjoner) { - - OrganisasjonDTO organisasjonDto; - if (organisasjoner.get(env).containsKey(orgnummer)) { - if (organisasjoner.get(env).get(orgnummer).isPresent()) { - organisasjonDto = organisasjoner.get(env).get(orgnummer).get(); - } else { - return null; - } - } else { - var organisasjon = organisasjonServiceConsumer.getStatus(orgnummer, env); - if (organisasjon.isPresent()) { - organisasjonDto = organisasjon.get(); - } else { - return null; - } - } - - RsOrganisasjon organisasjon = mapperFacade.map(organisasjonDto, RsOrganisasjon.class); - if (nonNull(organisasjonDto.getDriverVirksomheter())) { - organisasjon.setUnderenheter(organisasjonDto.getDriverVirksomheter().stream() - .map(orgnr -> getOrganisasjon(env, orgnr, organisasjoner)) - .collect(Collectors.toList())); - } - return organisasjon; - } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - public static class OrganisasjonMiljoe { - - private RsOrganisasjon organisasjon; - private String miljoe; + return organisasjonServiceConsumer.getStatus(Set.of(orgnummer), miljoerAaSjekke) + .map(Map::entrySet) + .flatMap(Flux::fromIterable) + .filter(org -> isNotBlank(org.getValue().getOrgnummer())) + .collect(Collectors.toMap(Map.Entry::getKey, + org -> mapperFacade.map(org.getValue(), RsOrganisasjon.class))) + .block(); } } diff --git a/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/service/OrdreService.java b/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/service/OrdreService.java index 0ab17fd6e90..dfaeb12733d 100644 --- a/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/service/OrdreService.java +++ b/apps/organisasjon-forvalter/src/main/java/no/nav/organisasjonforvalter/service/OrdreService.java @@ -16,13 +16,17 @@ import org.springframework.stereotype.Service; import org.springframework.web.client.HttpClientErrorException; +import java.util.Collection; import java.util.List; +import java.util.Map; import java.util.UUID; import java.util.stream.Collectors; import static java.lang.String.format; +import static java.util.Objects.isNull; import static no.nav.organisasjonforvalter.dto.responses.DeployResponse.Status.ERROR; import static no.nav.organisasjonforvalter.dto.responses.DeployResponse.Status.OK; +import static org.apache.commons.lang3.StringUtils.isBlank; import static org.springframework.http.HttpStatus.BAD_REQUEST; @Slf4j @@ -82,10 +86,19 @@ public DeployResponse deploy(DeployRequest request) { private void deployOrganisasjon(String uuid, Organisasjon organisasjon, String env) { - if (organisasjonServiceConsumer.getStatus(organisasjon.getOrganisasjonsnummer(), env).isEmpty()) { + var orgStatus = organisasjonServiceConsumer.getStatus(organisasjon.getOrganisasjonsnummer(), env) + .collectList() + .block(); + + if (isNull(orgStatus) || orgStatus.stream() + .map(Map::entrySet) + .flatMap(Collection::stream) + .allMatch(org -> isBlank(org.getValue().getOrgnummer()))) { + organisasjonMottakConsumer.opprettOrganisasjon(uuid, organisasjon, env); } else { + organisasjonMottakConsumer.endreOrganisasjon(uuid, organisasjon, env); } } diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organisasjon/v1/OrganisasjonDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organisasjon/v1/OrganisasjonDTO.java index 05920935a7c..821c2eef33e 100644 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organisasjon/v1/OrganisasjonDTO.java +++ b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/organisasjon/v1/OrganisasjonDTO.java @@ -1,6 +1,5 @@ package no.nav.testnav.libs.dto.organisasjon.v1; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.AllArgsConstructor; import lombok.Builder; @@ -9,8 +8,6 @@ import java.util.List; -import static java.util.Objects.nonNull; - @Data @Builder @AllArgsConstructor @@ -18,8 +15,7 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class OrganisasjonDTO { - public static final String NOT_FOUND = "Ikke funnet"; - + private final String error; private final String orgnummer; private final String enhetType; private final String navn; @@ -28,21 +24,5 @@ public class OrganisasjonDTO { private final AdresseDTO forretningsadresser; private final String redigertnavn; private final List driverVirksomheter; - - public OrganisasjonDTO(OrganisasjonDTO dto) { - this.orgnummer = dto.getOrgnummer(); - this.enhetType = dto.getEnhetType(); - this.navn = dto.getNavn(); - this.juridiskEnhet = dto.getJuridiskEnhet(); - this.postadresse = dto.getPostadresse(); - this.forretningsadresser = dto.getForretningsadresser(); - this.redigertnavn = dto.getRedigertnavn(); - this.driverVirksomheter = dto.getDriverVirksomheter(); - } - - @JsonIgnore - public boolean isFunnet() { - - return nonNull(juridiskEnhet) && !NOT_FOUND.equals(juridiskEnhet); - } } +