diff --git a/backend/src/main/java/org/raddatz/familienarchiv/service/CommentService.java b/backend/src/main/java/org/raddatz/familienarchiv/service/CommentService.java index 554fa492..da34588f 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/service/CommentService.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/service/CommentService.java @@ -13,6 +13,8 @@ import org.raddatz.familienarchiv.repository.CommentRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Collection; +import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -29,6 +31,15 @@ public class CommentService { private final AuditService auditService; private final TranscriptionService transcriptionService; + public Map findAnnotationIdsByIds(Collection commentIds) { + if (commentIds == null || commentIds.isEmpty()) return Map.of(); + Map result = new HashMap<>(); + for (DocumentComment c : commentRepository.findAllById(commentIds)) { + if (c.getAnnotationId() != null) result.put(c.getId(), c.getAnnotationId()); + } + return result; + } + public List getCommentsForBlock(UUID blockId) { List roots = commentRepository.findByBlockIdAndParentIdIsNull(blockId); return withRepliesAndMentions(roots); diff --git a/backend/src/test/java/org/raddatz/familienarchiv/service/CommentServiceTest.java b/backend/src/test/java/org/raddatz/familienarchiv/service/CommentServiceTest.java index 19eb0b8d..a7854424 100644 --- a/backend/src/test/java/org/raddatz/familienarchiv/service/CommentServiceTest.java +++ b/backend/src/test/java/org/raddatz/familienarchiv/service/CommentServiceTest.java @@ -641,6 +641,64 @@ class CommentServiceTest { verify(auditService, never()).logAfterCommit(eq(AuditKind.MENTION_CREATED), any(), any(), any()); } + // ─── findAnnotationIdsByIds ─────────────────────────────────────────────── + + @Test + void findAnnotationIdsByIds_returnsMap_forKnownIds() { + UUID commentA = UUID.randomUUID(); + UUID annotationA = UUID.randomUUID(); + UUID commentB = UUID.randomUUID(); + UUID annotationB = UUID.randomUUID(); + when(commentRepository.findAllById(List.of(commentA, commentB))) + .thenReturn(List.of( + DocumentComment.builder().id(commentA).annotationId(annotationA).build(), + DocumentComment.builder().id(commentB).annotationId(annotationB).build() + )); + + assertThat(commentService.findAnnotationIdsByIds(List.of(commentA, commentB))) + .containsOnly( + java.util.Map.entry(commentA, annotationA), + java.util.Map.entry(commentB, annotationB) + ); + } + + @Test + void findAnnotationIdsByIds_returnsEmptyMap_forEmptyInput() { + assertThat(commentService.findAnnotationIdsByIds(List.of())).isEmpty(); + verify(commentRepository, never()).findAllById(anyList()); + } + + @Test + void findAnnotationIdsByIds_omitsUnknownIds() { + UUID known = UUID.randomUUID(); + UUID knownAnnotation = UUID.randomUUID(); + UUID missing = UUID.randomUUID(); + when(commentRepository.findAllById(List.of(known, missing))) + .thenReturn(List.of( + DocumentComment.builder().id(known).annotationId(knownAnnotation).build() + )); + + assertThat(commentService.findAnnotationIdsByIds(List.of(known, missing))) + .containsOnly(java.util.Map.entry(known, knownAnnotation)) + .doesNotContainKey(missing); + } + + @Test + void findAnnotationIdsByIds_omitsCommentsWithNullAnnotationId() { + UUID legacy = UUID.randomUUID(); + UUID block = UUID.randomUUID(); + UUID annotation = UUID.randomUUID(); + when(commentRepository.findAllById(List.of(legacy, block))) + .thenReturn(List.of( + DocumentComment.builder().id(legacy).annotationId(null).build(), + DocumentComment.builder().id(block).annotationId(annotation).build() + )); + + assertThat(commentService.findAnnotationIdsByIds(List.of(legacy, block))) + .containsOnly(java.util.Map.entry(block, annotation)) + .doesNotContainKey(legacy); + } + private void stubBlock(UUID docId, UUID blockId) { when(transcriptionService.getBlock(docId, blockId)) .thenReturn(TranscriptionBlock.builder()