feat(reader): continue a comic series from the last page

Finishing an issue offered no way onward, so the next one had to be opened from the library.
Resolve the next readable book server-side with one keyset query, offer it on the last page, and
let an opt-in setting cross over on a further page turn. The reader route now remounts on a param
change, without which it would keep rendering the book it was mounted with.

Also cast the compared value in compareSeriesIndexSql: as a bare parameter Postgres could not type
it inside the null test and rejected the statement.

Closes #998
This commit is contained in:
neon
2026-08-25 04:26:31 +00:00
parent 6702d5b729
commit 63d4dc3bb4
28 changed files with 982 additions and 12 deletions
+19
View File
@@ -285,6 +285,25 @@ export const E2E_SUITES = Object.freeze({
...SHARED_DB_AND_HELPER_PATHS,
],
},
"series-next-book": {
id: "series-next-book",
name: "Series Next Book",
timeout: 60,
lane: "full",
description: "Series next-readable-book resolution suite",
vitestTarget: "test/series-next-book.e2e-spec.ts",
junitOutput: `${TEST_RESULTS_DIR}/series-next-book-e2e-junit.xml`,
prepareDedicatedDatabase: true,
useDedicatedDatabase: true,
changedPaths: [
"server/src/modules/series/**",
"server/test/series-next-book.e2e-spec.ts",
"server/test/e2e/authorization-matrix/**",
".github/workflows/e2e-runner.yml",
"packages/types/src/series.ts",
...SHARED_DB_AND_HELPER_PATHS,
],
},
"reading-attempts": {
id: "reading-attempts",
name: "Reading Attempts",