From 8618e520b5ea6d69fd97e5a389fd886325b238ff Mon Sep 17 00:00:00 2001 From: Marcel Date: Mon, 13 Apr 2026 16:25:23 +0200 Subject: [PATCH] fix(ocr): fill empty MANUAL blocks in guided OCR mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When a user draws annotation boxes to mark OCR regions, the blocks are created with source=MANUAL and empty text. upsertGuidedBlock was protecting all MANUAL blocks unconditionally, so guided OCR silently produced no output for these drawn-but-empty blocks. Changed the guard to only protect non-empty MANUAL blocks — empty ones are treated like OCR blocks and get their text filled in. Co-Authored-By: Claude Sonnet 4.6 --- .../service/TranscriptionService.java | 4 ++-- .../TranscriptionServiceGuidedTest.java | 20 ++++++++++++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/backend/src/main/java/org/raddatz/familienarchiv/service/TranscriptionService.java b/backend/src/main/java/org/raddatz/familienarchiv/service/TranscriptionService.java index 69982788..bfb02253 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/service/TranscriptionService.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/service/TranscriptionService.java @@ -104,8 +104,8 @@ public class TranscriptionService { public TranscriptionBlock upsertGuidedBlock(UUID documentId, UUID annotationId, String text, UUID userId) { return blockRepository.findByAnnotationId(annotationId).map(existing -> { - if (existing.getSource() == BlockSource.MANUAL) { - return existing; // never overwrite manual transcription + if (existing.getSource() == BlockSource.MANUAL && !existing.getText().isBlank()) { + return existing; // never overwrite non-empty manual transcription } existing.setText(sanitizeText(text)); existing.setUpdatedBy(userId); diff --git a/backend/src/test/java/org/raddatz/familienarchiv/service/TranscriptionServiceGuidedTest.java b/backend/src/test/java/org/raddatz/familienarchiv/service/TranscriptionServiceGuidedTest.java index afbc90bf..e8d53cad 100644 --- a/backend/src/test/java/org/raddatz/familienarchiv/service/TranscriptionServiceGuidedTest.java +++ b/backend/src/test/java/org/raddatz/familienarchiv/service/TranscriptionServiceGuidedTest.java @@ -74,7 +74,7 @@ class TranscriptionServiceGuidedTest { } @Test - void upsertGuidedBlock_doesNotOverwriteManualBlock() { + void upsertGuidedBlock_doesNotOverwriteNonEmptyManualBlock() { TranscriptionBlock manual = TranscriptionBlock.builder() .id(UUID.randomUUID()) .annotationId(annId) @@ -90,4 +90,22 @@ class TranscriptionServiceGuidedTest { assertThat(result.getText()).isEqualTo("manually written"); verify(blockRepository, never()).save(any()); } + + @Test + void upsertGuidedBlock_fillsEmptyManualBlock_withOcrText() { + TranscriptionBlock emptyManual = TranscriptionBlock.builder() + .id(UUID.randomUUID()) + .annotationId(annId) + .documentId(docId) + .text("") + .source(BlockSource.MANUAL) + .sortOrder(0) + .build(); + when(blockRepository.findByAnnotationId(annId)).thenReturn(Optional.of(emptyManual)); + + TranscriptionBlock result = service.upsertGuidedBlock(docId, annId, "ocr result", userId); + + assertThat(result.getText()).isEqualTo("ocr result"); + verify(blockRepository).save(any()); + } }