mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-08-29 12:06:51 +08:00
113 lines
3.5 KiB
Python
113 lines
3.5 KiB
Python
"""系统配置应用服务与组合根注入点。"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from collections.abc import Callable
|
|
from dataclasses import dataclass
|
|
from typing import Any, Protocol
|
|
|
|
|
|
class SystemConfigReader(Protocol):
|
|
"""持久化用户配置的最小只读端口。"""
|
|
|
|
def get(self, key: Any = None) -> Any:
|
|
"""读取配置。"""
|
|
|
|
async def async_get(self, key: Any = None) -> Any:
|
|
"""异步读取配置。"""
|
|
|
|
|
|
class SystemConfigWriter(Protocol):
|
|
"""持久化用户配置的最小写入端口。"""
|
|
|
|
def set(self, key: Any, value: Any) -> bool | None:
|
|
"""写入配置。"""
|
|
|
|
async def async_set(self, key: Any, value: Any) -> bool | None:
|
|
"""异步写入配置。"""
|
|
|
|
def delete(self, key: Any) -> Any:
|
|
"""删除配置。"""
|
|
|
|
|
|
class ConfigurationRepository(SystemConfigReader, SystemConfigWriter, Protocol):
|
|
"""兼容同时提供读写能力的旧配置仓储。"""
|
|
|
|
|
|
@dataclass(frozen=True, slots=True)
|
|
class TransferRetryConfig:
|
|
"""整理失败重试用例在一次调用中使用的稳定配置快照。"""
|
|
|
|
max_failed_retries: Any
|
|
|
|
|
|
class SystemConfigService:
|
|
"""系统配置读写应用服务。"""
|
|
|
|
def __init__(
|
|
self,
|
|
repository: ConfigurationRepository | None = None,
|
|
*,
|
|
reader: SystemConfigReader | None = None,
|
|
writer: SystemConfigWriter | None = None,
|
|
) -> None:
|
|
"""注入可分离的读写端口,并兼容旧的单仓储装配参数。"""
|
|
resolved_reader = reader or repository
|
|
resolved_writer = writer or repository
|
|
if resolved_reader is None or resolved_writer is None:
|
|
raise ValueError("系统配置服务必须同时提供 reader 与 writer")
|
|
self._reader = resolved_reader
|
|
self._writer = resolved_writer
|
|
|
|
def get(self, key: Any = None) -> Any:
|
|
"""读取配置。"""
|
|
return self._reader.get(key)
|
|
|
|
def set(self, key: Any, value: Any) -> bool | None:
|
|
"""写入配置。"""
|
|
return self._writer.set(key, value)
|
|
|
|
async def async_get(self, key: Any = None) -> Any:
|
|
"""异步读取配置。"""
|
|
return await self._reader.async_get(key)
|
|
|
|
async def async_set(self, key: Any, value: Any) -> bool | None:
|
|
"""异步写入配置。"""
|
|
return await self._writer.async_set(key, value)
|
|
|
|
def delete(self, key: Any) -> Any:
|
|
"""删除配置。"""
|
|
return self._writer.delete(key)
|
|
|
|
|
|
_configured_system_config: SystemConfigService | None = None
|
|
_transfer_retry_config_provider: Callable[[], TransferRetryConfig] | None = None
|
|
|
|
|
|
def configure_system_config(service: SystemConfigService) -> None:
|
|
"""由启动组合根登记系统配置服务。"""
|
|
global _configured_system_config
|
|
_configured_system_config = service
|
|
|
|
|
|
def get_configured_system_config() -> SystemConfigService:
|
|
"""返回启动阶段登记的系统配置服务。"""
|
|
if _configured_system_config is None:
|
|
raise RuntimeError("系统配置服务尚未配置")
|
|
return _configured_system_config
|
|
|
|
|
|
def configure_transfer_retry_config(
|
|
provider: Callable[[], TransferRetryConfig],
|
|
) -> None:
|
|
"""由组合根登记整理失败重试快照工厂。"""
|
|
global _transfer_retry_config_provider
|
|
_transfer_retry_config_provider = provider
|
|
|
|
|
|
def get_transfer_retry_config() -> TransferRetryConfig:
|
|
"""为一次整理历史判定创建不可变配置快照。"""
|
|
if _transfer_retry_config_provider is None:
|
|
raise RuntimeError("整理失败重试配置尚未装配")
|
|
return _transfer_retry_config_provider()
|