"""素材仓储接口定义。""" from abc import ABC, abstractmethod from packages.domain import Asset class AssetRepository(ABC): @abstractmethod def create(self, asset: Asset) -> Asset: pass @abstractmethod def find_by_id(self, asset_id: str) -> Asset | None: pass @abstractmethod def find_by_project( self, project_id: str, skip: int = 0, limit: int = 100, ) -> list[Asset]: pass @abstractmethod def find_by_library( self, library_id: str, skip: int = 0, limit: int = 100, ) -> list[Asset]: pass @abstractmethod def find_by_library_and_file_type( self, library_id: str, file_type: str, skip: int = 0, limit: int = 100, ) -> list[Asset]: pass @abstractmethod def update(self, asset: Asset) -> Asset: pass @abstractmethod def delete(self, asset_id: str) -> bool: pass @abstractmethod def batch_delete(self, asset_ids: list[str]) -> int: """批量删除素材,返回实际删除数量。""" pass @abstractmethod def count_by_project(self, project_id: str) -> int: pass @abstractmethod def count_by_project_ids(self, project_ids: list[str]) -> int: pass @abstractmethod def sum_storage_by_project_ids(self, project_ids: list[str]) -> int: pass @abstractmethod def search_candidates( self, project_id: str, *, file_type: str | None = None, min_quality_score: float | None = None, min_duration: float | None = None, max_duration: float | None = None, classification_category: str | None = None, tags: list[str] | None = None, status: str | None = None, limit: int = 50, ) -> list[Asset]: """按筛选条件搜索候选素材,按质量分降序排列。""" pass @abstractmethod def find_by_tag_ids( self, tag_ids: list[str], skip: int = 0, limit: int = 100, ) -> list[Asset]: """查找包含所有指定标签的素材。""" pass @abstractmethod def find_by_library_and_file_hash( self, library_id: str, file_hash: str, ) -> Asset | None: """按素材库 + 文件哈希查找已有素材(去重检测)。""" pass