Skip to content

Commit c2790b8

Browse files
committed
feature: Integrate Altinn3 access service with Dashboard for organization status retrieval
1 parent 7d260ac commit c2790b8

11 files changed

Lines changed: 155 additions & 6 deletions

File tree

apps/altinn3-tilgang-service/config.prod.yml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,23 @@ spec:
2727
accessPolicy:
2828
inbound:
2929
rules:
30+
- application: dolly-backend
31+
cluster: dev-gcp
32+
- application: dolly-backend-dev
33+
cluster: dev-gcp
3034
- application: dolly-frontend
3135
cluster: dev-gcp
3236
- application: dolly-idporten
3337
cluster: dev-gcp
34-
- application: team-dolly-lokal-app
38+
- application: dolly-texas-proxy
3539
cluster: dev-gcp
36-
- application: testnav-oversikt-frontend
40+
- application: team-dolly-lokal-app
3741
cluster: dev-gcp
3842
- application: testnav-altinn3-tilgang-proxy
3943
cluster: dev-gcp
4044
- application: testnav-dolly-proxy
4145
cluster: dev-fss
42-
- application: dolly-texas-proxy
46+
- application: testnav-oversikt-frontend
4347
cluster: dev-gcp
4448
outbound:
4549
external:

apps/dolly-backend/config.test.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,16 @@ spec:
4848
- application: team-catalog-backend
4949
namespace: org
5050
cluster: prod-gcp
51+
- application: testnav-altinn3-tilgang-service-prod
52+
namespace: dolly
53+
cluster: prod-gcp
5154
external:
55+
- host: teamkatalog-api.intern.nav.no
56+
- host: testnav-altinn3-tilgang-service.nav.no
5257
- host: testnav-dolly-proxy.dev-fss-pub.nais.io
5358
- host: testnav-inst-proxy.dev-fss-pub.nais.io
5459
- host: testnav-krrstub-proxy.dev-fss-pub.nais.io
5560
- host: testnav-pdl-proxy.dev-fss-pub.nais.io
56-
- host: teamkatalog-api.intern.nav.no
5761
webproxy: true
5862
azure:
5963
application:

apps/dolly-backend/config.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,16 @@ spec:
5454
- application: team-catalog-backend
5555
namespace: org
5656
cluster: prod-gcp
57+
- application: testnav-altinn3-tilgang-service-prod
58+
namespace: dolly
59+
cluster: prod-gcp
5760
external:
61+
- host: teamkatalog-api.intern.nav.no
62+
- host: testnav-altinn3-tilgang-service.nav.no
5863
- host: testnav-dolly-proxy.dev-fss-pub.nais.io
5964
- host: testnav-inst-proxy.dev-fss-pub.nais.io
6065
- host: testnav-krrstub-proxy.dev-fss-pub.nais.io
6166
- host: testnav-pdl-proxy.dev-fss-pub.nais.io
62-
- host: teamkatalog-api.intern.nav.no
6367
webproxy: true
6468
azure:
6569
application:

