Skip to content

Commit 36f5c55

Browse files
committed
Update Altinn3 access handling and introduce OrganisasjonDTO
#deploy-altinn3-tilgang-service-prod #deploy-altinn3-tilgang-service Refactored Altinn3 access services to return lists of authorized organizations instead of a boolean, leveraging the new `OrganisasjonDTO`. Updated AltinnConsumer logic to improve resource filtering and subunit traversal. Added `data-transfer-objects` library for DTO inclusion and adjusted related classes to support the new implementation.
1 parent 241d635 commit 36f5c55

File tree

9 files changed

+86
-19
lines changed

9 files changed

+86
-19
lines changed

apps/altinn3-tilgang-service/build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ sonarqube {
1212
dependencies {
1313
implementation "no.nav.testnav.libs:reactive-core"
1414
implementation "no.nav.testnav.libs:reactive-security"
15+
implementation "no.nav.testnav.libs:data-transfer-objects"
1516

1617
implementation "org.springframework.boot:spring-boot-starter-data-r2dbc"
1718
implementation "org.springframework.boot:spring-boot-starter-oauth2-resource-server"

apps/altinn3-tilgang-service/settings.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ includeBuild "../../plugins/java"
88

99
includeBuild '../../libs/reactive-core'
1010
includeBuild '../../libs/reactive-security'
11-
includeBuild '../../libs/vault'
11+
includeBuild '../../libs/data-transfer-objects'
1212

1313
develocity {
1414
buildScan {

apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/AltinnConsumer.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import reactor.core.publisher.Flux;
2929
import reactor.core.publisher.Mono;
3030

31+
import java.util.Arrays;
3132
import java.util.List;
3233
import java.util.Map;
3334

@@ -132,9 +133,11 @@ public Flux<AuthorizedPartyDTO> getAuthorizedParties(String ident) {
132133

133134
return maskinportenConsumer.getAccessToken()
134135
.flatMap(this::exchangeToken)
135-
.flatMapMany(exchangeToken -> new GetAuthorizedPartiesCommand(webClient,
136+
.flatMap(exchangeToken -> new GetAuthorizedPartiesCommand(webClient,
136137
new AltinnAuthorizedPartiesRequestDTO(ident),
137-
exchangeToken).call());
138+
exchangeToken).call())
139+
.map(Arrays::asList)
140+
.flatMapIterable(list -> list);
138141
}
139142

140143
private Mono<AltinnAccessListResponseDTO> getAccessListMembers() {

apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/command/GetAuthorizedPartiesCommand.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -8,32 +8,32 @@
88
import org.springframework.http.HttpHeaders;
99
import org.springframework.http.MediaType;
1010
import org.springframework.web.reactive.function.client.WebClient;
11-
import reactor.core.publisher.Flux;
11+
import reactor.core.publisher.Mono;
1212

1313
import java.util.concurrent.Callable;
1414

1515
@Slf4j
1616
@RequiredArgsConstructor
17-
public class GetAuthorizedPartiesCommand implements Callable<Flux<AuthorizedPartyDTO>> {
17+
public class GetAuthorizedPartiesCommand implements Callable<Mono<AuthorizedPartyDTO[]>> {
1818

19-
private static final String ALTINN_URL = "/resourceregistry/accessmanagement/api/v1/resourceowner/authorizedparties";
19+
private static final String ALTINN_URL = "/accessmanagement/api/v1/resourceowner/authorizedparties";
2020

2121
private final WebClient webClient;
2222
private final AltinnAuthorizedPartiesRequestDTO request;
2323
private final String token;
2424

2525
@Override
26-
public Flux<AuthorizedPartyDTO> call() {
26+
public Mono<AuthorizedPartyDTO[]> call() {
2727

28-
log.info("Spøøring om bruker {}", request);
28+
log.info("Spørring på bruker {}", request);
2929
return webClient
3030
.post()
3131
.uri(builder -> builder.path(ALTINN_URL).build())
3232
.header(HttpHeaders.AUTHORIZATION, "Bearer " + token)
3333
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
3434
.bodyValue(request)
3535
.retrieve()
36-
.bodyToFlux(AuthorizedPartyDTO.class)
36+
.bodyToMono(AuthorizedPartyDTO[].class)
3737
.doOnError(WebClientFilter::logErrorMessage);
3838
}
3939
}

apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/consumer/altinn/dto/AuthorizedPartyDTO.java

+22-1
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,37 @@
55
import lombok.Data;
66
import lombok.NoArgsConstructor;
77

8+
import java.util.ArrayList;
89
import java.util.List;
910

11+
import static java.util.Objects.isNull;
12+
1013
@Data
1114
@Builder
1215
@NoArgsConstructor
1316
@AllArgsConstructor
1417
public class AuthorizedPartyDTO {
1518

16-
private String personId;
19+
private String name;
1720
private String organizationNumber;
21+
private String unitType;
1822
private List<String> authorizedResources;
23+
private List<AuthorizedPartyDTO> subunits;
24+
25+
public List<String> getAuthorizedResources() {
26+
27+
if (isNull(authorizedResources)) {
28+
authorizedResources = new ArrayList<>();
29+
}
30+
return authorizedResources;
31+
}
32+
33+
public List<AuthorizedPartyDTO> getSubunits() {
34+
35+
if (isNull(subunits)) {
36+
subunits = new ArrayList<>();
37+
}
38+
return subunits;
39+
}
1940
}
2041

apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/domain/PersonRequest.java

-1
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,4 @@
1010
public class PersonRequest {
1111

1212
private String ident;
13-
private String orgnummer;
1413
}

apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/provider/AltinnBrukerTilgangController.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33
import lombok.RequiredArgsConstructor;
44
import no.nav.testnav.altinn3tilgangservice.domain.PersonRequest;
55
import no.nav.testnav.altinn3tilgangservice.service.AltinnBrukerTilgangService;
6+
import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO;
67
import org.springframework.web.bind.annotation.PostMapping;
78
import org.springframework.web.bind.annotation.RequestBody;
89
import org.springframework.web.bind.annotation.RequestMapping;
910
import org.springframework.web.bind.annotation.RestController;
10-
import reactor.core.publisher.Mono;
11+
import reactor.core.publisher.Flux;
1112

1213
@RestController
1314
@RequestMapping("/api/v1/brukertilgang")
@@ -17,8 +18,8 @@ public class AltinnBrukerTilgangController {
1718
private final AltinnBrukerTilgangService brukerTilgangService;
1819

1920
@PostMapping
20-
public Mono<Boolean> harDollyTilgang(@RequestBody PersonRequest personRequest) {
21+
public Flux<OrganisasjonDTO> getOrgMedDollyTilgang(@RequestBody PersonRequest personRequest) {
2122

22-
return brukerTilgangService.harDollyTilgang(personRequest);
23+
return brukerTilgangService.getOrgsMedDollyTilgang(personRequest);
2324
}
2425
}

apps/altinn3-tilgang-service/src/main/java/no/nav/testnav/altinn3tilgangservice/service/AltinnBrukerTilgangService.java

+30-5
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,48 @@
33
import lombok.RequiredArgsConstructor;
44
import lombok.extern.slf4j.Slf4j;
55
import no.nav.testnav.altinn3tilgangservice.consumer.altinn.AltinnConsumer;
6+
import no.nav.testnav.altinn3tilgangservice.consumer.altinn.dto.AuthorizedPartyDTO;
67
import no.nav.testnav.altinn3tilgangservice.domain.PersonRequest;
8+
import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO;
79
import org.springframework.stereotype.Service;
10+
import reactor.core.publisher.Flux;
811
import reactor.core.publisher.Mono;
912

13+
import java.util.ArrayList;
14+
import java.util.List;
15+
import java.util.stream.Stream;
16+
1017
@Slf4j
1118
@Service
1219
@RequiredArgsConstructor
1320
public class AltinnBrukerTilgangService {
1421

22+
private static final String DOLLY_RESOURCE = "nav_dolly_tilgang-samarbeidspartnere";
1523
private final AltinnConsumer altinnConsumer;
1624

17-
public Mono<Boolean> harDollyTilgang(PersonRequest personRequest) {
25+
public Flux<OrganisasjonDTO> getOrgsMedDollyTilgang(PersonRequest personRequest) {
1826

1927
return altinnConsumer.getAuthorizedParties(personRequest.getIdent())
20-
.doOnNext(party -> log.info("AuthorizedParty {}", party))
21-
.filter(party -> party.getOrganizationNumber().equals(personRequest.getOrgnummer()))
22-
.filter(part -> part.getAuthorizedResources().contains("dolly"))
23-
.reduce(Boolean.FALSE, (a, b) -> Boolean.TRUE);
28+
.flatMap(authorizedParty -> getUnitsAndSubunits(new ArrayList<>(), authorizedParty))
29+
.flatMap(Flux::fromIterable);
30+
}
31+
32+
private Mono<List<OrganisasjonDTO>> getUnitsAndSubunits(List<OrganisasjonDTO> organisasjoner,
33+
AuthorizedPartyDTO authorizedParties) {
34+
35+
organisasjoner.addAll(Stream.of(authorizedParties)
36+
.filter(part -> part.getAuthorizedResources().contains(DOLLY_RESOURCE))
37+
.map(part -> OrganisasjonDTO.builder()
38+
.navn(part.getName())
39+
.organisasjonsnummer(part.getOrganizationNumber())
40+
.organisasjonsform(part.getUnitType())
41+
.build())
42+
.toList());
43+
44+
if (!authorizedParties.getSubunits().isEmpty()) {
45+
authorizedParties.getSubunits()
46+
.forEach(subunit -> getUnitsAndSubunits(organisasjoner, subunit));
47+
}
48+
return Mono.just(organisasjoner);
2449
}
2550
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package no.nav.testnav.libs.dto.altinn3.v1;
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 OrganisasjonDTO {
13+
14+
private String navn;
15+
private String organisasjonsnummer;
16+
private String organisasjonsform;
17+
}

0 commit comments

Comments
 (0)