Skip to content

Commit d0dea28

Browse files
committed
feature: Add DollyTeams status retrieval in DashboardService and create corresponding DTOs for enhanced dashboard functionality #deploy-test-dolly-backend #deploy-dolly-backend
1 parent a42d593 commit d0dea28

5 files changed

Lines changed: 117 additions & 22 deletions

File tree

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 DashboardDollyTeamsDTO {
15+
16+
private String interval;
17+
private Integer totaltUnikeBrukere;
18+
private Integer totaltAntallTeams;
19+
private List<Entry> teams;
20+
21+
@Data
22+
@Builder
23+
@NoArgsConstructor
24+
@AllArgsConstructor
25+
public static class Entry {
26+
27+
private String navn;
28+
private String beskrivelse;
29+
private Integer unikeBrukere;
30+
}
31+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package no.nav.dolly.domain.projection;
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 DollyTeamFragment {
13+
14+
private Long antall;
15+
private String interval;
16+
private String informasjon;
17+
}

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.domain.dto.DashboardDollyTeamsDTO;
56
import no.nav.dolly.domain.dto.DashboardOrganisasjonerDTO;
67
import no.nav.dolly.domain.dto.DashboardPersonerDTO;
78
import no.nav.dolly.domain.dto.DashboardTeamsDTO;
@@ -38,4 +39,11 @@ public Flux<DashboardOrganisasjonerDTO> getDashboardOrganisasjoner() {
3839

3940
return dashboardService.getOrganisasjonerStatus();
4041
}
42+
43+
@GetMapping(value = "/dollyteams")
44+
@Operation(description = "Henter status for bruk av Dolly-teams, og antall unike personer som har bestilt")
45+
public Flux<DashboardDollyTeamsDTO> getDashboardDollyTeams() {
46+
47+
return dashboardService.getDollyTeamsStatus();
48+
}
4149
}

apps/dolly-backend/src/main/java/no/nav/dolly/repository/BestillingRepository.java

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

