Skip to content

Commit 16d3053

Browse files
committed
feature: Enhance DollyTeams status retrieval in DashboardService and update DTOs for member count #deploy-test-dolly-backend #deploy-dolly-backend
1 parent 3239215 commit 16d3053

7 files changed

Lines changed: 91 additions & 39 deletions

File tree

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
public class DashboardDollyTeamsDTO {
1515

1616
private String interval;
17-
private Integer totaltUnikeBrukere;
17+
private Integer totaltAntallMedlemmer;
1818
private Integer totaltAntallTeams;
1919
private List<Entry> teams;
2020

@@ -26,6 +26,6 @@ public static class Entry {
2626

2727
private String navn;
2828
private String beskrivelse;
29-
private Integer unikeBrukere;
29+
private Integer antallMedlemmer;
3030
}
3131
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
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 DollyTeam2Fragment {
13+
14+
private String brukerid;
15+
private Long antall;
16+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ select count(*) antall, to_char(b.sist_oppdatert, 'YYYY-MM') interval, br.bruker
194194

195195
@Query("""
196196
select count(*) antall, to_char(b.sist_oppdatert, 'YYYY-MM') interval,
197-
t.navn || '|' || t.beskrivelse informasjon
197+
t.navn || '|' || t.beskrivelse || '|' || t.bruker_id informasjon
198198
from bestilling b
199199
join bruker br on br.id = b.bruker_id
200200
join team t on t.bruker_id = br.id

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,6 @@ public interface TeamBrukerRepository extends ReactiveCrudRepository<TeamBruker,
1313
@Modifying
1414
Mono<Void> deleteByTeamId(Long teamId);
1515

16-
@Modifying
17-
Mono<Void> deleteByBrukerId(Long brukerId);
18-
1916
@Modifying
2017
Mono<Void> deleteByTeamIdAndBrukerId(Long teamId, Long brukerId);
2118

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,23 @@
11
package no.nav.dolly.repository;
22

33
import no.nav.dolly.domain.jpa.Team;
4+
import no.nav.dolly.domain.projection.DollyTeam2Fragment;
5+
import org.springframework.data.r2dbc.repository.Query;
46
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
57
import org.springframework.stereotype.Repository;
8+
import reactor.core.publisher.Flux;
69
import reactor.core.publisher.Mono;
710

811
@Repository
912
public interface TeamRepository extends ReactiveCrudRepository<Team, Long> {
1013

1114
Mono<Team> findByNavn(String navn);
15+
16+
@Query("""
17+
select t.bruker_id brukerId, count(*) antall
18+
from Team t
19+
join team_bruker tb on t.id = tb.team_id
20+
group by brukerId
21+
""")
22+
Flux<DollyTeam2Fragment> findAllTeamBrukere();
1223
}

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

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@
1414
import no.nav.dolly.domain.dto.DashboardTeamsDTO;
1515
import no.nav.dolly.domain.jpa.Bruker;
1616
import no.nav.dolly.domain.projection.BestillingerFragment;
17+
import no.nav.dolly.domain.projection.DollyTeam2Fragment;
1718
import no.nav.dolly.domain.projection.DollyTeamFragment;
1819
import no.nav.dolly.domain.projection.OrganisasjonFragment;
1920
import no.nav.dolly.domain.projection.TeamFragment;
2021
import no.nav.dolly.repository.BestillingRepository;
2122
import no.nav.dolly.repository.BrukerRepository;
23+
import no.nav.dolly.repository.TeamRepository;
2224
import org.springframework.stereotype.Service;
2325
import reactor.core.publisher.Flux;
2426
import reactor.core.publisher.Mono;
@@ -48,6 +50,7 @@ public class DashboardService {
4850
private final BrukerRepository brukerRepository;
4951
private final BrukerServiceConsumer brukerServiceConsumer;
5052
private final TeamkatalogConsumer teamkatalogConsumer;
53+
private final TeamRepository teamRepository;
5154

5255
public Flux<DashboardPersonerDTO> getPersonerStatus() {
5356

@@ -169,24 +172,28 @@ private static DashboardOrganisasjonerDTO.Entry toOrganisasjonEntry(String orgNu
169172

170173
public Flux<DashboardDollyTeamsDTO> getDollyTeamsStatus() {
171174

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())
175+
return teamRepository.findAllTeamBrukere()
176+
.collect(Collectors.toMap(DollyTeam2Fragment::getBrukerid, DollyTeam2Fragment::getAntall))
177+
.flatMapMany(oppslag -> bestillingRepository.findBestillingerForDollyTeamsOrderBySistOppdatert()
178+
.groupBy(DollyTeamFragment::getInterval)
179+
.flatMap(Flux::collectList)
180+
.map(fragments -> DashboardDollyTeamsDTO.builder()
181+
.interval(fragments.getFirst().getInterval())
182+
.teams(fragments.stream()
183+
.map(fragment -> {
184+
var info = fragment.getInformasjon().split("\\|");
185+
return new DashboardDollyTeamsDTO.Entry(info[0], info[1],
186+
toIntExact(oppslag.get(info[2])));
187+
})
188+
.sorted(Comparator.comparing(DashboardDollyTeamsDTO.Entry::getNavn))
189+
.toList())
190+
.totaltAntallTeams(fragments.size())
191+
.totaltAntallMedlemmer(fragments.stream()
192+
.map(fragment -> fragment.getInformasjon().split("\\|")[2])
193+
.map(oppslag::get)
194+
.map(Math::toIntExact)
195+
.reduce(0, Integer::sum))
196+
.build()))
190197
.sort(Comparator.comparing(DashboardDollyTeamsDTO::getInterval).reversed());
191198
}
192199
}

apps/dolly-backend/src/test/java/no/nav/dolly/service/DashboardServiceTest.java

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@
1111
import no.nav.dolly.domain.dto.DashboardTeamsDTO;
1212
import no.nav.dolly.domain.jpa.Bruker;
1313
import no.nav.dolly.domain.projection.BestillingerFragment;
14+
import no.nav.dolly.domain.projection.DollyTeam2Fragment;
1415
import no.nav.dolly.domain.projection.DollyTeamFragment;
1516
import no.nav.dolly.domain.projection.OrganisasjonFragment;
1617
import no.nav.dolly.domain.projection.TeamFragment;
1718
import no.nav.dolly.repository.BestillingRepository;
1819
import no.nav.dolly.repository.BrukerRepository;
20+
import no.nav.dolly.repository.TeamRepository;
1921
import org.junit.jupiter.api.Test;
2022
import org.junit.jupiter.api.extension.ExtendWith;
2123
import org.mockito.InjectMocks;
@@ -54,6 +56,9 @@ class DashboardServiceTest {
5456
@Mock
5557
private TeamkatalogConsumer teamkatalogConsumer;
5658

59+
@Mock
60+
private TeamRepository teamRepository;
61+
5762
@InjectMocks
5863
private DashboardService dashboardService;
5964

@@ -424,6 +429,7 @@ void shouldSortOrganisasjonerByNavnAlphabetically() {
424429

425430
@Test
426431
void shouldReturnEmptyDollyTeamsWhenNoFragments() {
432+
when(teamRepository.findAllTeamBrukere()).thenReturn(Flux.empty());
427433
when(bestillingRepository.findBestillingerForDollyTeamsOrderBySistOppdatert()).thenReturn(Flux.empty());
428434

429435
StepVerifier.create(dashboardService.getDollyTeamsStatus())
@@ -432,42 +438,52 @@ void shouldReturnEmptyDollyTeamsWhenNoFragments() {
432438

433439
@Test
434440
void shouldParseDollyTeamInformasjonIntoNavnAndBeskrivelse() {
441+
when(teamRepository.findAllTeamBrukere()).thenReturn(Flux.just(
442+
DollyTeam2Fragment.builder().brukerid("1").antall(3L).build()
443+
));
435444
when(bestillingRepository.findBestillingerForDollyTeamsOrderBySistOppdatert())
436-
.thenReturn(Flux.just(dollyTeamFragment(INTERVAL_1, "Team A", "En beskrivelse", 3L)));
445+
.thenReturn(Flux.just(dollyTeamFragment(INTERVAL_1, "Team A", "En beskrivelse", "1")));
437446

438447
StepVerifier.create(dashboardService.getDollyTeamsStatus())
439448
.assertNext(dto -> {
440449
assertThat(dto.getTeams()).hasSize(1);
441450
var entry = dto.getTeams().getFirst();
442451
assertThat(entry.getNavn()).isEqualTo("Team A");
443452
assertThat(entry.getBeskrivelse()).isEqualTo("En beskrivelse");
444-
assertThat(entry.getUnikeBrukere()).isEqualTo(3);
453+
assertThat(entry.getAntallMedlemmer()).isEqualTo(3);
445454
})
446455
.verifyComplete();
447456
}
448457

449458
@Test
450-
void shouldSumTotaltUnikeBrukereAcrossTeams() {
459+
void shouldSumTotaltAntallMedlemmerAcrossTeams() {
460+
when(teamRepository.findAllTeamBrukere()).thenReturn(Flux.just(
461+
DollyTeam2Fragment.builder().brukerid("4").antall(4L).build(),
462+
DollyTeam2Fragment.builder().brukerid("6").antall(6L).build()
463+
));
451464
when(bestillingRepository.findBestillingerForDollyTeamsOrderBySistOppdatert())
452465
.thenReturn(Flux.just(
453-
dollyTeamFragment(INTERVAL_1, "Team A", "Beskrivelse A", 4L),
454-
dollyTeamFragment(INTERVAL_1, "Team B", "Beskrivelse B", 6L)
466+
dollyTeamFragment(INTERVAL_1, "Team A", "Beskrivelse A", "4"),
467+
dollyTeamFragment(INTERVAL_1, "Team B", "Beskrivelse B", "6")
455468
));
456469

457470
StepVerifier.create(dashboardService.getDollyTeamsStatus())
458471
.assertNext(dto -> {
459472
assertThat(dto.getTotaltAntallTeams()).isEqualTo(2);
460-
assertThat(dto.getTotaltUnikeBrukere()).isEqualTo(10);
473+
assertThat(dto.getTotaltAntallMedlemmer()).isEqualTo(10);
461474
})
462475
.verifyComplete();
463476
}
464477

465478
@Test
466479
void shouldSortDollyTeamsByNavnAlphabetically() {
480+
when(teamRepository.findAllTeamBrukere()).thenReturn(Flux.just(
481+
DollyTeam2Fragment.builder().brukerid("1").antall(1L).build()
482+
));
467483
when(bestillingRepository.findBestillingerForDollyTeamsOrderBySistOppdatert())
468484
.thenReturn(Flux.just(
469-
dollyTeamFragment(INTERVAL_1, "Zebra", "Z", 1L),
470-
dollyTeamFragment(INTERVAL_1, "Alpha", "A", 1L)
485+
dollyTeamFragment(INTERVAL_1, "Zebra", "Z", "1"),
486+
dollyTeamFragment(INTERVAL_1, "Alpha", "A", "1")
471487
));
472488

473489
StepVerifier.create(dashboardService.getDollyTeamsStatus())
@@ -480,10 +496,13 @@ void shouldSortDollyTeamsByNavnAlphabetically() {
480496

481497
@Test
482498
void shouldGroupDollyTeamFragmentsByIntervalIntoSeparateDtos() {
499+
when(teamRepository.findAllTeamBrukere()).thenReturn(Flux.just(
500+
DollyTeam2Fragment.builder().brukerid("1").antall(1L).build()
501+
));
483502
when(bestillingRepository.findBestillingerForDollyTeamsOrderBySistOppdatert())
484503
.thenReturn(Flux.just(
485-
dollyTeamFragment(INTERVAL_1, "Team A", "A", 1L),
486-
dollyTeamFragment(INTERVAL_2, "Team B", "B", 1L)
504+
dollyTeamFragment(INTERVAL_1, "Team A", "A", "1"),
505+
dollyTeamFragment(INTERVAL_2, "Team B", "B", "1")
487506
));
488507

489508
StepVerifier.create(dashboardService.getDollyTeamsStatus())
@@ -494,10 +513,13 @@ void shouldGroupDollyTeamFragmentsByIntervalIntoSeparateDtos() {
494513

495514
@Test
496515
void shouldSortDollyTeamsStatusByIntervalDescending() {
516+
when(teamRepository.findAllTeamBrukere()).thenReturn(Flux.just(
517+
DollyTeam2Fragment.builder().brukerid("1").antall(1L).build()
518+
));
497519
when(bestillingRepository.findBestillingerForDollyTeamsOrderBySistOppdatert())
498520
.thenReturn(Flux.just(
499-
dollyTeamFragment(INTERVAL_1, "Team A", "A", 1L),
500-
dollyTeamFragment(INTERVAL_2, "Team B", "B", 1L)
521+
dollyTeamFragment(INTERVAL_1, "Team A", "A", "1"),
522+
dollyTeamFragment(INTERVAL_2, "Team B", "B", "1")
501523
));
502524

503525
var results = dashboardService.getDollyTeamsStatus().collectList().block();
@@ -535,11 +557,10 @@ private static OrganisasjonFragment organisasjonFragment(String interval, String
535557
.build();
536558
}
537559

538-
private static DollyTeamFragment dollyTeamFragment(String interval, String navn, String beskrivelse, long antall) {
560+
private static DollyTeamFragment dollyTeamFragment(String interval, String navn, String beskrivelse, String brukerid) {
539561
return DollyTeamFragment.builder()
540562
.interval(interval)
541-
.informasjon(navn + "|" + beskrivelse)
542-
.antall(antall)
563+
.informasjon(navn + "|" + beskrivelse + "|" + brukerid)
543564
.build();
544565
}
545566
}

0 commit comments

Comments
 (0)