Skip to content

Commit

Permalink
Introduce ArbeidsforholdResponseDTO for detailed responses
Browse files Browse the repository at this point in the history
#deploy-levende-arbeidsforhold-ansettelse

Replaces HttpStatusCode with ArbeidsforholdResponseDTO to capture both status and detailed error messages. Refactors all related methods and classes to support this change, improving error handling and logging.
  • Loading branch information
krharum committed Oct 28, 2024
1 parent 4276349 commit 935f363
Show file tree
Hide file tree
Showing 7 changed files with 65 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,10 @@
import no.nav.testnav.levendearbeidsforholdansettelse.config.Consumers;
import no.nav.testnav.levendearbeidsforholdansettelse.consumers.command.aareg.HentArbeidsforholdCommand;
import no.nav.testnav.levendearbeidsforholdansettelse.consumers.command.aareg.OpprettArbeidsforholdCommand;
import no.nav.testnav.levendearbeidsforholdansettelse.domain.dto.ArbeidsforholdResponseDTO;
import no.nav.testnav.libs.dto.levendearbeidsforhold.v1.Arbeidsforhold;
import no.nav.testnav.libs.securitycore.domain.ServerProperties;
import no.nav.testnav.libs.standalone.servletsecurity.exchange.TokenExchange;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.client.WebClient;
Expand Down Expand Up @@ -54,10 +53,10 @@ public Flux<Arbeidsforhold> hentArbeidsforhold(String ident) {
.flatMapMany(token -> new HentArbeidsforholdCommand(webClient, token.getTokenValue(), ident).call()));
}

