From adea7d498fb2e12ace95585fa0666f340fc03fa3 Mon Sep 17 00:00:00 2001 From: Marcel Date: Thu, 16 Apr 2026 12:09:09 +0200 Subject: [PATCH] fix(#240): add @Schema(requiredMode=REQUIRED) to both queue DTOs; add V37 indexes All non-null DTO fields are now marked required so the generated api.ts emits required (non-optional) types for callers. V37 migration adds created_at/updated_at indexes on document_annotations and transcription_blocks to avoid full table scans in the weekly stats correlated subqueries. Co-Authored-By: Claude Sonnet 4.6 --- .../dto/TranscriptionQueueItemDTO.java | 12 +++++++----- .../dto/TranscriptionWeeklyStatsDTO.java | 8 +++++--- .../V37__add_transcription_queue_indexes.sql | 6 ++++++ 3 files changed, 18 insertions(+), 8 deletions(-) create mode 100644 backend/src/main/resources/db/migration/V37__add_transcription_queue_indexes.sql diff --git a/backend/src/main/java/org/raddatz/familienarchiv/dto/TranscriptionQueueItemDTO.java b/backend/src/main/java/org/raddatz/familienarchiv/dto/TranscriptionQueueItemDTO.java index f577b32b..833c047b 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/dto/TranscriptionQueueItemDTO.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/dto/TranscriptionQueueItemDTO.java @@ -1,5 +1,7 @@ package org.raddatz.familienarchiv.dto; +import io.swagger.v3.oas.annotations.media.Schema; + import java.time.LocalDate; import java.util.UUID; @@ -9,10 +11,10 @@ import java.util.UUID; * in the Transkription column and the percentage label in Lesefertig. */ public record TranscriptionQueueItemDTO( - UUID id, - String title, + @Schema(requiredMode = Schema.RequiredMode.REQUIRED) UUID id, + @Schema(requiredMode = Schema.RequiredMode.REQUIRED) String title, LocalDate documentDate, - int annotationCount, - int textedBlockCount, - int reviewedBlockCount + @Schema(requiredMode = Schema.RequiredMode.REQUIRED) int annotationCount, + @Schema(requiredMode = Schema.RequiredMode.REQUIRED) int textedBlockCount, + @Schema(requiredMode = Schema.RequiredMode.REQUIRED) int reviewedBlockCount ) {} diff --git a/backend/src/main/java/org/raddatz/familienarchiv/dto/TranscriptionWeeklyStatsDTO.java b/backend/src/main/java/org/raddatz/familienarchiv/dto/TranscriptionWeeklyStatsDTO.java index 71e9fc71..99392a1f 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/dto/TranscriptionWeeklyStatsDTO.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/dto/TranscriptionWeeklyStatsDTO.java @@ -1,12 +1,14 @@ package org.raddatz.familienarchiv.dto; +import io.swagger.v3.oas.annotations.media.Schema; + /** * Weekly activity pulse for the Mission Control Strip column headers. * Counts documents that received new work in each pipeline stage * during the last 7 days. */ public record TranscriptionWeeklyStatsDTO( - long segmentationCount, - long transcriptionCount, - long readyCount + @Schema(requiredMode = Schema.RequiredMode.REQUIRED) long segmentationCount, + @Schema(requiredMode = Schema.RequiredMode.REQUIRED) long transcriptionCount, + @Schema(requiredMode = Schema.RequiredMode.REQUIRED) long readyCount ) {} diff --git a/backend/src/main/resources/db/migration/V37__add_transcription_queue_indexes.sql b/backend/src/main/resources/db/migration/V37__add_transcription_queue_indexes.sql new file mode 100644 index 00000000..48e142bd --- /dev/null +++ b/backend/src/main/resources/db/migration/V37__add_transcription_queue_indexes.sql @@ -0,0 +1,6 @@ +-- Indexes to support the weekly stats correlated subqueries in findWeeklyStats(). +-- Without these, COUNT(DISTINCT ...) with a date range filter performs a full table scan +-- on every dashboard load. +CREATE INDEX IF NOT EXISTS idx_document_annotations_created_at ON document_annotations(created_at); +CREATE INDEX IF NOT EXISTS idx_transcription_blocks_created_at ON transcription_blocks(created_at); +CREATE INDEX IF NOT EXISTS idx_transcription_blocks_updated_at ON transcription_blocks(updated_at);