71 lines
2.2 KiB
Python
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)
|