Skip to content

Commit ddc1eff

Browse files
authored
DigdirKrrProxy: spør på nytt POST-endepunkt for å hente ut språkvalg (#2267)
* DigdirKrrProxy: spør på nytt POST-endepunkt for å hente ut språkvalg * Fiks DIGDIR klient som var en bulk tjeneste * Fjern gammel dto * Bedre håndtering ved tom respons * person_ikke_funnet * Fjerner bruk av NAV_PERSON_IDENT
1 parent 12d4a33 commit ddc1eff

File tree

6 files changed

+159
-89
lines changed

6 files changed

+159
-89
lines changed

src/main/java/no/nav/foreldrepenger/mottak/http/WebClientConfiguration.java

+26-28
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
package no.nav.foreldrepenger.mottak.http;
22

3-
import static no.nav.foreldrepenger.common.util.Constants.FORELDREPENGER;
4-
import static no.nav.foreldrepenger.common.util.Constants.NAV_CALL_ID;
5-
import static no.nav.foreldrepenger.common.util.Constants.NAV_CALL_ID1;
6-
import static no.nav.foreldrepenger.common.util.Constants.NAV_CALL_ID2;
7-
import static no.nav.foreldrepenger.common.util.Constants.NAV_CONSUMER_ID;
8-
import static no.nav.foreldrepenger.common.util.Constants.NAV_PERSON_IDENT;
9-
import static no.nav.foreldrepenger.mottak.http.TokenUtil.BEARER;
10-
import static org.springframework.http.HttpHeaders.AUTHORIZATION;
11-
12-
import java.net.ProxySelector;
13-
import java.net.http.HttpClient;
14-
import java.time.Duration;
15-
import java.util.Optional;
16-
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import graphql.kickstart.spring.webclient.boot.GraphQLWebClient;
5+
import no.nav.foreldrepenger.common.util.MDCUtil;
6+
import no.nav.foreldrepenger.mottak.innsending.foreldrepenger.FordelConfig;
7+
import no.nav.foreldrepenger.mottak.innsending.pdf.pdftjeneste.PdfGeneratorConfig;
8+
import no.nav.foreldrepenger.mottak.oppslag.arbeidsforhold.ArbeidsforholdConfig;
9+
import no.nav.foreldrepenger.mottak.oppslag.arbeidsforhold.OrganisasjonConfig;
10+
import no.nav.foreldrepenger.mottak.oppslag.dkif.DigdirKrrProxyConfig;
11+
import no.nav.foreldrepenger.mottak.oppslag.kontonummer.KontoregisterConfig;
12+
import no.nav.foreldrepenger.mottak.oppslag.pdl.PDLConfig;
13+
import no.nav.security.token.support.client.core.oauth2.OAuth2AccessTokenService;
14+
import no.nav.security.token.support.client.spring.ClientConfigurationProperties;
1715
import org.slf4j.Logger;
1816
import org.slf4j.LoggerFactory;
1917
import org.springframework.beans.factory.annotation.Qualifier;
@@ -26,21 +24,22 @@
2624
import org.springframework.web.reactive.function.client.ClientRequest;
2725
import org.springframework.web.reactive.function.client.ExchangeFilterFunction;
2826
import org.springframework.web.reactive.function.client.WebClient;
27+
import reactor.core.publisher.Hooks;
2928

30-
import com.fasterxml.jackson.databind.ObjectMapper;
29+
import java.net.ProxySelector;
30+
import java.net.http.HttpClient;
31+
import java.time.Duration;
32+
import java.util.Optional;
33+
34+
import static no.nav.foreldrepenger.common.util.Constants.FORELDREPENGER;
35+
import static no.nav.foreldrepenger.common.util.Constants.NAV_CALL_ID;
36+
import static no.nav.foreldrepenger.common.util.Constants.NAV_CALL_ID1;
37+
import static no.nav.foreldrepenger.common.util.Constants.NAV_CALL_ID2;
38+
import static no.nav.foreldrepenger.common.util.Constants.NAV_CONSUMER_ID;
39+
import static no.nav.foreldrepenger.common.util.Constants.NAV_PERSON_IDENT;
40+
import static no.nav.foreldrepenger.mottak.http.TokenUtil.BEARER;
41+
import static org.springframework.http.HttpHeaders.AUTHORIZATION;
3142

32-
import graphql.kickstart.spring.webclient.boot.GraphQLWebClient;
33-
import no.nav.foreldrepenger.common.util.MDCUtil;
34-
import no.nav.foreldrepenger.mottak.innsending.foreldrepenger.FordelConfig;
35-
import no.nav.foreldrepenger.mottak.innsending.pdf.pdftjeneste.PdfGeneratorConfig;
36-
import no.nav.foreldrepenger.mottak.oppslag.arbeidsforhold.ArbeidsforholdConfig;
37-
import no.nav.foreldrepenger.mottak.oppslag.arbeidsforhold.OrganisasjonConfig;
38-
import no.nav.foreldrepenger.mottak.oppslag.dkif.DigdirKrrProxyConfig;
39-
import no.nav.foreldrepenger.mottak.oppslag.kontonummer.KontoregisterConfig;
40-
import no.nav.foreldrepenger.mottak.oppslag.pdl.PDLConfig;
41-
import no.nav.security.token.support.client.core.oauth2.OAuth2AccessTokenService;
42-
import no.nav.security.token.support.client.spring.ClientConfigurationProperties;
43-
import reactor.core.publisher.Hooks;
4443

4544
@Configuration
4645
public class WebClientConfiguration {
@@ -108,7 +107,6 @@ public WebClient webClientDigdir(WebClient.Builder builder, DigdirKrrProxyConfig
108107
.baseUrl(cfg.getBaseUri().toString())
109108
.clientConnector(new JdkClientHttpConnector(httpClientProxyEnabled()))
110109
.filter(correlatingFilterFunction())
111-
.filter(navPersonIdentFunction(tokenUtil))
112110
.filter(tokenXFilterFunction)
113111
.build();
114112
}

src/main/java/no/nav/foreldrepenger/mottak/oppslag/dkif/DigdirKrrProxyConfig.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
package no.nav.foreldrepenger.mottak.oppslag.dkif;
22

3-
import static no.nav.foreldrepenger.mottak.util.URIUtil.uri;
3+
import org.springframework.boot.context.properties.ConfigurationProperties;
4+
import org.springframework.boot.context.properties.bind.DefaultValue;
45

56
import java.net.URI;
67

7-
import org.springframework.boot.context.properties.ConfigurationProperties;
8-
import org.springframework.boot.context.properties.bind.DefaultValue;
8+
import static no.nav.foreldrepenger.mottak.util.URIUtil.uri;
99

1010
@ConfigurationProperties(prefix = "digdir")
1111
public class DigdirKrrProxyConfig {
1212

13-
private static final String DEFAULT_PERSON_PATH = "rest/v1/person";
13+
private static final String DEFAULT_PERSON_PATH = "rest/v1/personer";
1414
private static final String DEFAULT_BASE_URI = "https://digdir-krr-proxy.intern.nav.no";
1515
private final String personPath;
1616
private final URI baseUri;
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,76 @@
11
package no.nav.foreldrepenger.mottak.oppslag.dkif;
22

3-
import static no.nav.foreldrepenger.mottak.http.WebClientConfiguration.KRR;
4-
import static org.springframework.http.MediaType.APPLICATION_JSON;
5-
6-
import java.time.Duration;
7-
3+
import no.nav.foreldrepenger.common.domain.Fødselsnummer;
4+
import no.nav.foreldrepenger.common.oppslag.dkif.Målform;
5+
import no.nav.foreldrepenger.mottak.http.Retry;
6+
import no.nav.foreldrepenger.mottak.http.TokenUtil;
87
import org.slf4j.Logger;
98
import org.slf4j.LoggerFactory;
109
import org.springframework.beans.factory.annotation.Qualifier;
1110
import org.springframework.stereotype.Component;
1211
import org.springframework.web.reactive.function.client.WebClient;
13-
14-
import no.nav.foreldrepenger.common.oppslag.dkif.Målform;
15-
import no.nav.foreldrepenger.mottak.http.Retry;
1612
import reactor.core.publisher.Mono;
1713

14+
import java.time.Duration;
15+
import java.util.List;
16+
import java.util.Map;
17+
18+
import static no.nav.foreldrepenger.mottak.http.WebClientConfiguration.KRR;
19+
import static org.springframework.http.MediaType.APPLICATION_JSON;
20+
1821
@Component
1922
public class DigdirKrrProxyConnection {
2023
private static final Logger LOG = LoggerFactory.getLogger(DigdirKrrProxyConnection.class);
2124
private final WebClient webClient;
2225
private final DigdirKrrProxyConfig cfg;
26+
private final TokenUtil tokenUtil;
2327

24-
public DigdirKrrProxyConnection(@Qualifier(KRR) WebClient client, DigdirKrrProxyConfig cfg) {
28+
public DigdirKrrProxyConnection(@Qualifier(KRR) WebClient client, DigdirKrrProxyConfig cfg, TokenUtil tokenUtil) {
2529
this.webClient = client;
2630
this.cfg = cfg;
31+
this.tokenUtil = tokenUtil;
2732
}
2833

2934
public Målform målform() {
3035
try {
3136
LOG.info("Henter målform fra digdir-krr-proxy");
3237
return hentMålform();
3338
} catch (Exception e) {
34-
LOG.warn("DKIF oppslag målform feilet. Bruker default Målform", e);
39+
LOG.warn("DKIF oppslag målform feilet. Forsetter med default målform NB.", e);
3540
return Målform.standard();
3641
}
3742
}
3843

3944
@Retry
4045
private Målform hentMålform() {
41-
return webClient.get()
42-
.uri(uri -> cfg.kontaktUri())
43-
.accept(APPLICATION_JSON)
44-
.retrieve()
45-
.bodyToMono(Kontaktinformasjon.class)
46-
.mapNotNull(Kontaktinformasjon::målform)
47-
.timeout(Duration.ofSeconds(3))
48-
.onErrorResume(e -> {
49-
LOG.warn("DKIF oppslag målform feilet. Bruker default Målform", e);
50-
return Mono.just(Målform.standard());
51-
})
52-
.block();
46+
var fødselsnummer = tokenUtil.autentisertBrukerOrElseThrowException();
47+
var respons = webClient.post()
48+
.uri(uri -> cfg.kontaktUri())
49+
.body(Mono.just(new Personidenter(List.of(fødselsnummer))), Personidenter.class)
50+
.accept(APPLICATION_JSON)
51+
.retrieve()
52+
.bodyToMono(Kontaktinformasjoner.class)
53+
.defaultIfEmpty(new Kontaktinformasjoner(Map.of(), Map.of(fødselsnummer, Kontaktinformasjoner.FeilKode.person_ikke_funnet)))
54+
.timeout(Duration.ofSeconds(5))
55+
.block();
56+
if (respons.feil() != null && !respons.feil().isEmpty()) {
57+
LOG.warn("Feil ved henting av målform fra DKIF: {}. Forsetter med default målform NB", respons.feil().get(fødselsnummer));
58+
return Målform.standard();
59+
}
60+
var person = respons.personer().get(fødselsnummer);
61+
if (person.aktiv()) {
62+
return person.spraak();
63+
} else {
64+
LOG.info("Personen finnes i PDL men mangler kontaktinfo i KRR. Forsetter med default målform NB");
65+
return Målform.standard();
66+
}
5367
}
5468

5569
@Override
5670
public String toString() {
5771
return getClass().getSimpleName() + " [cfg=" + cfg + "]";
5872
}
5973

74+
private record Personidenter(List<Fødselsnummer> personidenter) {
75+
}
6076
}

src/main/java/no/nav/foreldrepenger/mottak/oppslag/dkif/Kontaktinformasjon.java

-8
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package no.nav.foreldrepenger.mottak.oppslag.dkif;
2+
3+
import no.nav.foreldrepenger.common.domain.Fødselsnummer;
4+
import no.nav.foreldrepenger.common.oppslag.dkif.Målform;
5+
6+
import java.util.Map;
7+
8+
public record Kontaktinformasjoner(Map<Fødselsnummer, Kontaktinformasjon> personer, Map<Fødselsnummer, FeilKode> feil) {
9+
10+
public record Kontaktinformasjon(boolean aktiv, Målform spraak) {
11+
}
12+
13+
public enum FeilKode {
14+
person_ikke_funnet,
15+
skjermet,
16+
fortrolig_adresse,
17+
strengt_fortrolig_adresse,
18+
strengt_fortrolig_utenlandsk_adresse,
19+
noen_andre
20+
}
21+
}

src/test/java/no/nav/foreldrepenger/mottak/oppslag/dkif/DigdirKrrProxyConnectionTest.java

+70-27
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,24 @@
11
package no.nav.foreldrepenger.mottak.oppslag.dkif;
22

3-
import static io.netty.handler.codec.http.HttpResponseStatus.BAD_GATEWAY;
4-
import static org.assertj.core.api.Assertions.assertThat;
5-
6-
import java.io.IOException;
7-
import java.net.URI;
8-
3+
import no.nav.foreldrepenger.common.domain.Fødselsnummer;
4+
import no.nav.foreldrepenger.common.oppslag.dkif.Målform;
5+
import no.nav.foreldrepenger.mottak.http.TokenUtil;
6+
import okhttp3.mockwebserver.MockResponse;
7+
import okhttp3.mockwebserver.MockWebServer;
98
import org.junit.jupiter.api.AfterAll;
109
import org.junit.jupiter.api.BeforeAll;
1110
import org.junit.jupiter.api.Test;
1211
import org.junit.jupiter.api.extension.ExtendWith;
1312
import org.springframework.test.context.junit.jupiter.SpringExtension;
1413
import org.springframework.web.reactive.function.client.WebClient;
1514

16-
import no.nav.foreldrepenger.common.oppslag.dkif.Målform;
17-
import okhttp3.mockwebserver.MockResponse;
18-
import okhttp3.mockwebserver.MockWebServer;
15+
import java.io.IOException;
16+
import java.net.URI;
17+
18+
import static io.netty.handler.codec.http.HttpResponseStatus.BAD_GATEWAY;
19+
import static org.assertj.core.api.Assertions.assertThat;
20+
import static org.mockito.Mockito.mock;
21+
import static org.mockito.Mockito.when;
1922

2023
@ExtendWith(SpringExtension.class)
2124
class DigdirKrrProxyConnectionTest {
@@ -27,11 +30,13 @@ class DigdirKrrProxyConnectionTest {
2730
static void setUp() throws IOException {
2831
mockWebServer = new MockWebServer();
2932
mockWebServer.start();
33+
var tokenuUtil = mock(TokenUtil.class);
34+
when(tokenuUtil.autentisertBrukerOrElseThrowException()).thenReturn(new Fødselsnummer("12345678901"));
3035

3136
var baseUrl = String.format("http://localhost:%s", mockWebServer.getPort());
3237
var webClient = WebClient.create();
3338
var digdirKrrProxyConfig = new DigdirKrrProxyConfig(URI.create(baseUrl), "rest/v1/person");
34-
digdirKrrProxyConnection = new DigdirKrrProxyConnection(webClient, digdirKrrProxyConfig);
39+
digdirKrrProxyConnection = new DigdirKrrProxyConnection(webClient, digdirKrrProxyConfig, tokenuUtil);
3540
}
3641

3742
@AfterAll
@@ -43,20 +48,24 @@ static void tearDown() throws IOException {
4348
void happycase() {
4449
var body = """
4550
{
46-
"personident": "string",
47-
"aktiv": true,
48-
"kanVarsles": true,
49-
"reservert": true,
50-
"spraak": "NB",
51-
"epostadresse": "string",
52-
"epostadresseOppdatert": "2022-03-15T13:10:01.920Z",
53-
"mobiltelefonnummer": "string",
54-
"mobiltelefonnummerOppdatert": "2022-03-15T13:10:01.920Z",
55-
"sikkerDigitalPostkasse": {
56-
"adresse": "string",
57-
"leverandoerAdresse": "string",
58-
"leverandoerSertifikat": "string"
59-
}
51+
"personer": {
52+
"12345678901": {
53+
"personident": "string",
54+
"aktiv": true,
55+
"kanVarsles": true,
56+
"reservert": true,
57+
"spraak": "NB",
58+
"epostadresse": "string",
59+
"epostadresseOppdatert": "2022-03-15T13:10:01.920Z",
60+
"mobiltelefonnummer": "string",
61+
"mobiltelefonnummerOppdatert": "2022-03-15T13:10:01.920Z",
62+
"sikkerDigitalPostkasse": {
63+
"adresse": "string",
64+
"leverandoerAdresse": "string",
65+
"leverandoerSertifikat": "string"
66+
}
67+
}
68+
}
6069
}
6170
""";
6271
mockWebServer.enqueue(new MockResponse()
@@ -69,14 +78,41 @@ void happycase() {
6978

7079
@Test
7180
void skalBrukeDefaultMålformVed4xxFeil() {
81+
var body = """
82+
"feil": {
83+
"12345678901": "person_ikke_funnet"
84+
}
85+
""";
86+
7287
mockWebServer.enqueue(new MockResponse()
73-
.setResponseCode(404)
88+
.setBody(body)
7489
.addHeader("Content-Type", "application/json"));
7590

7691
var målform = digdirKrrProxyConnection.målform();
7792
assertThat(målform).isEqualTo(Målform.NB);
7893
}
7994

95+
@Test
96+
void person_som_finnes_i_pdl_men_mangler_kontaktinfo_i_KRR_har_respons_med_aktiv_false_bruk_default_språk_nb() {
97+
var body = """
98+
{
99+
"personer": {
100+
"12345678901": {
101+
"personident": "12345678901",
102+
"aktiv": false
103+
}
104+
}
105+
}
106+
""";
107+
108+
mockWebServer.enqueue(new MockResponse()
109+
.setBody(body)
110+
.addHeader("Content-Type", "application/json"));
111+
112+
var målform = digdirKrrProxyConnection.målform();
113+
assertThat(målform).isEqualTo(Målform.NB);
114+
}
115+
80116
@Test
81117
void sjekkerAtRetryMekanismenFungere() {
82118
mockWebServer.enqueue(new MockResponse()
@@ -87,8 +123,15 @@ void sjekkerAtRetryMekanismenFungere() {
87123
.setResponseCode(BAD_GATEWAY.code()));
88124
mockWebServer.enqueue(new MockResponse()
89125
.setBody("""
90-
{"spraak": "NB"}
91-
""")
126+
{
127+
"personer": {
128+
"12345678901": {
129+
"personident": "12345678901",
130+
"spraak": "NB"
131+
}
132+
}
133+
}
134+
""")
92135
.addHeader("Content-Type", "application/json"));
93136

94137

0 commit comments

Comments
 (0)