new_chapters_count over-counted when scanlations share a chapter number ((manga_id, number) is non-unique, migration 0013): COUNT(*) tallied rows, so duplicate-numbered chapters inflated the badge. Switch both the list and per-manga read-progress queries to COUNT(DISTINCT number), and drop the dead COALESCE (an empty set counts as 0, and the NULL-number case is handled by the predicate). Fix the misleading comment. Expose new_chapters_count on GET /me/read-progress/:manga_id and drive the detail page's "N new" badge from it, instead of recomputing over the paginated chapter list — which under-counted series past 50 chapters and disagreed with the homepage shelf. Read markers stay client-side over the loaded chapters and are documented as by-number (all we persist). Adds duplicate-scanlation tests at both endpoints. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
18 lines
841 B
TypeScript
18 lines
841 B
TypeScript
// Pure helper for reflecting a reader's personal progress on a manga's
|
|
// chapter list. Kept UI-free so the read/unread logic is unit-testable
|
|
// without rendering the detail page.
|
|
|
|
/**
|
|
* A chapter counts as read once its number is at or before the reader's
|
|
* last-read chapter number. An unknown last-read position (guest, never
|
|
* opened, or a deleted chapter) marks nothing — we never guess.
|
|
*/
|
|
export function isChapterRead(chapterNumber: number, lastReadNumber: number | null): boolean {
|
|
return lastReadNumber != null && chapterNumber <= lastReadNumber;
|
|
}
|
|
|
|
// Note: the "new since last read" *count* is computed server-side
|
|
// (distinct chapter numbers over ALL chapters — see
|
|
// repo::read_progress) and delivered on the read-progress payloads, so it
|
|
// isn't recomputed here over the detail page's paginated chapter list.
|