feat(stats): add a reading history of every finished read

Add a History page listing every read newest first, rereads included, as a
virtualized ledger or month cover walls, with period totals, per-read ratings,
export and a share image. Deleting a book keeps its finished reads under a
title and author snapshot (migration 0128).

Closes #1630
This commit is contained in:
neon
2026-10-22 14:45:09 +00:00
parent d21c68d13c
commit 1c593d7403
75 changed files with 31742 additions and 75 deletions
+23
View File
@@ -619,6 +619,29 @@ export const E2E_SUITES = Object.freeze({
...SHARED_DB_AND_HELPER_PATHS,
],
},
"reading-history": {
id: "reading-history",
name: "Reading History",
timeout: 120,
lane: "full",
description: "Reading history ordering, rereads, ratings, deleted-book retention and ownership suite",
vitestTarget: "test/reading-history.e2e-spec.ts",
junitOutput: `${TEST_RESULTS_DIR}/reading-history-e2e-junit.xml`,
prepareDedicatedDatabase: true,
useDedicatedDatabase: true,
changedPaths: [
"server/src/modules/reading-history/**",
"server/src/modules/user-book-status/**",
"server/src/modules/dashboard/**",
"server/src/db/reading-attempt-retention.ts",
"server/src/db/book-file-hash-history.ts",
"server/test/reading-history.e2e-spec.ts",
"server/test/e2e/**",
".github/workflows/e2e-runner.yml",
"packages/types/src/reading-history.ts",
...SHARED_DB_AND_HELPER_PATHS,
],
},
"book-api-contract": {
id: "book-api-contract",
name: "Book API Contract",