mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-10-31 12:24:39 +08:00
85 lines
2.7 KiB
Python
85 lines
2.7 KiB
Python
"""
|
|
站点领域的请求级 command/query 依赖。
|
|
"""
|
|
|
|
from typing import Any, cast
|
|
|
|
from fastapi import Depends
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.api.context import get_async_session, get_host_runtime
|
|
from app.application.site.contract import SiteQueryPort, SiteStagingPort
|
|
from app.application.site.mutation import SiteMutationCommand
|
|
from app.application.site.query import SiteQueryService
|
|
|
|
# 站点目录由外部资源加载,静态检查无法解析其动态导出。
|
|
from app.application.site.sites import SitesHelper # pylint: disable=import-error,no-name-in-module
|
|
from app.domain import site as site_rules
|
|
from app.foundation import url as url_tools
|
|
from app.runtime.events import eventmanager
|
|
from app.schemas.types import EventType
|
|
from app.startup.composition.context import HostRuntime
|
|
|
|
|
|
async def _publish_site_updated(payload: dict[str, Any]) -> None:
|
|
"""
|
|
发布已提交的站点更新事件。
|
|
"""
|
|
await eventmanager.async_send_event(EventType.SiteUpdated, payload)
|
|
|
|
|
|
async def _publish_site_deleted(payload: dict[str, Any]) -> None:
|
|
"""
|
|
发布已提交的站点删除事件。
|
|
"""
|
|
await eventmanager.async_send_event(EventType.SiteDeleted, payload)
|
|
|
|
|
|
def get_site_mutation_command(
|
|
db: AsyncSession = Depends(get_async_session),
|
|
runtime: HostRuntime = Depends(get_host_runtime),
|
|
) -> SiteMutationCommand:
|
|
"""
|
|
组装请求级站点写用例及其事务和外部目录依赖。
|
|
"""
|
|
sites_helper = SitesHelper()
|
|
|
|
def normalize_url(value: str) -> str:
|
|
"""
|
|
沿用站点接口的 scheme/netloc 规范化格式。
|
|
"""
|
|
scheme, netloc = url_tools.split_netloc(value)
|
|
return f"{scheme}://{netloc}/"
|
|
|
|
return SiteMutationCommand(
|
|
repository=cast(SiteStagingPort, runtime.site.repository(db)),
|
|
unit_of_work=runtime.persistence.async_transaction(db),
|
|
auth_level_provider=lambda: sites_helper.auth_level,
|
|
indexer_loader=sites_helper.async_get_indexer,
|
|
domain_extractor=site_rules.extract_domain,
|
|
url_normalizer=normalize_url,
|
|
publish_updated=_publish_site_updated,
|
|
publish_deleted=_publish_site_deleted,
|
|
)
|
|
|
|
|
|
def get_site_query_service(
|
|
db: AsyncSession = Depends(get_async_session),
|
|
runtime: HostRuntime = Depends(get_host_runtime),
|
|
) -> SiteQueryService:
|
|
"""
|
|
组装站点异步查询服务。
|
|
"""
|
|
return SiteQueryService(
|
|
repository=cast(SiteQueryPort, runtime.site.repository(db))
|
|
)
|
|
|
|
|
|
def get_site_sync_query_service(
|
|
runtime: HostRuntime = Depends(get_host_runtime),
|
|
) -> SiteQueryService:
|
|
"""
|
|
组装站点同步查询服务,用于同步 Chain 路由。
|
|
"""
|
|
return SiteQueryService(repository=runtime.site.standalone)
|