diff --git a/app/db/adapters/subscription.py b/app/db/adapters/subscription.py index 131512306..8436d00ce 100644 --- a/app/db/adapters/subscription.py +++ b/app/db/adapters/subscription.py @@ -600,6 +600,16 @@ class SessionSubscriptionRepository: """同步按可选状态读取订阅快照。""" return [_project_subscription(record) for record in self._sync_repository().list(state)] + def list_by_media_identity( + self, + media_source: MediaSource, + media_id: str, + music_type: Optional[str] = None, + ) -> builtins.list[SubscriptionSnapshot]: + """同步按规范媒体身份读取订阅快照。""" + records = self._sync_repository().list_by_media_identity(media_source, media_id, music_type) + return [_project_subscription(record) for record in records] + async def async_get(self, subscribe_id: int) -> Optional[SubscriptionSnapshot]: """异步按主键读取订阅快照。""" record = await self._async_repository().async_get(subscribe_id) diff --git a/tests/test_subscription_repository.py b/tests/test_subscription_repository.py index 0fccb2431..fc367795f 100644 --- a/tests/test_subscription_repository.py +++ b/tests/test_subscription_repository.py @@ -7,6 +7,7 @@ from sqlalchemy import func, select from sqlalchemy.ext.asyncio import AsyncSession from app.api.context import get_sync_subscription_repository +from app.application.servarr import ServarrSubscriptionService from app.application.subscription.complete import CompleteSubscriptionCommand from app.application.subscription.contract import ( SubscriptionIdentity, @@ -84,6 +85,36 @@ def test_sync_api_repository_dependency_binds_sync_session(db) -> None: assert repository.get(-1) is None +def test_servarr_sync_lookup_reads_session_repository(db) -> None: + """Servarr 同步 lookup 应从请求级订阅仓储读取媒体身份投影。""" + row = db.add( + Subscribe( + name="同步 lookup 订阅", + type=MediaType.MOVIE.value, + media_source=MediaSource.TMDB.value, + media_id="550", + ) + ) + db.add( + Subscribe( + name="其他媒体", + type=MediaType.MOVIE.value, + media_source=MediaSource.TMDB.value, + media_id="551", + ) + ) + + repository = SessionSubscriptionRepository(db.session) + service = ServarrSubscriptionService( + async_repository=repository, + sync_repository=repository, + ) + + result = service.list_by_media_identity_sync(MediaSource.TMDB, "550") + + assert [(item.id, item.name, item.media_id) for item in result] == [(row.id, "同步 lookup 订阅", "550")] + + def test_session_repository_leaves_commit_and_rollback_to_caller(db) -> None: """请求级仓储只 flush 暂存记录,调用方回滚后数据库不保留该记录。""" db.watermark(Subscribe)