33
import no.nav.dolly.domain.jpa.Bestilling;
44
import no.nav.dolly.domain.projection.BestillingerFragment;
5+
import no.nav.dolly.domain.projection.DollyTeamFragment;
56
import no.nav.dolly.domain.projection.OrganisasjonFragment;
67
import no.nav.dolly.domain.projection.RsBestillingFragment;
78
import no.nav.dolly.domain.projection.TeamFragment;
@@ -190,4 +191,16 @@ select count(*) antall, to_char(b.sist_oppdatert, 'YYYY-MM') interval, br.bruker
190191
order by interval desc;
191192
""")
192193
Flux<OrganisasjonFragment> findBestillingerForOrganisasjonerOrderBySistOppdatert();
194+
195+
@Query("""
196+
select count(*) antall, to_char(b.sist_oppdatert, 'YYYY-MM') interval,
197+
t.navn || ','|| t.beskrivelse informasjon
198+
from bestilling b
199+
join bruker br on br.id = b.bruker_id
200+
join team t on t.bruker_id = br.id
201+
and br.brukertype = 'TEAM'
202+
group by interval, informasjon
203+
order by interval desc;
204+
""")
205+
Flux<DollyTeamFragment> findBestillingerForDollyTeamsOrderBySistOppdatert();
193206
}

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

Lines changed: 48 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@
88
import no.nav.dolly.consumer.brukerservice.dto.BrukerDTO;
99
import no.nav.dolly.consumer.teamkatalog.TeamkatalogConsumer;
1010
import no.nav.dolly.consumer.teamkatalog.dto.TeamkatalogDTO;
11+
import no.nav.dolly.domain.dto.DashboardDollyTeamsDTO;
1112
import no.nav.dolly.domain.dto.DashboardOrganisasjonerDTO;
1213
import no.nav.dolly.domain.dto.DashboardPersonerDTO;
1314
import no.nav.dolly.domain.dto.DashboardTeamsDTO;
1415
import no.nav.dolly.domain.jpa.Bruker;
1516
import no.nav.dolly.domain.projection.BestillingerFragment;
17+
import no.nav.dolly.domain.projection.DollyTeamFragment;
1618
import no.nav.dolly.domain.projection.OrganisasjonFragment;
1719
import no.nav.dolly.domain.projection.TeamFragment;
1820
import no.nav.dolly.repository.BestillingRepository;
@@ -31,6 +33,7 @@
3133
import java.util.function.Function;
3234
import java.util.stream.Collectors;
3335

36+
import static java.lang.Math.toIntExact;
3437
import static org.apache.commons.lang3.StringUtils.isNotBlank;
3538

3639
@Slf4j
@@ -94,28 +97,6 @@ public Flux<DashboardTeamsDTO> getTeamsStatus() {
9497
.sort(Comparator.comparing(DashboardTeamsDTO::getInterval).reversed());
9598
}
9699

97-
private static long sumByStatus(List<BestillingerFragment> fragments,
98-
Function<BestillingerFragment, String> statusGetter,
99-
String value) {
100-
101-
return fragments.stream()
102-
.filter(f -> value.equals(statusGetter.apply(f)))
103-
.mapToLong(BestillingerFragment::getPersoner)
104-
.sum();
105-
}
106-
107-
private static Map<String, Set<String>> groupFragmentsByTeam(List<TeamFragment> fragments,
108-
Map<String, List<String>> teams) {
109-
110-
var grouped = new HashMap<String, Set<String>>();
111-
fragments.forEach(fragment -> {
112-
var teamNames = teams.getOrDefault(fragment.getEpost(), List.of(INGEN_TEAM));
113-
teamNames.forEach(team ->
114-
grouped.computeIfAbsent(team, _ -> new HashSet<>()).add(fragment.getEpost()));
115-
});
116-
return grouped;
117-
}
118-
119100
public Flux<DashboardOrganisasjonerDTO> getOrganisasjonerStatus() {
120101

121102
return Mono.zip(altinn3TilgangServiceConsumer.getOrganisasjoner()
@@ -142,6 +123,28 @@ public Flux<DashboardOrganisasjonerDTO> getOrganisasjonerStatus() {
142123
.sort(Comparator.comparing(DashboardOrganisasjonerDTO::getInterval).reversed());
143124
}
144125

126+
private static long sumByStatus(List<BestillingerFragment> fragments,
127+
Function<BestillingerFragment, String> statusGetter,
128+
String value) {
129+
130+
return fragments.stream()
131+
.filter(f -> value.equals(statusGetter.apply(f)))
132+
.mapToLong(BestillingerFragment::getPersoner)
133+
.sum();
134+
}
135+
136+
private static Map<String, Set<String>> groupFragmentsByTeam(List<TeamFragment> fragments,
137+
Map<String, List<String>> teams) {
138+
139+
var grouped = new HashMap<String, Set<String>>();
140+
fragments.forEach(fragment -> {
141+
var teamNames = teams.getOrDefault(fragment.getEpost(), List.of(INGEN_TEAM));
142+
teamNames.forEach(team ->
143+
grouped.computeIfAbsent(team, _ -> new HashSet<>()).add(fragment.getEpost()));
144+
});
145+
return grouped;
146+
}
147+
145148
private static Map<String, Set<String>> groupFragmentsByOrganisasjon(List<OrganisasjonFragment> fragments,
146149
Map<String, String> brukerToOrgnummer) {
147150

@@ -163,4 +166,27 @@ private static DashboardOrganisasjonerDTO.Entry toOrganisasjonEntry(String orgNu
163166
.build());
164167
return new DashboardOrganisasjonerDTO.Entry(orgNummer, info.getNavn(), info.getOrganisasjonsform(), brukere.size());
165168
}
169+
170+
public Flux<DashboardDollyTeamsDTO> getDollyTeamsStatus() {
171+
172+
return bestillingRepository.findBestillingerForDollyTeamsOrderBySistOppdatert()
173+
.groupBy(DollyTeamFragment::getInterval)
174+
.flatMap(Flux::collectList)
175+
.map(fragments -> DashboardDollyTeamsDTO.builder()
176+
.interval(fragments.getFirst().getInterval())
177+
.teams(fragments.stream()
178+
.map(fragment -> {
179+
var info = fragment.getInformasjon().split(",", 2);
180+
return new DashboardDollyTeamsDTO.Entry(info[0], info[1], toIntExact(fragment.getAntall()));
181+
})
182+
.sorted(Comparator.comparing(DashboardDollyTeamsDTO.Entry::getNavn))
183+
.toList())
184+
.totaltAntallTeams(fragments.size())
185+
.totaltUnikeBrukere(fragments.stream()
186+
.map(DollyTeamFragment::getAntall)
187+
.map(Long::intValue)
188+
.reduce(0, Integer::sum))
189+
.build())
190+
.sort(Comparator.comparing(DashboardDollyTeamsDTO::getInterval).reversed());
191+
}
166192
}

0 commit comments

Comments
 (0)