fix(crawler): scope chapter_sources lookup per-manga (0.35.5)
chapter_sources's PRIMARY KEY was (source_id, source_chapter_key) and the lookup in sync_manga_chapters didn't constrain by manga_id, so a source whose chapter slugs aren't globally unique (e.g. "chapter-1" appearing under multiple mangas) silently attributed every collision to the first manga that synced it. The INSERT path would have conflicted on the second manga's sync. Migration 0017 drops the old PK and rekeys on (source_id, chapter_id) — the natural identity of a per-source chapter attachment — and adds an index on (source_id, source_chapter_key) for the lookup path. The repo lookup now joins chapters and filters by manga_id; the UPDATE path keys on chapter_id directly (the row's natural identifier post-migration). Test sync_chapters_isolates_colliding_keys_across_mangas pins the contract end-to-end. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
20
backend/migrations/0017_chapter_sources_per_manga.sql
Normal file
20
backend/migrations/0017_chapter_sources_per_manga.sql
Normal file
@@ -0,0 +1,20 @@
|
||||
-- chapter_sources: drop the global (source_id, source_chapter_key) PK
|
||||
-- and rekey on (source_id, chapter_id).
|
||||
--
|
||||
-- The old PK assumed chapter slugs are unique per source. Sources whose
|
||||
-- chapter naming is per-manga (chapter-1, chapter-2, ...) instead of per-
|
||||
-- catalog (br_chapter-379272 with a global counter) would collide on the
|
||||
-- second manga: the INSERT would conflict on (source_id, "chapter-1") and
|
||||
-- the lookup would attribute the row to the first manga's chapter_id.
|
||||
--
|
||||
-- The new key is the natural identity of a source attachment: "this source
|
||||
-- has this chapter". An (source_id, source_chapter_key) index preserves
|
||||
-- the lookup path (find existing source row by source's identifier) but
|
||||
-- no longer enforces uniqueness — the application combines it with the
|
||||
-- chapters table's manga_id to scope the lookup per-manga.
|
||||
|
||||
ALTER TABLE chapter_sources DROP CONSTRAINT chapter_sources_pkey;
|
||||
ALTER TABLE chapter_sources ADD PRIMARY KEY (source_id, chapter_id);
|
||||
|
||||
CREATE INDEX chapter_sources_source_key_idx
|
||||
ON chapter_sources (source_id, source_chapter_key);
|
||||
Reference in New Issue
Block a user