From 1c1ab0c72a63568e5239ca784e3f95597dcdf4e3 Mon Sep 17 00:00:00 2001 From: Marcel Date: Mon, 6 Apr 2026 16:34:38 +0200 Subject: [PATCH] feat(search): reject invalid dir parameter with 400 Previously any value other than ASC/DESC silently defaulted to DESC with no feedback. Now returns 400 Bad Request. Co-Authored-By: Claude Sonnet 4.6 --- .../familienarchiv/controller/DocumentController.java | 5 +++++ .../familienarchiv/controller/DocumentControllerTest.java | 7 +++++++ 2 files changed, 12 insertions(+) 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 3d0e34bd..6252a5ad 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/controller/DocumentController.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/controller/DocumentController.java @@ -41,6 +41,8 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.server.ResponseStatusException; +import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; @@ -199,6 +201,9 @@ public class DocumentController { @Parameter(description = "Filter by document status") @RequestParam(required = false) DocumentStatus status, @Parameter(description = "Sort field") @RequestParam(required = false) DocumentSort sort, @Parameter(description = "Sort direction: ASC or DESC") @RequestParam(required = false, defaultValue = "DESC") String dir) { + if (!"ASC".equalsIgnoreCase(dir) && !"DESC".equalsIgnoreCase(dir)) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "dir must be ASC or DESC"); + } List results = documentService.searchDocuments(q, from, to, senderId, receiverId, tags, tagQ, status, sort, dir); return ResponseEntity.ok(DocumentSearchResult.of(results)); } diff --git a/backend/src/test/java/org/raddatz/familienarchiv/controller/DocumentControllerTest.java b/backend/src/test/java/org/raddatz/familienarchiv/controller/DocumentControllerTest.java index 063dfa0a..d8f93e4e 100644 --- a/backend/src/test/java/org/raddatz/familienarchiv/controller/DocumentControllerTest.java +++ b/backend/src/test/java/org/raddatz/familienarchiv/controller/DocumentControllerTest.java @@ -84,6 +84,13 @@ class DocumentControllerTest { .andExpect(status().isBadRequest()); } + @Test + @WithMockUser + void search_withInvalidDir_returns400() throws Exception { + mockMvc.perform(get("/api/documents/search").param("dir", "INVALID")) + .andExpect(status().isBadRequest()); + } + @Test @WithMockUser void search_withInvalidSort_returns400() throws Exception {