fix(P1): 素材列表status默认过滤+page/page_size分页支持

- status参数默认仅返回ready,自动排除deleted
- 支持逗号分隔多状态筛选,传all返回所有状态
- 新增page/page_size分页参数,优先于skip/limit
- repository层find/count统一增加status过滤参数
This commit is contained in:
CI Bot
2026-07-18 18:29:17 +08:00
parent 2e9478bb18
commit e8784b3fa2
3 changed files with 71 additions and 43 deletions
@@ -16,15 +16,12 @@ class SQLAlchemyAssetRepository:
library_id: str,
skip: int = 0,
limit: int = 100,
status: list[str] | None = None,
) -> list[Asset]:
models = (
self.session.query(AssetModel)
.filter(AssetModel.asset_library_id == library_id)
.order_by(AssetModel.created_at.desc())
.offset(skip)
.limit(limit)
.all()
)
query = self.session.query(AssetModel).filter(AssetModel.asset_library_id == library_id)
if status:
query = query.filter(AssetModel.status.in_(status))
models = query.order_by(AssetModel.created_at.desc()).offset(skip).limit(limit).all()
return [self._to_domain(model) for model in models]
def find_by_project(
@@ -32,15 +29,12 @@ class SQLAlchemyAssetRepository:
project_id: str,
skip: int = 0,
limit: int = 100,
status: list[str] | None = None,
) -> list[Asset]:
models = (
self.session.query(AssetModel)
.filter(AssetModel.project_id == project_id)
.order_by(AssetModel.created_at.desc())
.offset(skip)
.limit(limit)
.all()
)
query = self.session.query(AssetModel).filter(AssetModel.project_id == project_id)
if status:
query = query.filter(AssetModel.status.in_(status))
models = query.order_by(AssetModel.created_at.desc()).offset(skip).limit(limit).all()
return [self._to_domain(model) for model in models]
def find_by_library_and_file_type(
@@ -49,15 +43,14 @@ class SQLAlchemyAssetRepository:
file_type: str,
skip: int = 0,
limit: int = 100,
status: list[str] | None = None,
) -> list[Asset]:
models = (
self.session.query(AssetModel)
.filter(AssetModel.asset_library_id == library_id, AssetModel.file_type == file_type)
.order_by(AssetModel.created_at.desc())
.offset(skip)
.limit(limit)
.all()
query = self.session.query(AssetModel).filter(
AssetModel.asset_library_id == library_id, AssetModel.file_type == file_type
)
if status:
query = query.filter(AssetModel.status.in_(status))
models = query.order_by(AssetModel.created_at.desc()).offset(skip).limit(limit).all()
return [self._to_domain(model) for model in models]
def find_by_id(self, asset_id: str) -> Asset | None:
@@ -223,13 +216,19 @@ class SQLAlchemyAssetRepository:
self.session.commit()
return count
def count_by_project(self, project_id: str) -> int:
return self.session.query(AssetModel).filter(AssetModel.project_id == project_id).count()
def count_by_project(self, project_id: str, status: list[str] | None = None) -> int:
query = self.session.query(AssetModel).filter(AssetModel.project_id == project_id)
if status:
query = query.filter(AssetModel.status.in_(status))
return query.count()
def count_by_project_ids(self, project_ids: list[str]) -> int:
def count_by_project_ids(self, project_ids: list[str], status: list[str] | None = None) -> int:
if not project_ids:
return 0
return self.session.query(AssetModel).filter(AssetModel.project_id.in_(project_ids)).count()
query = self.session.query(AssetModel).filter(AssetModel.project_id.in_(project_ids))
if status:
query = query.filter(AssetModel.status.in_(status))
return query.count()
def sum_storage_by_project_ids(self, project_ids: list[str]) -> int:
if not project_ids: