feat(geschichte): carry updatedAt in GeschichteSummary projection
The reader dashboard renders 'bearbeitet vor X' from updatedAt, but the summary projection dropped the field when the list endpoint moved off the entity — drafts have no publishedAt to fall back on. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -25,7 +25,7 @@ public interface GeschichteRepository extends JpaRepository<Geschichte, UUID>, J
|
|||||||
*/
|
*/
|
||||||
@Query("""
|
@Query("""
|
||||||
SELECT g.id AS id, g.title AS title, g.status AS status, g.type AS type,
|
SELECT g.id AS id, g.title AS title, g.status AS status, g.type AS type,
|
||||||
g.author AS author, g.publishedAt AS publishedAt, g.body AS body
|
g.author AS author, g.publishedAt AS publishedAt, g.updatedAt AS updatedAt, g.body AS body
|
||||||
FROM Geschichte g
|
FROM Geschichte g
|
||||||
WHERE g.status = :effectiveStatus
|
WHERE g.status = :effectiveStatus
|
||||||
AND (:authorId IS NULL OR g.author.id = :authorId)
|
AND (:authorId IS NULL OR g.author.id = :authorId)
|
||||||
|
|||||||
@@ -31,6 +31,10 @@ public interface GeschichteSummary {
|
|||||||
|
|
||||||
LocalDateTime getPublishedAt();
|
LocalDateTime getPublishedAt();
|
||||||
|
|
||||||
|
/** Always set (@UpdateTimestamp) — drives "bearbeitet vor X" on dashboard cards. */
|
||||||
|
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
LocalDateTime getUpdatedAt();
|
||||||
|
|
||||||
String getBody();
|
String getBody();
|
||||||
|
|
||||||
interface AuthorSummary {
|
interface AuthorSummary {
|
||||||
|
|||||||
@@ -401,6 +401,7 @@ class GeschichteControllerTest {
|
|||||||
public GeschichteType getType() { return GeschichteType.STORY; }
|
public GeschichteType getType() { return GeschichteType.STORY; }
|
||||||
public AuthorSummary getAuthor() { return null; }
|
public AuthorSummary getAuthor() { return null; }
|
||||||
public LocalDateTime getPublishedAt() { return LocalDateTime.now(); }
|
public LocalDateTime getPublishedAt() { return LocalDateTime.now(); }
|
||||||
|
public LocalDateTime getUpdatedAt() { return LocalDateTime.now(); }
|
||||||
public String getBody() { return null; }
|
public String getBody() { return null; }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,6 +61,19 @@ class GeschichteListProjectionTest {
|
|||||||
assertThat(result.get(0).getTitle()).isEqualTo("Veröffentlicht");
|
assertThat(result.get(0).getTitle()).isEqualTo("Veröffentlicht");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void findSummaries_carries_updatedAt_for_dashboard_relative_times() {
|
||||||
|
// ReaderDraftsModule renders "bearbeitet vor X" from updatedAt — the
|
||||||
|
// projection must carry it for drafts, where publishedAt is null.
|
||||||
|
geschichteRepository.save(draft("Mein Entwurf", author));
|
||||||
|
|
||||||
|
List<GeschichteSummary> result = geschichteRepository.findSummaries(
|
||||||
|
GeschichteStatus.DRAFT, author.getId(), sentinel(), 0, null);
|
||||||
|
|
||||||
|
assertThat(result).hasSize(1);
|
||||||
|
assertThat(result.get(0).getUpdatedAt()).isNotNull();
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void findSummaries_returns_empty_list_when_no_published_geschichten_exist() {
|
void findSummaries_returns_empty_list_when_no_published_geschichten_exist() {
|
||||||
geschichteRepository.save(draft("Nur Entwurf", author));
|
geschichteRepository.save(draft("Nur Entwurf", author));
|
||||||
|
|||||||
Reference in New Issue
Block a user