From 557b62ac5c7fdcfd1e445b9e6a920fc120d69ea2 Mon Sep 17 00:00:00 2001 From: Marcel Date: Fri, 20 Mar 2026 09:39:18 +0100 Subject: [PATCH] feat(backend): add received-documents endpoint for persons Add findByReceiversId to DocumentRepository, getDocumentsByReceiver to DocumentService, and GET /api/persons/{id}/received-documents to PersonController. Tests added for both service and controller layers. Closes #1 Co-Authored-By: Claude Sonnet 4.6 --- .../controller/PersonController.java | 5 ++ .../repository/DocumentRepository.java | 2 + .../service/DocumentService.java | 4 ++ .../controller/PersonControllerTest.java | 52 +++++++++++++++++++ .../service/DocumentServiceTest.java | 11 ++++ 5 files changed, 74 insertions(+) create mode 100644 backend/src/test/java/org/raddatz/familienarchiv/controller/PersonControllerTest.java diff --git a/backend/src/main/java/org/raddatz/familienarchiv/controller/PersonController.java b/backend/src/main/java/org/raddatz/familienarchiv/controller/PersonController.java index 4db84bde..ceb22f63 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/controller/PersonController.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/controller/PersonController.java @@ -38,6 +38,11 @@ public class PersonController { return documentService.getDocumentsBySender(id); } + @GetMapping("/{id}/received-documents") + public List getPersonReceivedDocuments(@PathVariable UUID id) { + return documentService.getDocumentsByReceiver(id); + } + @PostMapping public ResponseEntity createPerson(@RequestBody Map body) { String firstName = body.get("firstName"); 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 c4010940..370ceb29 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/repository/DocumentRepository.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/repository/DocumentRepository.java @@ -30,6 +30,8 @@ public interface DocumentRepository extends JpaRepository, JpaSp List findBySenderId(UUID senderId); + List findByReceiversId(UUID receiverId); + List findByTags_Id(UUID tagId); @Query("SELECT DISTINCT d FROM Document d " + 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 ebf6dbea..fd4b020e 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/service/DocumentService.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/service/DocumentService.java @@ -254,6 +254,10 @@ public class DocumentService { return documentRepository.findBySenderId(senderId); } + public List getDocumentsByReceiver(UUID receiverId) { + return documentRepository.findByReceiversId(receiverId); + } + 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(); diff --git a/backend/src/test/java/org/raddatz/familienarchiv/controller/PersonControllerTest.java b/backend/src/test/java/org/raddatz/familienarchiv/controller/PersonControllerTest.java new file mode 100644 index 00000000..dbc9084c --- /dev/null +++ b/backend/src/test/java/org/raddatz/familienarchiv/controller/PersonControllerTest.java @@ -0,0 +1,52 @@ +package org.raddatz.familienarchiv.controller; + +import org.junit.jupiter.api.Test; +import org.raddatz.familienarchiv.model.Document; +import org.raddatz.familienarchiv.security.PermissionAspect; +import org.raddatz.familienarchiv.service.CustomUserDetailsService; +import org.raddatz.familienarchiv.service.DocumentService; +import org.raddatz.familienarchiv.service.PersonService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; +import org.raddatz.familienarchiv.config.SecurityConfig; +import org.springframework.boot.autoconfigure.aop.AopAutoConfiguration; +import org.springframework.context.annotation.Import; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.bean.override.mockito.MockitoBean; +import org.springframework.test.web.servlet.MockMvc; + +import java.util.Collections; +import java.util.UUID; + +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(PersonController.class) +@Import({SecurityConfig.class, PermissionAspect.class, AopAutoConfiguration.class}) +class PersonControllerTest { + + @Autowired MockMvc mockMvc; + + @MockitoBean PersonService personService; + @MockitoBean DocumentService documentService; + @MockitoBean CustomUserDetailsService customUserDetailsService; + + // ─── GET /api/persons/{id}/received-documents ───────────────────────────── + + @Test + void getReceivedDocuments_returns401_whenUnauthenticated() throws Exception { + mockMvc.perform(get("/api/persons/{id}/received-documents", UUID.randomUUID())) + .andExpect(status().isUnauthorized()); + } + + @Test + @WithMockUser + void getReceivedDocuments_returns200_whenAuthenticated() throws Exception { + UUID personId = UUID.randomUUID(); + when(documentService.getDocumentsByReceiver(personId)).thenReturn(Collections.emptyList()); + + mockMvc.perform(get("/api/persons/{id}/received-documents", personId)) + .andExpect(status().isOk()); + } +} 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 c978b439..d3ff6cdd 100644 --- a/backend/src/test/java/org/raddatz/familienarchiv/service/DocumentServiceTest.java +++ b/backend/src/test/java/org/raddatz/familienarchiv/service/DocumentServiceTest.java @@ -121,4 +121,15 @@ class DocumentServiceTest { assertThat(result).isEqualTo(saved); verify(documentRepository).save(any()); } + + // ─── getDocumentsByReceiver ─────────────────────────────────────────────── + + @Test + void getDocumentsByReceiver_returnsDocumentsWherePersonIsReceiver() { + UUID receiverId = UUID.randomUUID(); + Document doc = Document.builder().id(UUID.randomUUID()).title("Test").build(); + when(documentRepository.findByReceiversId(receiverId)).thenReturn(List.of(doc)); + + assertThat(documentService.getDocumentsByReceiver(receiverId)).containsExactly(doc); + } }