Skip to content

Commit df5c205

Browse files
committed
feature: Integrate Teamkatalog consumer and update dashboard to include team information
1 parent 110e8d2 commit df5c205

7 files changed

Lines changed: 180 additions & 17 deletions

File tree

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,5 @@ public class Consumers {
3838
private ServerProperties safProxy;
3939
private ServerProperties etterlatte;
4040
private ServerProperties nomProxy;
41+
private ServerProperties teamkatalog;
4142
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package no.nav.dolly.consumer.teamkatalog;
2+
3+
import no.nav.dolly.config.Consumers;
4+
import no.nav.dolly.consumer.teamkatalog.command.TeamkatalogGetCommand;
5+
import no.nav.dolly.consumer.teamkatalog.dto.TeamkatalogDTO;
6+
import no.nav.dolly.metrics.Timed;
7+
import no.nav.testnav.libs.securitycore.domain.ServerProperties;
8+
import no.nav.testnav.libs.standalone.reactivesecurity.exchange.TokenExchange;
9+
import org.springframework.stereotype.Service;
10+
import org.springframework.web.reactive.function.client.WebClient;
11+
import reactor.core.publisher.Mono;
12+
13+
@Service
14+
public class TeamkatalogConsumer {
15+
16+
private final WebClient webClient;
17+
private final TokenExchange tokenService;
18+
private final ServerProperties serverProperties;
19+
20+
public TeamkatalogConsumer(
21+
Consumers consumers,
22+
TokenExchange tokenService,
23+
WebClient webClient) {
24+
25+
serverProperties = consumers.getTeamkatalog();
26+
this.tokenService = tokenService;
27+
this.webClient = webClient
28+
.mutate()
29+
.baseUrl(serverProperties.getUrl())
30+
.build();
31+
}
32+
33+
@Timed(name = "providers", tags = { "operation", "saf_getDokument" })
34+
public Mono<TeamkatalogDTO> getTeamForEpost(String epost) {
35+
36+
return new TeamkatalogGetCommand(webClient, epost).call();
37+
38+
// return tokenService.exchange(serverProperties)
39+
// .flatMap(token -> new TeamkatalogGetCommand(webClient,
40+
// epost, token.getTokenValue()).call());
41+
}
42+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package no.nav.dolly.consumer.teamkatalog.command;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import lombok.extern.slf4j.Slf4j;
5+
import no.nav.dolly.consumer.teamkatalog.dto.TeamkatalogDTO;
6+
import no.nav.testnav.libs.reactivecore.web.WebClientError;
7+
import org.springframework.web.reactive.function.client.WebClient;
8+
import reactor.core.publisher.Mono;
9+
10+
import java.util.concurrent.Callable;
11+
12+
@Slf4j
13+
@RequiredArgsConstructor
14+
public class TeamkatalogGetCommand implements Callable<Mono<TeamkatalogDTO>> {
15+
16+
private static final String TEAM_URL = "/member/membership/byUserEmail";
17+
18+
private final WebClient webClient;
19+
private final String epost;
20+
// private final String token;
21+
22+
@Override
23+
public Mono<TeamkatalogDTO> call() {
24+
25+
return webClient
26+
.get()
27+
.uri(uriBuilder -> uriBuilder
28+
.path(TEAM_URL)
29+
.queryParam("email", epost)
30+
.build())
31+
// .headers(WebClientHeader.bearer(token))
32+
.retrieve()
33+
.bodyToMono(TeamkatalogDTO.class)
34+
.map(response -> {
35+
response.setEpost(epost);
36+
response.setTeamNavn(response.getTeams().stream()
37+
.map(TeamkatalogDTO.Team::getName)
38+
.toList());
39+
return response;
40+
})
41+
.doOnError(WebClientError.logTo(log))
42+
.retryWhen(WebClientError.is5xxException())
43+
.onErrorResume(throwable -> {
44+
var description = WebClientError.describe(throwable);
45+
return Mono.just(TeamkatalogDTO.builder()
46+
.status(description.getStatus())
47+
.feilmelding(description.getMessage())
48+
.build());
49+
});
50+
}
51+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package no.nav.dolly.consumer.teamkatalog.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
import org.springframework.http.HttpStatus;
8+
9+
import java.util.ArrayList;
10+
import java.util.List;
11+
12+
import static java.util.Objects.isNull;
13+
14+
@Data
15+
@Builder
16+
@NoArgsConstructor
17+
@AllArgsConstructor
18+
public class TeamkatalogDTO {
19+
20+
private HttpStatus status;
21+
private String feilmelding;
22+
23+
private String epost;
24+
private List<String> teamNavn;
25+
private List<Team> teams;
26+
27+
public List<String> getTeamNavn() {
28+
29+
if (isNull(teamNavn)) {
30+
teamNavn = new ArrayList<>();
31+
}
32+
return teamNavn;
33+
}
34+
35+
public List<Team> getTeams() {
36+
37+
if (isNull(teams)) {
38+
teams = new ArrayList<>();
39+
}
40+
return teams;
41+
}
42+
43+
@Data
44+
@Builder
45+
@NoArgsConstructor
46+
@AllArgsConstructor
47+
public static class Team {
48+
49+
private String name;
50+
}
51+
}

apps/dolly-backend/src/main/java/no/nav/dolly/domain/dto/DashboardTeamsDTO.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class DashboardTeamsDTO {
2323
@AllArgsConstructor
2424
public static class Entry {
2525

26-
private String epost;
26+
private List<String> teams;
2727
private Long antall;
2828
}
2929
}

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

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,20 @@
22

33
import lombok.RequiredArgsConstructor;
44
import lombok.extern.slf4j.Slf4j;
5+
import no.nav.dolly.consumer.teamkatalog.TeamkatalogConsumer;
6+
import no.nav.dolly.consumer.teamkatalog.dto.TeamkatalogDTO;
57
import no.nav.dolly.domain.dto.DashboardPersonerDTO;
68
import no.nav.dolly.domain.dto.DashboardTeamsDTO;
9+
import no.nav.dolly.domain.jpa.Bruker;
710
import no.nav.dolly.domain.projection.BestillingerFragment;
811
import no.nav.dolly.domain.projection.TeamFragment;
912
import no.nav.dolly.repository.BestillingRepository;
13+
import no.nav.dolly.repository.BrukerRepository;
1014
import org.springframework.stereotype.Service;
1115
import reactor.core.publisher.Flux;
1216

1317
import java.util.Comparator;
18+
import java.util.stream.Collectors;
1419

1520
import static org.apache.commons.lang3.StringUtils.isNotBlank;
1621

@@ -20,6 +25,8 @@
2025
public class DashboardService {
2126

2227
private final BestillingRepository bestillingRepository;
28+
private final BrukerRepository brukerRepository;
29+
private final TeamkatalogConsumer teamkatalogConsumer;
2330

2431
public Flux<DashboardPersonerDTO> getPersonerStatus() {
2532

@@ -59,21 +66,27 @@ public Flux<DashboardPersonerDTO> getPersonerStatus() {
5966

6067
public Flux<DashboardTeamsDTO> getTeamsStatus() {
6168

62-
return bestillingRepository.findBestillingerForTeamsOrderBySistOppdatert()
63-
.groupBy(TeamFragment::getDato)
64-
.flatMap(Flux::collectList)
65-
.map(fragmentliste ->
66-
DashboardTeamsDTO.builder()
67-
.dato(fragmentliste.stream()
68-
.map(TeamFragment::getDato)
69-
.findAny().orElse(null))
70-
.entries(fragmentliste.stream()
71-
.filter(fragment -> isNotBlank(fragment.getEpost()))
72-
.map(fragment -> new DashboardTeamsDTO.Entry(
73-
fragment.getEpost(),
74-
fragment.getAntall()))
75-
.toList())
76-
.build())
77-
.sort(Comparator.comparing(DashboardTeamsDTO::getDato).reversed());
69+
return brukerRepository.findAll()
70+
.filter(bruker -> isNotBlank(bruker.getEpost()))
71+
.map(Bruker::getEpost)
72+
.distinct()
73+
.flatMap(teamkatalogConsumer::getTeamForEpost)
74+
.collect(Collectors.toMap(TeamkatalogDTO::getEpost, TeamkatalogDTO::getTeamNavn))
75+
.flatMapMany(teams -> bestillingRepository.findBestillingerForTeamsOrderBySistOppdatert()
76+
.groupBy(TeamFragment::getDato)
77+
.flatMap(Flux::collectList)
78+
.map(fragmentliste ->
79+
DashboardTeamsDTO.builder()
80+
.dato(fragmentliste.stream()
81+
.map(TeamFragment::getDato)
82+
.findAny().orElse(null))
83+
.entries(fragmentliste.stream()
84+
.filter(fragment -> isNotBlank(fragment.getEpost()))
85+
.map(fragment -> new DashboardTeamsDTO.Entry(
86+
teams.get(fragment.getEpost()),
87+
fragment.getAntall()))
88+
.toList())
89+
.build())
90+
.sort(Comparator.comparing(DashboardTeamsDTO::getDato).reversed()));
7891
}
7992
}

apps/dolly-backend/src/main/resources/application.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,4 +145,9 @@ consumers:
145145
namespace: dolly
146146
url: http://testnav-nom-proxy.dolly.svc.cluster.local
147147
cluster: dev-gcp
148+
teamkatalog:
149+
name: team-catalog-backend
150+
namespace: org
151+
url: https://teamkatalog-api.intern.nav.no
152+
cluster: prod-gcp
148153

0 commit comments

Comments
 (0)