"""任务 + 评论路由。""" from fastapi import APIRouter, Depends, Query, status from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.core.database import get_db from app.core.dependencies import get_current_user from app.models.task import Comment, Task from app.models.user import User from app.schemas.common import ApiResponse, success router_tasks = APIRouter(prefix="/tasks", tags=["tasks"]) router_comments = APIRouter(prefix="/comments", tags=["comments"]) @router_tasks.get("", response_model=ApiResponse[list]) async def list_tasks( company_id: str | None = Query(default=None), status_filter: str | None = Query(default=None, alias="status"), db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user), ): """获取任务列表。""" query = select(Task).where(Task.tenant_id == user.tenant_id) if company_id: query = query.where(Task.company_id == company_id) if status_filter: query = query.where(Task.status == status_filter) result = await db.execute(query.order_by(Task.created_at.desc())) items = result.scalars().all() return success(data=[ { "id": str(i.id), "company_id": str(i.company_id) if i.company_id else None, "title": i.title, "description": i.description, "status": i.status, "priority": i.priority, "assigned_to": i.assigned_to, "source_type": i.source_type, "due_at": i.due_at.isoformat() if i.due_at else None, } for i in items ]) @router_tasks.post("", response_model=ApiResponse[dict], status_code=status.HTTP_201_CREATED) async def create_task(req: dict, db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user)): """创建任务。""" task = Task( tenant_id=user.tenant_id, company_id=req.get("company_id"), title=req.get("title"), description=req.get("description"), priority=req.get("priority", "medium"), assigned_to=req.get("assigned_to"), source_type=req.get("source_type"), source_ref=req.get("source_ref"), due_at=req.get("due_at"), ) db.add(task) await db.flush() return success(data={"id": str(task.id)}, message="创建成功") @router_tasks.put("/{task_id}", response_model=ApiResponse[dict]) async def update_task(task_id: str, req: dict, db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user)): """更新任务状态。""" result = await db.execute( select(Task).where(Task.id == task_id, Task.tenant_id == user.tenant_id) ) task = result.scalar_one_or_none() if not task: from fastapi import HTTPException raise HTTPException(status_code=404, detail="任务不存在") for key, value in req.items(): setattr(task, key, value) await db.flush() return success(data={"id": str(task.id)}, message="更新成功") @router_comments.get("", response_model=ApiResponse[list]) async def list_comments( target_type: str = Query(...), target_id: str = Query(...), db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user), ): """获取评论列表。""" result = await db.execute( select(Comment) .where(Comment.tenant_id == user.tenant_id, Comment.target_type == target_type, Comment.target_id == target_id) .order_by(Comment.created_at.asc()) ) items = result.scalars().all() return success(data=[ { "id": str(i.id), "target_type": i.target_type, "target_id": i.target_id, "user_id": str(i.user_id), "content": i.content, "parent_id": i.parent_id, "created_at": i.created_at.isoformat(), } for i in items ]) @router_comments.post("", response_model=ApiResponse[dict], status_code=status.HTTP_201_CREATED) async def create_comment(req: dict, db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user)): """创建评论。""" comment = Comment( tenant_id=user.tenant_id, target_type=req.get("target_type"), target_id=req.get("target_id"), user_id=str(user.id), content=req.get("content"), parent_id=req.get("parent_id"), ) db.add(comment) await db.flush() return success(data={"id": str(comment.id)}, message="创建成功")