From b7a2f6c2fe68d62c412d461b469e9688bf0ba30e Mon Sep 17 00:00:00 2001 From: Marcel Date: Sat, 2 May 2026 17:25:34 +0200 Subject: [PATCH] feat(geschichte): add repository and update DTO GeschichteRepository.search filters by status / personId / documentId in a single JPQL query so the controller can serve the index page, the person discovery card, and the document drawer column from one method. The DTO is shared between create and update like DocumentUpdateDTO. Co-Authored-By: Claude Opus 4.7 --- .../dto/GeschichteUpdateDTO.java | 21 +++++++++++++ .../repository/GeschichteRepository.java | 30 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 backend/src/main/java/org/raddatz/familienarchiv/dto/GeschichteUpdateDTO.java create mode 100644 backend/src/main/java/org/raddatz/familienarchiv/repository/GeschichteRepository.java diff --git a/backend/src/main/java/org/raddatz/familienarchiv/dto/GeschichteUpdateDTO.java b/backend/src/main/java/org/raddatz/familienarchiv/dto/GeschichteUpdateDTO.java new file mode 100644 index 00000000..016abb22 --- /dev/null +++ b/backend/src/main/java/org/raddatz/familienarchiv/dto/GeschichteUpdateDTO.java @@ -0,0 +1,21 @@ +package org.raddatz.familienarchiv.dto; + +import lombok.Data; +import org.raddatz.familienarchiv.model.GeschichteStatus; + +import java.util.List; +import java.util.UUID; + +/** + * Used for both create and update of a Geschichte. All fields are optional; + * the service applies whatever is non-null. {@code body} is rich-text HTML and + * is sanitised against an allow-list before persistence. + */ +@Data +public class GeschichteUpdateDTO { + private String title; + private String body; + private GeschichteStatus status; + private List personIds; + private List documentIds; +} diff --git a/backend/src/main/java/org/raddatz/familienarchiv/repository/GeschichteRepository.java b/backend/src/main/java/org/raddatz/familienarchiv/repository/GeschichteRepository.java new file mode 100644 index 00000000..3d6ffbea --- /dev/null +++ b/backend/src/main/java/org/raddatz/familienarchiv/repository/GeschichteRepository.java @@ -0,0 +1,30 @@ +package org.raddatz.familienarchiv.repository; + +import org.raddatz.familienarchiv.model.Geschichte; +import org.raddatz.familienarchiv.model.GeschichteStatus; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.UUID; + +@Repository +public interface GeschichteRepository extends JpaRepository, JpaSpecificationExecutor { + + @Query(""" + SELECT g FROM Geschichte g + WHERE (:status IS NULL OR g.status = :status) + AND (:personId IS NULL OR :personId IN (SELECT p.id FROM g.persons p)) + AND (:documentId IS NULL OR :documentId IN (SELECT d.id FROM g.documents d)) + ORDER BY COALESCE(g.publishedAt, g.updatedAt) DESC + """) + List search( + @Param("status") GeschichteStatus status, + @Param("personId") UUID personId, + @Param("documentId") UUID documentId, + Pageable pageable); +}