From 8ac996f6b2528c012194fc03f738b035aa4d3511 Mon Sep 17 00:00:00 2001 From: Marcel Date: Thu, 23 Apr 2026 14:15:28 +0200 Subject: [PATCH] feat(documents): expose thumbnailAspect + pageCount on Document entity Adds ThumbnailAspect enum (PORTRAIT | LANDSCAPE) and maps the two nullable columns from V53 as JPA fields so ThumbnailService can populate them and the API can return them unchanged to the frontend. Refs #305 Co-Authored-By: Claude Opus 4.7 --- .../familienarchiv/model/Document.java | 7 ++++ .../familienarchiv/model/ThumbnailAspect.java | 6 ++++ .../repository/DocumentRepositoryTest.java | 35 +++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 backend/src/main/java/org/raddatz/familienarchiv/model/ThumbnailAspect.java diff --git a/backend/src/main/java/org/raddatz/familienarchiv/model/Document.java b/backend/src/main/java/org/raddatz/familienarchiv/model/Document.java index d2cea5da..dc66fb5d 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/model/Document.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/model/Document.java @@ -50,6 +50,13 @@ public class Document { @Column(name = "thumbnail_generated_at") private LocalDateTime thumbnailGeneratedAt; + @Enumerated(EnumType.STRING) + @Column(name = "thumbnail_aspect", length = 16) + private ThumbnailAspect thumbnailAspect; + + @Column(name = "page_count") + private Integer pageCount; + // Originaler Dateiname beim Upload (z.B. "Brief_Oma_1940.pdf") @Column(name = "original_filename", nullable = false) @Schema(requiredMode = Schema.RequiredMode.REQUIRED) diff --git a/backend/src/main/java/org/raddatz/familienarchiv/model/ThumbnailAspect.java b/backend/src/main/java/org/raddatz/familienarchiv/model/ThumbnailAspect.java new file mode 100644 index 00000000..630247fd --- /dev/null +++ b/backend/src/main/java/org/raddatz/familienarchiv/model/ThumbnailAspect.java @@ -0,0 +1,6 @@ +package org.raddatz.familienarchiv.model; + +public enum ThumbnailAspect { + PORTRAIT, + LANDSCAPE +} diff --git a/backend/src/test/java/org/raddatz/familienarchiv/repository/DocumentRepositoryTest.java b/backend/src/test/java/org/raddatz/familienarchiv/repository/DocumentRepositoryTest.java index 8d12a678..28728bb7 100644 --- a/backend/src/test/java/org/raddatz/familienarchiv/repository/DocumentRepositoryTest.java +++ b/backend/src/test/java/org/raddatz/familienarchiv/repository/DocumentRepositoryTest.java @@ -8,6 +8,7 @@ import org.raddatz.familienarchiv.model.DocumentAnnotation; import org.raddatz.familienarchiv.model.DocumentStatus; import org.raddatz.familienarchiv.model.Person; import org.raddatz.familienarchiv.model.Tag; +import org.raddatz.familienarchiv.model.ThumbnailAspect; import org.raddatz.familienarchiv.model.TranscriptionBlock; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.jdbc.test.autoconfigure.AutoConfigureTestDatabase; @@ -65,6 +66,40 @@ class DocumentRepositoryTest { assertThat(found.get().getStatus()).isEqualTo(DocumentStatus.PLACEHOLDER); } + // ─── thumbnailAspect + pageCount round-trip ─────────────────────────────── + + @Test + void save_persistsThumbnailAspectAndPageCount() { + Document document = Document.builder() + .title("Mit Aspekt") + .originalFilename("aspect.pdf") + .status(DocumentStatus.UPLOADED) + .thumbnailAspect(ThumbnailAspect.LANDSCAPE) + .pageCount(7) + .build(); + + Document saved = documentRepository.save(document); + Document found = documentRepository.findById(saved.getId()).orElseThrow(); + + assertThat(found.getThumbnailAspect()).isEqualTo(ThumbnailAspect.LANDSCAPE); + assertThat(found.getPageCount()).isEqualTo(7); + } + + @Test + void save_thumbnailAspectAndPageCount_defaultToNull() { + Document document = Document.builder() + .title("Ohne Aspekt") + .originalFilename("no_aspect.pdf") + .status(DocumentStatus.PLACEHOLDER) + .build(); + + Document saved = documentRepository.save(document); + Document found = documentRepository.findById(saved.getId()).orElseThrow(); + + assertThat(found.getThumbnailAspect()).isNull(); + assertThat(found.getPageCount()).isNull(); + } + // ─── findByStatus ───────────────────────────────────────────────────────── @Test