diff --git a/backend/app/services/tag_service.py b/backend/app/services/tag_service.py index 4db30c8..da9e499 100644 --- a/backend/app/services/tag_service.py +++ b/backend/app/services/tag_service.py @@ -307,6 +307,7 @@ class TagService: await self._repoint_fandom_children( source_id, target_id, source_kind ) + await self._repoint_series_pages(source_id, target_id) alias_created = False if keep_as_alias: @@ -400,6 +401,17 @@ class TagService: .values(canonical_tag_id=tgt) ) + async def _repoint_series_pages(self, src: int, tgt: int) -> None: + from ..models.series_page import SeriesPage + + # image_id is UNIQUE across series_page and src != tgt, so an + # image in src's series cannot already be in tgt's — no collision. + await self.session.execute( + update(SeriesPage) + .where(SeriesPage.series_tag_id == src) + .values(series_tag_id=tgt) + ) + async def _repoint_fandom_children( self, src: int, tgt: int, src_kind: TagKind ) -> None: diff --git a/tests/test_tag_merge.py b/tests/test_tag_merge.py index 687f28f..50a839c 100644 --- a/tests/test_tag_merge.py +++ b/tests/test_tag_merge.py @@ -410,3 +410,20 @@ async def test_alias_create_does_not_clobber_existing(db): ) ) assert cid == other.id # pre-existing alias untouched + + +@pytest.mark.asyncio +async def test_merge_repoints_series_pages(db): + from backend.app.models.series_page import SeriesPage + + svc = TagService(db) + a = await svc.find_or_create("SerA", TagKind.series) + b = await svc.find_or_create("SerB", TagKind.series) + img = await _img(db) + db.add(SeriesPage(series_tag_id=a.id, image_id=img, page_number=1)) + await db.flush() + await svc.merge(a.id, b.id) + owner = await db.scalar( + select(SeriesPage.series_tag_id).where(SeriesPage.image_id == img) + ) + assert owner == b.id