From 7f6380452f1a6c7ce3620e973ed3da48795b29f2 Mon Sep 17 00:00:00 2001 From: Marcel Date: Sun, 19 Apr 2026 19:40:48 +0200 Subject: [PATCH] fix(dashboard): include ANNOTATION_CREATED in hero resume query MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit findMostRecentDocumentIdByActor only matched TEXT_SAVED events, so documents where the user drew annotation bounding boxes (but typed no transcription text) were invisible to the hero resume card. Extending the IN clause to include ANNOTATION_CREATED lets annotation-only work surface in the card (0% progress, no excerpt — the correct state before transcription begins). Co-Authored-By: Claude Sonnet 4.6 --- .../dashboard/AuditLogQueryRepository.java | 2 +- ...uditLogQueryRepositoryIntegrationTest.java | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 backend/src/test/java/org/raddatz/familienarchiv/dashboard/AuditLogQueryRepositoryIntegrationTest.java diff --git a/backend/src/main/java/org/raddatz/familienarchiv/dashboard/AuditLogQueryRepository.java b/backend/src/main/java/org/raddatz/familienarchiv/dashboard/AuditLogQueryRepository.java index 138db595..3a2d186c 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/dashboard/AuditLogQueryRepository.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/dashboard/AuditLogQueryRepository.java @@ -15,7 +15,7 @@ public interface AuditLogQueryRepository extends JpaRepository { @Query(value = """ SELECT a.document_id FROM audit_log a - WHERE a.kind = 'TEXT_SAVED' + WHERE a.kind IN ('TEXT_SAVED', 'ANNOTATION_CREATED') AND a.actor_id = :userId AND a.document_id IS NOT NULL ORDER BY a.happened_at DESC diff --git a/backend/src/test/java/org/raddatz/familienarchiv/dashboard/AuditLogQueryRepositoryIntegrationTest.java b/backend/src/test/java/org/raddatz/familienarchiv/dashboard/AuditLogQueryRepositoryIntegrationTest.java new file mode 100644 index 00000000..0e0f7e6a --- /dev/null +++ b/backend/src/test/java/org/raddatz/familienarchiv/dashboard/AuditLogQueryRepositoryIntegrationTest.java @@ -0,0 +1,38 @@ +package org.raddatz.familienarchiv.dashboard; + +import org.junit.jupiter.api.Test; +import org.raddatz.familienarchiv.PostgresContainerConfig; +import org.raddatz.familienarchiv.config.FlywayConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest; +import org.springframework.boot.jdbc.test.autoconfigure.AutoConfigureTestDatabase; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.jdbc.Sql; + +import java.util.Optional; +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataJpaTest +@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) +@Import({PostgresContainerConfig.class, FlywayConfig.class}) +class AuditLogQueryRepositoryIntegrationTest { + + static final UUID USER_ID = UUID.fromString("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"); + static final UUID DOC_ID = UUID.fromString("bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"); + + @Autowired AuditLogQueryRepository auditLogQueryRepository; + + @Test + @Sql(statements = { + "INSERT INTO users (id, enabled, email, password) VALUES ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', true, 'testuser@test.com', 'pw')", + "INSERT INTO documents (id, title, original_filename, status) VALUES ('bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', 'Test Doc', 'test.pdf', 'PLACEHOLDER')", + "INSERT INTO audit_log (kind, actor_id, document_id) VALUES ('ANNOTATION_CREATED', 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb')" + }) + void findMostRecentDocumentIdByActor_returns_document_with_annotation_only_events() { + Optional result = auditLogQueryRepository.findMostRecentDocumentIdByActor(USER_ID); + + assertThat(result).contains(DOC_ID); + } +}