feat(series): TagService.merge repoints series_page.series_tag_id

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-16 23:36:04 -04:00
parent d8e585a76e
commit a9e7ee9ba9
2 changed files with 29 additions and 0 deletions
+12
View File
@@ -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:
+17
View File
@@ -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