From 80c952cd6c6f3060cb77bf89873a6291cc68bb9a Mon Sep 17 00:00:00 2001 From: Marcel Date: Sun, 19 Apr 2026 18:30:40 +0200 Subject: [PATCH] feat(dashboard): expose findContributorsPerDocument in AuditLogQueryService --- .../dashboard/AuditLogQueryService.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 backend/src/main/java/org/raddatz/familienarchiv/dashboard/AuditLogQueryService.java diff --git a/backend/src/main/java/org/raddatz/familienarchiv/dashboard/AuditLogQueryService.java b/backend/src/main/java/org/raddatz/familienarchiv/dashboard/AuditLogQueryService.java new file mode 100644 index 00000000..a7a45104 --- /dev/null +++ b/backend/src/main/java/org/raddatz/familienarchiv/dashboard/AuditLogQueryService.java @@ -0,0 +1,52 @@ +package org.raddatz.familienarchiv.dashboard; + +import org.raddatz.familienarchiv.audit.AuditLogRepository; +import org.springframework.stereotype.Service; + +import java.time.OffsetDateTime; +import java.util.*; + +@Service +public class AuditLogQueryService { + + private final AuditLogQueryRepository queryRepository; + + public AuditLogQueryService(AuditLogQueryRepository queryRepository) { + this.queryRepository = queryRepository; + } + + public Optional findMostRecentDocumentForUser(UUID userId) { + return queryRepository.findMostRecentDocumentIdByActor(userId); + } + + public List findActivityFeed(UUID currentUserId, int limit) { + return queryRepository.findDedupedActivityFeed(currentUserId.toString(), limit); + } + + public PulseStatsRow getPulseStats(OffsetDateTime weekStart, UUID userId) { + return queryRepository.getPulseStats(weekStart, userId.toString()); + } + + public Map findMostRecentActorPerDocument(List documentIds, String kind) { + if (documentIds.isEmpty()) return Map.of(); + List rows = queryRepository.findMostRecentActorPerDocument(documentIds, kind); + Map result = new LinkedHashMap<>(); + for (Object[] row : rows) { + UUID docId = (UUID) row[0]; + UUID actorId = (UUID) row[1]; + result.put(docId, actorId); + } + return result; + } + + public Map> findContributorsPerDocument(List documentIds) { + if (documentIds.isEmpty()) return Map.of(); + List rows = queryRepository.findContributorsPerDocument(documentIds); + Map> result = new LinkedHashMap<>(); + for (ContributorRow row : rows) { + result.computeIfAbsent(row.getDocumentId(), k -> new ArrayList<>()) + .add(new ActivityActorDTO(row.getActorInitials(), row.getActorColor(), row.getActorName())); + } + return result; + } +}