Files

167 lines
5.2 KiB
Python

import math
from typing import Optional
from fastapi import APIRouter, Depends, Query
from sqlalchemy.ext.asyncio import AsyncSession
from app.core.logging import get_logger
from app.db.session import get_db
from app.module.cleaning.schema import (
CleaningTemplateDto,
CreateCleaningTemplateRequest,
UpdateCleaningTemplateRequest,
)
from app.module.cleaning.service import CleaningTemplateService
from app.module.shared.schema import StandardResponse, PaginatedData
logger = get_logger(__name__)
router = APIRouter(prefix="/cleaning/templates", tags=["Cleaning Templates"])
def _get_operator_service():
"""Get operator service"""
from app.module.operator.service import OperatorService
from app.module.operator.repository import (
OperatorRepository,
CategoryRelationRepository,
OperatorReleaseRepository,
)
from app.module.operator.parsers import ParserHolder
from app.module.shared.file_service import FileService
from app.module.shared.chunk_upload_repository import ChunkUploadRepository
return OperatorService(
operator_repo=OperatorRepository(None),
category_relation_repo=CategoryRelationRepository(None),
operator_release_repo=OperatorReleaseRepository(None),
parser_holder=ParserHolder(),
file_service=FileService(ChunkUploadRepository()),
)
def _get_template_service(db: AsyncSession) -> CleaningTemplateService:
"""Get cleaning template service instance"""
from app.module.cleaning.service import CleaningTaskValidator
from app.module.cleaning.repository import (
CleaningTemplateRepository,
OperatorInstanceRepository,
)
operator_service = _get_operator_service()
template_repo = CleaningTemplateRepository(None)
return CleaningTemplateService(
template_repo=template_repo,
operator_instance_repo=OperatorInstanceRepository(None),
operator_service=operator_service,
validator=CleaningTaskValidator(task_repo=None, template_repo=template_repo),
)
@router.get(
"",
response_model=StandardResponse[PaginatedData[CleaningTemplateDto]],
summary="查询清洗模板列表",
description="分页查询清洗模板",
)
async def get_cleaning_templates(
page: int = Query(0, description="页码"),
size: int = Query(20, description="每页数量"),
keyword: Optional[str] = Query(None, description="关键词搜索"),
db: AsyncSession = Depends(get_db),
):
"""Query cleaning templates with pagination"""
template_service = _get_template_service(db)
items, total = await template_service.get_templates(db, keyword, page, size)
total_pages = math.ceil(total / size) if total > 0 else 0
return StandardResponse(
code="0",
message="success",
data=PaginatedData(
content=items,
total_elements=total,
total_pages=total_pages,
page=page,
size=size,
),
)
@router.post(
"",
response_model=StandardResponse[CleaningTemplateDto],
summary="创建清洗模板",
description="创建新的清洗模板",
)
async def create_cleaning_template(
request: CreateCleaningTemplateRequest,
db: AsyncSession = Depends(get_db),
):
"""Create cleaning template"""
template_service = _get_template_service(db)
template = await template_service.create_template(db, request)
await db.commit()
return StandardResponse(code="0", message="success", data=template)
@router.get(
"/{template_id}",
response_model=StandardResponse[CleaningTemplateDto],
summary="获取清洗模板详情",
description="根据ID获取清洗模板详细信息",
)
async def get_cleaning_template(
template_id: str,
db: AsyncSession = Depends(get_db),
):
"""Get cleaning template by ID"""
template_service = _get_template_service(db)
template = await template_service.get_template(db, template_id)
return StandardResponse(code="0", message="success", data=template)
@router.put(
"/{template_id}",
response_model=StandardResponse[CleaningTemplateDto],
summary="更新清洗模板",
description="更新清洗模板信息",
)
async def update_cleaning_template(
template_id: str,
request: UpdateCleaningTemplateRequest,
db: AsyncSession = Depends(get_db),
):
"""Update cleaning template"""
template_service = _get_template_service(db)
template = await template_service.update_template(db, template_id, request)
await db.commit()
return StandardResponse(code="0", message="success", data=template)
@router.delete(
"/{template_id}",
response_model=StandardResponse[str],
summary="删除清洗模板",
description="删除指定的清洗模板",
)
async def delete_cleaning_template(
template_id: str,
db: AsyncSession = Depends(get_db),
):
"""Delete cleaning template"""
template_service = _get_template_service(db)
await template_service.delete_template(db, template_id)
await db.commit()
return StandardResponse(code="0", message="success", data=template_id)