public Flux<HttpStatusCode> opprettArbeidsforhold(Arbeidsforhold requests) {
public Flux<ArbeidsforholdResponseDTO> opprettArbeidsforhold(Arbeidsforhold requests) {

return Flux.from(tokenExchange.exchange(serverProperties)
.flatMap(token -> new OpprettArbeidsforholdCommand(webClient, requests, token.getTokenValue()).call())
.map(ResponseEntity::getStatusCode));
.flatMap(token -> new OpprettArbeidsforholdCommand(webClient,
requests, token.getTokenValue()).call()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,24 @@

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import no.nav.testnav.levendearbeidsforholdansettelse.domain.dto.ArbeidsforholdResponseDTO;
import no.nav.testnav.libs.dto.levendearbeidsforhold.v1.Arbeidsforhold;
import no.nav.testnav.libs.reactivecore.utils.WebClientFilter;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
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;

import static io.netty.handler.codec.http.HttpResponseStatus.CREATED;

@Slf4j
@RequiredArgsConstructor
public class OpprettArbeidsforholdCommand implements Callable<Mono<ResponseEntity<Void>>> {
public class OpprettArbeidsforholdCommand implements Callable<Mono<ArbeidsforholdResponseDTO>> {

private final String navArbeidsforholdKilde = "Dolly-automatisk-ansettelse" ;
private final String miljoe = "q2";
Expand All @@ -25,7 +29,7 @@ public class OpprettArbeidsforholdCommand implements Callable<Mono<ResponseEntit
private final String token;

@Override
public Mono<ResponseEntity<Void>> call() {
public Mono<ArbeidsforholdResponseDTO> call() {

return webClient.post()
.uri(builder -> builder.path("/{miljoe}/api/v1/arbeidsforhold")
Expand All @@ -35,9 +39,17 @@ public Mono<ResponseEntity<Void>> call() {
.header("Nav-Arbeidsforhold-Kildereferanse", navArbeidsforholdKilde)
.bodyValue(requests)
.retrieve()
.toBodilessEntity()
.bodyToMono(String.class)
.map(payload -> ArbeidsforholdResponseDTO.builder()
.statusCode(HttpStatusCode.valueOf(CREATED.code()))
.payload(payload)
.build())
.retryWhen(Retry.backoff(3, Duration.ofSeconds(5))
.filter(WebClientFilter::is5xxException))
.doOnError(WebClientFilter::logErrorMessage);
.doOnError(WebClientFilter::logErrorMessage)
.onErrorResume(error -> Mono.just(ArbeidsforholdResponseDTO.builder()
.statusCode(WebClientFilter.getStatus(error))
.feilmelding(WebClientFilter.getMessage(error))
.build()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package no.nav.testnav.levendearbeidsforholdansettelse.domain.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.http.HttpStatusCode;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ArbeidsforholdResponseDTO {

private HttpStatusCode statusCode;
private String payload;
private String feilmelding;
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,14 @@ public class AnsettelseLoggService {

/**
* Funksjonen som lagrer ansettelsen i db
*
* @param kanAnsette inneholder ident og orgnummer
* @param parametere Stillingsprosent og arbeidsavtalarbeidsforholdType til personen.
*/
public Mono<AnsettelseLogg> lagreAnsettelse(KanAnsettesDTO kanAnsette, Map<String, String> parametere){
public Mono<AnsettelseLogg> lagreAnsettelse(KanAnsettesDTO kanAnsette, Map<String, String> parametere) {

return ansettelseLoggRepository.save(AnsettelseLogg.builder()
.isNew(true)
.isNew(true)
.folkeregisterident(kanAnsette.getIdent())
.organisasjonsnummer(kanAnsette.getOrgnummer())
.timestamp(LocalDateTime.now())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import no.nav.testnav.levendearbeidsforholdansettelse.consumers.TenorConsumer;
import no.nav.testnav.levendearbeidsforholdansettelse.domain.DatoIntervall;
import no.nav.testnav.levendearbeidsforholdansettelse.domain.dto.ArbeidsforholdDTO;
import no.nav.testnav.levendearbeidsforholdansettelse.domain.dto.ArbeidsforholdResponseDTO;
import no.nav.testnav.levendearbeidsforholdansettelse.domain.dto.KanAnsettesDTO;
import no.nav.testnav.levendearbeidsforholdansettelse.domain.dto.OrganisasjonResponseDTO;
import no.nav.testnav.levendearbeidsforholdansettelse.domain.dto.PdlPersonDTO;
Expand All @@ -14,10 +15,10 @@
import no.nav.testnav.levendearbeidsforholdansettelse.utility.SannsynlighetVelger;
import no.nav.testnav.libs.dto.levendearbeidsforhold.v1.Arbeidsavtale;
import no.nav.testnav.libs.dto.levendearbeidsforhold.v1.Arbeidsforhold;
import org.springframework.http.HttpStatusCode;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.security.SecureRandom;
import java.util.List;
Expand Down Expand Up @@ -79,14 +80,22 @@ private Flux<AnsettelseLogg> sjekkOgSendinnArbeidsforhold(OrganisasjonResponseDT
List<String> yrkeskoder, List<DatoIntervall> datointervaller) {

return Flux.fromIterable(getFordeling(parametere).entrySet())
.limitRate(1)
.flatMap(intervall -> Flux.range(0, intervall.getValue())
.flatMap(index -> getPersonSomKanAnsettes((int) getParameterValue(parametere, STILLINGSPROSENT),
datointervaller.get(intervall.getKey()), organisasjon)
.flatMap(kanAnsettes -> ansettPerson(kanAnsettes, hentTilfeldigYrkeskode(yrkeskoder), parametere)
.doOnNext(status -> log.info("Opprettet arbeidsforhold orgnummer {}, ident {}, status {}",
kanAnsettes.getOrgnummer(), kanAnsettes.getIdent(), status))
.flatMap(status ->
ansettelseLoggService.lagreAnsettelse(kanAnsettes, parametere)))));
.flatMap(response -> {
if (response.getStatusCode().is2xxSuccessful()) {
log.info("Opprettet arbeidsforhold orgnummer {}, ident {}, status {}",
kanAnsettes.getOrgnummer(), kanAnsettes.getIdent(), response.getStatusCode());
return ansettelseLoggService.lagreAnsettelse(kanAnsettes, parametere);
} else {
log.error("Oppretting mot AAREG feilet {} ", response.getFeilmelding());
return Mono.empty();
}
}))));

}

private Flux<KanAnsettesDTO> getPersonSomKanAnsettes(Integer stillingsprosent, DatoIntervall intervall,
Expand Down Expand Up @@ -136,8 +145,8 @@ private Flux<ArbeidsforholdDTO> getArbeidsforhold(DatoIntervall datoIntervall, S
.build()));
}

private Flux<HttpStatusCode> ansettPerson(KanAnsettesDTO arbeidsforhold, String yrke,
Map<String, String> parametere) {
private Flux<ArbeidsforholdResponseDTO> ansettPerson(KanAnsettesDTO arbeidsforhold, String yrke,
Map<String, String> parametere) {

return arbeidsforholdService.opprettArbeidsforhold(arbeidsforhold, yrke,
(String) getParameterValue(parametere, ARBEIDSFORHOLD_TYPE),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,19 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import no.nav.testnav.levendearbeidsforholdansettelse.consumers.AaregConsumer;
import no.nav.testnav.levendearbeidsforholdansettelse.domain.dto.ArbeidsforholdResponseDTO;
import no.nav.testnav.levendearbeidsforholdansettelse.domain.dto.KanAnsettesDTO;
import no.nav.testnav.libs.dto.levendearbeidsforhold.v1.Ansettelsesperiode;
import no.nav.testnav.libs.dto.levendearbeidsforhold.v1.Arbeidsforhold;
import no.nav.testnav.libs.dto.levendearbeidsforhold.v1.OrdinaerArbeidsavtale;
import no.nav.testnav.libs.dto.levendearbeidsforhold.v1.Organisasjon;
import no.nav.testnav.libs.dto.levendearbeidsforhold.v1.Periode;
import no.nav.testnav.libs.dto.levendearbeidsforhold.v1.Person;
import org.springframework.http.HttpStatusCode;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.Duration;
import java.time.LocalDate;
import java.util.List;

Expand Down Expand Up @@ -51,11 +50,11 @@ public Flux<Arbeidsforhold> getArbeidsforhold(String ident) {
* @param stillingsprosent Stillinsprosenten arbeidsforholdet skal ha
* @return HttpStatusCode basert på resultatet av spørringen
*/
public Flux<HttpStatusCode> opprettArbeidsforhold(KanAnsettesDTO kanAnsettes, String yrke,
String arbeidsforholdstype, Integer stillingsprosent) {
public Flux<ArbeidsforholdResponseDTO> opprettArbeidsforhold(KanAnsettesDTO kanAnsettes, String yrke,
String arbeidsforholdstype, Integer stillingsprosent) {

return aaregConsumer.opprettArbeidsforhold(lagArbeidsforhold(kanAnsettes, yrke, arbeidsforholdstype, stillingsprosent))
.delayElements(Duration.ofSeconds(1));
return aaregConsumer.opprettArbeidsforhold(lagArbeidsforhold(kanAnsettes,
yrke, arbeidsforholdstype, stillingsprosent));
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,11 @@ spring:
flyway:
# InMemmory database
url: jdbc:postgresql://localhost:5432/testnav-levende-arbeidsforhold
user: postgres
username: ${spring.flyway.user}
user: ${NAV_USERNAME}
password:
r2dbc:
url: r2dbc:postgresql://localhost:5432/testnav-levende-arbeidsforhold
username: postgres
username: ${NAV_USERNAME}
password:
# sql:
# init:
Expand Down

0 comments on commit 935f363

Please sign in to comment.