apps/dolly-backend/src/main/java/no/nav/dolly/config/Consumers.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,5 @@ public class Consumers {
3939
private ServerProperties etterlatte;
4040
private ServerProperties nomProxy;
4141
private ServerProperties teamkatalog;
42-
}
42+
private ServerProperties altinn3TilgangService;
43+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package no.nav.dolly.consumer.altinn3;
2+
3+
import no.nav.dolly.config.Consumers;
4+
import no.nav.dolly.consumer.altinn3.command.Altinn3TilgangServiceGetCommand;
5+
import no.nav.dolly.consumer.altinn3.dto.Altinn3TilgangDTO;
6+
import no.nav.testnav.libs.securitycore.domain.ServerProperties;
7+
import no.nav.testnav.libs.standalone.reactivesecurity.exchange.TokenExchange;
8+
import org.springframework.stereotype.Service;
9+
import org.springframework.web.reactive.function.client.WebClient;
10+
import reactor.core.publisher.Flux;
11+
12+
@Service
13+
public class Altinn3TilgangServiceConsumer {
14+
15+
private final WebClient webClient;
16+
private final TokenExchange tokenService;
17+
private final ServerProperties serverProperties;
18+
19+
public Altinn3TilgangServiceConsumer(WebClient webClient,
20+
TokenExchange tokenExchange,
21+
Consumers consumers) {
22+
23+
this.serverProperties = consumers.getAltinn3TilgangService();
24+
this.tokenService = tokenExchange;
25+
this.webClient = webClient
26+
.mutate()
27+
.baseUrl(serverProperties.getUrl())
28+
.build();
29+
}
30+
31+
public Flux<Altinn3TilgangDTO> getOrganisasjoner() {
32+
33+
return tokenService.exchange(serverProperties)
34+
.flatMapMany(token -> new Altinn3TilgangServiceGetCommand(webClient, token.getTokenValue()).call());
35+
}
36+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package no.nav.dolly.consumer.altinn3.command;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import no.nav.dolly.consumer.altinn3.dto.Altinn3TilgangDTO;
5+
import no.nav.testnav.libs.reactivecore.web.WebClientHeader;
6+
import org.springframework.web.reactive.function.client.WebClient;
7+
import reactor.core.publisher.Flux;
8+
9+
import java.util.concurrent.Callable;
10+
11+
@RequiredArgsConstructor
12+
public class Altinn3TilgangServiceGetCommand implements Callable<Flux<Altinn3TilgangDTO>> {
13+
14+
private static final String ORGANISASJONER_URL = "/api/v1/organisasjoner";
15+
16+
private final WebClient webClient;
17+
private final String token;
18+
19+
@Override
20+
public Flux<Altinn3TilgangDTO> call() {
21+
22+
return webClient
23+
.get()
24+
.uri(path -> path.path(ORGANISASJONER_URL)
25+
.build())
26+
.headers(WebClientHeader.bearer(token))
27+
.retrieve()
28+
.bodyToFlux(Altinn3TilgangDTO.class);
29+
}
30+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package no.nav.dolly.consumer.altinn3.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
@Data
9+
@Builder
10+
@NoArgsConstructor
11+
@AllArgsConstructor
12+
public class Altinn3TilgangDTO {
13+
14+
private String navn;
15+
private String organisasjonsnummer;
16+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package no.nav.dolly.domain.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
import java.util.List;
9+
10+
@Data
11+
@Builder
12+
@NoArgsConstructor
13+
@AllArgsConstructor
14+
public class DashboardOrganisasjonerDTO {
15+
16+
private String interval;
17+
private Integer totaltUnikeBrukere;
18+
private Integer totaltAntallOrganisasjoner;
19+
private List<Entry> organisasjoner;
20+
21+
@Data
22+
@Builder
23+
@NoArgsConstructor
24+
@AllArgsConstructor
25+
public static class Entry {
26+
27+
private String organisasjonsnummer;
28+
private String navn;
29+
private Integer unikeBrukere;
30+
}
31+
}

apps/dolly-backend/src/main/java/no/nav/dolly/provider/DashboardController.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import io.swagger.v3.oas.annotations.Operation;
44
import lombok.RequiredArgsConstructor;
5+
import no.nav.dolly.consumer.altinn3.dto.Altinn3TilgangDTO;
56
import no.nav.dolly.domain.dto.DashboardPersonerDTO;
67
import no.nav.dolly.domain.dto.DashboardTeamsDTO;
78
import no.nav.dolly.service.DashboardService;
@@ -30,4 +31,11 @@ public Flux<DashboardTeamsDTO> getDashboardTeams() {
3031

3132
return dashboardService.getTeamsStatus();
3233
}
34+
35+
@GetMapping(value = "/organisasjoner")
36+
@Operation(description = "Henter status for organisasjoner fra Altinn, og antall unike personer som har bestilt")
37+
public Flux<Altinn3TilgangDTO> getDashboardOrganisasjoner() {
38+
39+
return dashboardService.getOrganisasjonerStatus();
40+
}
3341
}

apps/dolly-backend/src/main/java/no/nav/dolly/service/DashboardService.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22

33
import lombok.RequiredArgsConstructor;
44
import lombok.extern.slf4j.Slf4j;
5+
import no.nav.dolly.consumer.altinn3.Altinn3TilgangServiceConsumer;
6+
import no.nav.dolly.consumer.altinn3.dto.Altinn3TilgangDTO;
57
import no.nav.dolly.consumer.teamkatalog.TeamkatalogConsumer;
68
import no.nav.dolly.consumer.teamkatalog.dto.TeamkatalogDTO;
9+
import no.nav.dolly.domain.dto.DashboardOrganisasjonerDTO;
710
import no.nav.dolly.domain.dto.DashboardPersonerDTO;
811
import no.nav.dolly.domain.dto.DashboardTeamsDTO;
912
import no.nav.dolly.domain.jpa.Bruker;
@@ -37,6 +40,7 @@ public class DashboardService {
3740
private final BestillingRepository bestillingRepository;
3841
private final BrukerRepository brukerRepository;
3942
private final TeamkatalogConsumer teamkatalogConsumer;
43+
private final Altinn3TilgangServiceConsumer altinn3TilgangServiceConsumer;
4044

4145
public Flux<DashboardPersonerDTO> getPersonerStatus() {
4246

@@ -106,4 +110,10 @@ private static Map<String, Set<String>> groupFragmentsByTeam(List<TeamFragment>
106110
});
107111
return grouped;
108112
}
113+
114+
public Flux<Altinn3TilgangDTO> getOrganisasjonerStatus() {
115+
116+
117+
return altinn3TilgangServiceConsumer.getOrganisasjoner();
118+
}
109119
}

0 commit comments

Comments
 (0)