From e6497ebff4c15b44a233fa911b8b0ca6092f86e5 Mon Sep 17 00:00:00 2001 From: Marcel Date: Fri, 17 Apr 2026 01:01:09 +0200 Subject: [PATCH] fix(#248): add @Schema(REQUIRED) to TagTreeNodeDTO, improve mergeTags log, add comments Co-Authored-By: Claude Sonnet 4.6 --- .../familienarchiv/controller/DocumentController.java | 2 ++ .../java/org/raddatz/familienarchiv/dto/TagTreeNodeDTO.java | 6 +++--- .../java/org/raddatz/familienarchiv/service/TagService.java | 6 ++++-- 3 files changed, 9 insertions(+), 5 deletions(-) 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 22671407..6dfb81fe 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/controller/DocumentController.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/controller/DocumentController.java @@ -210,6 +210,8 @@ public class DocumentController { if (!"ASC".equalsIgnoreCase(dir) && !"DESC".equalsIgnoreCase(dir)) { throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "dir must be ASC or DESC"); } + // tagOp is a raw String at the HTTP boundary; any value other than "OR" (case-insensitive) + // defaults to AND, which matches the frontend default and keeps old clients working. TagOperator operator = "OR".equalsIgnoreCase(tagOp) ? TagOperator.OR : TagOperator.AND; return ResponseEntity.ok(documentService.searchDocuments(q, from, to, senderId, receiverId, tags, tagQ, status, sort, dir, operator)); } diff --git a/backend/src/main/java/org/raddatz/familienarchiv/dto/TagTreeNodeDTO.java b/backend/src/main/java/org/raddatz/familienarchiv/dto/TagTreeNodeDTO.java index f227e602..4205b199 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/dto/TagTreeNodeDTO.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/dto/TagTreeNodeDTO.java @@ -6,9 +6,9 @@ import java.util.UUID; import io.swagger.v3.oas.annotations.media.Schema; public record TagTreeNodeDTO( - UUID id, - String name, + @Schema(requiredMode = Schema.RequiredMode.REQUIRED) UUID id, + @Schema(requiredMode = Schema.RequiredMode.REQUIRED) String name, String color, - int documentCount, + @Schema(requiredMode = Schema.RequiredMode.REQUIRED) int documentCount, List children, @Schema(description = "Parent tag ID, null for root tags") UUID parentId) {} diff --git a/backend/src/main/java/org/raddatz/familienarchiv/service/TagService.java b/backend/src/main/java/org/raddatz/familienarchiv/service/TagService.java index ff29b72c..b82b0be5 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/service/TagService.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/service/TagService.java @@ -79,10 +79,10 @@ public class TagService { @Transactional public Tag mergeTags(UUID sourceId, UUID targetId) { - log.info("Merging tag {} into {}", sourceId, targetId); validateNotSelf(sourceId, targetId); - getById(sourceId); + Tag source = getById(sourceId); Tag target = getById(targetId); + log.info("Merging tag '{}' ({}) into '{}' ({})", source.getName(), sourceId, target.getName(), targetId); validateNotDescendant(sourceId, targetId); transferDocuments(sourceId, targetId); tagRepository.reparentChildren(sourceId, targetId); @@ -145,6 +145,8 @@ public class TagService { /** * Returns all tags assembled into a tree with document counts per node. * Uses a single aggregate query to avoid N+1 behaviour. + * NOTE: document counts are global per tag, not scoped to any search filter. + * The tree endpoint is only used for the admin sidebar, so this is intentional. */ public List getTagTree() { List all = tagRepository.findAll();