diff --git a/backend/src/main/java/org/raddatz/familienarchiv/audit/ActivityFeedRow.java b/backend/src/main/java/org/raddatz/familienarchiv/audit/ActivityFeedRow.java index d6b1f899..75964db4 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/audit/ActivityFeedRow.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/audit/ActivityFeedRow.java @@ -15,4 +15,6 @@ public interface ActivityFeedRow { boolean isYouParticipated(); int getCount(); Instant getHappenedAtUntil(); + /** Present only for COMMENT_ADDED and MENTION_CREATED — null otherwise. */ + UUID getCommentId(); } diff --git a/backend/src/main/java/org/raddatz/familienarchiv/audit/AuditLogQueryRepository.java b/backend/src/main/java/org/raddatz/familienarchiv/audit/AuditLogQueryRepository.java index 49c998e2..9c0957b8 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/audit/AuditLogQueryRepository.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/audit/AuditLogQueryRepository.java @@ -99,7 +99,8 @@ public interface AuditLogQueryRepository extends JpaRepository { AND n.reference_id = (ag.payload->>'commentId')::uuid ) AS youParticipated, ag.count AS count, - ag.happened_at_until AS happenedAtUntil + ag.happened_at_until AS happenedAtUntil, + (ag.payload->>'commentId')::uuid AS commentId FROM aggregated ag LEFT JOIN users u ON u.id = ag.actor_id ORDER BY ag.happened_at DESC diff --git a/backend/src/test/java/org/raddatz/familienarchiv/dashboard/AuditLogQueryRepositoryRolledUpTest.java b/backend/src/test/java/org/raddatz/familienarchiv/dashboard/AuditLogQueryRepositoryRolledUpTest.java index 626903b4..02e66943 100644 --- a/backend/src/test/java/org/raddatz/familienarchiv/dashboard/AuditLogQueryRepositoryRolledUpTest.java +++ b/backend/src/test/java/org/raddatz/familienarchiv/dashboard/AuditLogQueryRepositoryRolledUpTest.java @@ -271,6 +271,45 @@ class AuditLogQueryRepositoryRolledUpTest { ); } + @Test + void rolledUpFeed_exposes_commentId_for_COMMENT_ADDED_events() { + insertUserAndDocs(); + UUID commentId = UUID.randomUUID(); + insertAuditEvent(USER_ID, DOC_ID, "COMMENT_ADDED", + Instant.parse("2026-04-20T10:00:00Z"), Map.of("commentId", commentId.toString())); + + List rows = auditLogQueryRepository.findRolledUpActivityFeed(USER_ID.toString(), 40); + + assertThat(rows).hasSize(1); + assertThat(rows.get(0).getCommentId()).isEqualTo(commentId); + } + + @Test + void rolledUpFeed_exposes_commentId_for_MENTION_CREATED_events() { + insertUserAndDocs(); + UUID commentId = UUID.randomUUID(); + insertAuditEvent(OTHER_USER_ID, DOC_ID, "MENTION_CREATED", + Instant.parse("2026-04-20T10:00:00Z"), + Map.of("commentId", commentId.toString(), "mentionedUserId", USER_ID.toString())); + + List rows = auditLogQueryRepository.findRolledUpActivityFeed(USER_ID.toString(), 40); + + assertThat(rows).hasSize(1); + assertThat(rows.get(0).getCommentId()).isEqualTo(commentId); + } + + @Test + void rolledUpFeed_commentId_is_null_for_non_comment_kinds() { + insertUserAndDocs(); + insertAuditEvent(USER_ID, DOC_ID, "TEXT_SAVED", + Instant.parse("2026-04-20T10:00:00Z"), Map.of("blockId", "ccc", "pageNumber", "1")); + + List rows = auditLogQueryRepository.findRolledUpActivityFeed(USER_ID.toString(), 40); + + assertThat(rows).hasSize(1); + assertThat(rows.get(0).getCommentId()).isNull(); + } + @Test void youMentioned_is_false_when_mention_created_payload_targets_different_user() { insertUserAndDocs(); diff --git a/backend/src/test/java/org/raddatz/familienarchiv/dashboard/DashboardServiceTest.java b/backend/src/test/java/org/raddatz/familienarchiv/dashboard/DashboardServiceTest.java index 30a163d1..700b6fca 100644 --- a/backend/src/test/java/org/raddatz/familienarchiv/dashboard/DashboardServiceTest.java +++ b/backend/src/test/java/org/raddatz/familienarchiv/dashboard/DashboardServiceTest.java @@ -107,6 +107,7 @@ class DashboardServiceTest { public boolean isYouParticipated() { return false; } public int getCount() { return 1; } public Instant getHappenedAtUntil() { return null; } + public UUID getCommentId() { return null; } }; } }