Admin Dashboard mit Statistiken: Tierärzte-Anzahl, Gesamtproben und Proben pro Tierarzt
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
package de.svencarstensen.muh.service;
|
||||
|
||||
import de.svencarstensen.muh.domain.AppUser;
|
||||
import de.svencarstensen.muh.domain.Sample;
|
||||
import de.svencarstensen.muh.domain.UserRole;
|
||||
import de.svencarstensen.muh.repository.AppUserRepository;
|
||||
import de.svencarstensen.muh.repository.SampleRepository;
|
||||
import de.svencarstensen.muh.web.dto.AdminStatistics;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
public class AdminStatisticsService {
|
||||
|
||||
private final AppUserRepository appUserRepository;
|
||||
private final SampleRepository sampleRepository;
|
||||
|
||||
public AdminStatisticsService(AppUserRepository appUserRepository, SampleRepository sampleRepository) {
|
||||
this.appUserRepository = appUserRepository;
|
||||
this.sampleRepository = sampleRepository;
|
||||
}
|
||||
|
||||
public AdminStatistics getStatistics() {
|
||||
// Alle Hauptnutzer (Tierärzte) laden - primaryUser=true und role=CUSTOMER
|
||||
List<AppUser> vets = appUserRepository.findAll().stream()
|
||||
.filter(u -> Boolean.TRUE.equals(u.primaryUser()))
|
||||
.filter(u -> u.role() == UserRole.CUSTOMER)
|
||||
.toList();
|
||||
|
||||
// Alle Proben laden
|
||||
List<Sample> allSamples = sampleRepository.findAll();
|
||||
|
||||
// Proben pro Tierarzt zählen (basierend auf createdByUserCode)
|
||||
List<AdminStatistics.VetSampleStats> samplesPerVet = vets.stream()
|
||||
.map(vet -> {
|
||||
long sampleCount = allSamples.stream()
|
||||
.filter(s -> vet.id().equals(s.createdByUserCode()))
|
||||
.count();
|
||||
return new AdminStatistics.VetSampleStats(
|
||||
vet.id(),
|
||||
vet.displayName(),
|
||||
vet.companyName(),
|
||||
sampleCount
|
||||
);
|
||||
})
|
||||
.filter(s -> s.sampleCount() > 0)
|
||||
.sorted((a, b) -> Long.compare(b.sampleCount(), a.sampleCount()))
|
||||
.toList();
|
||||
|
||||
return new AdminStatistics(
|
||||
vets.size(),
|
||||
allSamples.size(),
|
||||
samplesPerVet
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package de.svencarstensen.muh.web;
|
||||
|
||||
import de.svencarstensen.muh.service.AdminStatisticsService;
|
||||
import de.svencarstensen.muh.web.dto.AdminStatistics;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/admin")
|
||||
@PreAuthorize("hasRole('ADMIN')")
|
||||
public class AdminController {
|
||||
|
||||
private final AdminStatisticsService adminStatisticsService;
|
||||
|
||||
public AdminController(AdminStatisticsService adminStatisticsService) {
|
||||
this.adminStatisticsService = adminStatisticsService;
|
||||
}
|
||||
|
||||
@GetMapping("/statistics")
|
||||
public AdminStatistics getStatistics() {
|
||||
return adminStatisticsService.getStatistics();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package de.svencarstensen.muh.web.dto;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record AdminStatistics(
|
||||
long totalVets,
|
||||
long totalSamples,
|
||||
List<VetSampleStats> samplesPerVet
|
||||
) {
|
||||
public record VetSampleStats(
|
||||
String userId,
|
||||
String displayName,
|
||||
String companyName,
|
||||
long sampleCount
|
||||
) {
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user