Files
bttoxin-pipeline/backend/app/api/v1/tasks.py

71 lines
2.2 KiB
Python

"""任务管理 API - 兼容 /api/v1/tasks 路径"""
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from typing import List
from pathlib import Path
from pydantic import BaseModel
from ...database import get_db
from ...models.job import Job, JobStatus
from ...schemas.job import JobResponse
from ...config import settings
router = APIRouter()
class TaskCreateRequest(BaseModel):
"""任务创建请求"""
files: List[str] # 文件名列表
sequence_type: str = "nucl"
min_identity: float = 0.8
min_coverage: float = 0.6
allow_unknown_families: bool = False
require_index_hit: bool = True
class QueuePosition(BaseModel):
"""队列位置信息"""
position: int
estimated_wait_minutes: int = None
@router.post("/", response_model=JobResponse)
async def create_task(request: TaskCreateRequest, db: Session = Depends(get_db)):
"""创建新任务(兼容前端)"""
# 暂时复用 jobs 逻辑
# TODO: 实现完整的文件上传和处理
raise HTTPException(status_code=501, detail="Use POST /api/v1/jobs/create for now")
@router.get("/{task_id}", response_model=JobResponse)
async def get_task(task_id: str, db: Session = Depends(get_db)):
"""获取任务状态"""
job = db.query(Job).filter(Job.id == task_id).first()
if not job:
raise HTTPException(status_code=404, detail="Task not found")
return job
@router.get("/{task_id}/queue")
async def get_queue_position(task_id: str, db: Session = Depends(get_db)):
"""获取排队位置"""
job = db.query(Job).filter(Job.id == task_id).first()
if not job:
raise HTTPException(status_code=404, detail="Task not found")
if job.status not in [JobStatus.PENDING, JobStatus.QUEUED]:
return {"position": 0, "message": "Task is not in queue"}
# 计算排队位置
ahead_jobs = db.query(Job).filter(
Job.id != task_id,
Job.status.in_([JobStatus.PENDING, JobStatus.QUEUED]),
Job.created_at < job.created_at
).count()
position = ahead_jobs + 1
# 假设每个任务约5分钟
estimated_wait = position * 5
return QueuePosition(position=position, estimated_wait_minutes=estimated_wait)