diff --git a/backend/src/main/java/org/raddatz/familienarchiv/controller/DocumentController.java b/backend/src/main/java/org/raddatz/familienarchiv/controller/DocumentController.java index 7b49a148..f661e8aa 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/controller/DocumentController.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/controller/DocumentController.java @@ -212,7 +212,7 @@ public class DocumentController { @GetMapping("/conversation") public List getConversation( @RequestParam UUID senderId, - @RequestParam UUID receiverId, + @RequestParam(required = false) UUID receiverId, @RequestParam(required = false) LocalDate from, @RequestParam(required = false) LocalDate to, @RequestParam(defaultValue = "DESC") String dir) { diff --git a/backend/src/main/java/org/raddatz/familienarchiv/repository/DocumentRepository.java b/backend/src/main/java/org/raddatz/familienarchiv/repository/DocumentRepository.java index c7db9cac..ca5a88d4 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/repository/DocumentRepository.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/repository/DocumentRepository.java @@ -60,11 +60,9 @@ public interface DocumentRepository extends JpaRepository, JpaSp @Query("SELECT DISTINCT d FROM Document d " + "JOIN d.receivers r " + "WHERE " + - // Logik: (Sender A an Empfänger B) ODER (Sender B an Empfänger A) "((d.sender.id = :person1 AND r.id = :person2) " + " OR " + " (d.sender.id = :person2 AND r.id = :person1)) " + - // UND das Datum stimmt "AND d.documentDate BETWEEN :from AND :to") List findConversation( @Param("person1") UUID person1, @@ -73,4 +71,14 @@ public interface DocumentRepository extends JpaRepository, JpaSp @Param("to") LocalDate to, Sort sort); + @Query("SELECT DISTINCT d FROM Document d " + + "LEFT JOIN d.receivers r " + + "WHERE (d.sender.id = :personId OR r.id = :personId) " + + "AND d.documentDate BETWEEN :from AND :to") + List findSinglePersonCorrespondence( + @Param("personId") UUID personId, + @Param("from") LocalDate from, + @Param("to") LocalDate to, + Sort sort); + } \ No newline at end of file diff --git a/backend/src/main/java/org/raddatz/familienarchiv/service/DocumentService.java b/backend/src/main/java/org/raddatz/familienarchiv/service/DocumentService.java index 55c5ab98..fe5826ee 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/service/DocumentService.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/service/DocumentService.java @@ -328,6 +328,9 @@ public class DocumentService { public List getConversationFiltered(UUID senderId, UUID receiverId, LocalDate from, LocalDate to, Sort sort) { LocalDate dateFrom = (from != null) ? from : LocalDate.parse("0000-01-01"); LocalDate dateTo = (to != null) ? to : LocalDate.now(); + if (receiverId == null) { + return documentRepository.findSinglePersonCorrespondence(senderId, dateFrom, dateTo, sort); + } return documentRepository.findConversation(senderId, receiverId, dateFrom, dateTo, sort); } diff --git a/backend/src/test/java/org/raddatz/familienarchiv/service/DocumentServiceTest.java b/backend/src/test/java/org/raddatz/familienarchiv/service/DocumentServiceTest.java index fb86d2a8..fb01c7a2 100644 --- a/backend/src/test/java/org/raddatz/familienarchiv/service/DocumentServiceTest.java +++ b/backend/src/test/java/org/raddatz/familienarchiv/service/DocumentServiceTest.java @@ -1244,4 +1244,33 @@ class DocumentServiceTest { assertThat(captor.getValue().getSort()) .isEqualTo(Sort.by(Sort.Direction.DESC, "updatedAt")); } + + // ─── getConversationFiltered (single-person mode) ───────────────────────── + + @Test + void getConversationFiltered_callsSinglePersonQuery_whenReceiverIdIsNull() { + UUID personId = UUID.randomUUID(); + Sort sort = Sort.by(Sort.Direction.DESC, "documentDate"); + when(documentRepository.findSinglePersonCorrespondence(eq(personId), any(), any(), eq(sort))) + .thenReturn(List.of()); + + documentService.getConversationFiltered(personId, null, null, null, sort); + + verify(documentRepository).findSinglePersonCorrespondence(eq(personId), any(), any(), eq(sort)); + verify(documentRepository, never()).findConversation(any(), any(), any(), any(), any()); + } + + @Test + void getConversationFiltered_callsBilateralQuery_whenReceiverIdIsSet() { + UUID senderId = UUID.randomUUID(); + UUID receiverId = UUID.randomUUID(); + Sort sort = Sort.by(Sort.Direction.DESC, "documentDate"); + when(documentRepository.findConversation(eq(senderId), eq(receiverId), any(), any(), eq(sort))) + .thenReturn(List.of()); + + documentService.getConversationFiltered(senderId, receiverId, null, null, sort); + + verify(documentRepository).findConversation(eq(senderId), eq(receiverId), any(), any(), eq(sort)); + verify(documentRepository, never()).findSinglePersonCorrespondence(any(), any(), any(), any()); + } }