94 lines
2.4 KiB
Python
94 lines
2.4 KiB
Python
"""
|
|
Task management endpoints
|
|
|
|
Endpoints for managing async tasks (checking status, canceling, etc.)
|
|
"""
|
|
|
|
from typing import List, Optional
|
|
from fastapi import APIRouter, HTTPException, Query
|
|
from loguru import logger
|
|
|
|
from api.tasks import task_manager, Task, TaskStatus
|
|
|
|
router = APIRouter(prefix="/tasks", tags=["Tasks"])
|
|
|
|
|
|
@router.get("", response_model=List[Task])
|
|
async def list_tasks(
|
|
status: Optional[TaskStatus] = Query(None, description="Filter by status"),
|
|
limit: int = Query(100, ge=1, le=1000, description="Maximum number of tasks")
|
|
):
|
|
"""
|
|
List tasks
|
|
|
|
Retrieve list of tasks with optional filtering.
|
|
|
|
- **status**: Optional filter by status (pending/running/completed/failed/cancelled)
|
|
- **limit**: Maximum number of tasks to return (default 100)
|
|
|
|
Returns list of tasks sorted by creation time (newest first).
|
|
"""
|
|
try:
|
|
tasks = task_manager.list_tasks(status=status, limit=limit)
|
|
return tasks
|
|
|
|
except Exception as e:
|
|
logger.error(f"List tasks error: {e}")
|
|
raise HTTPException(status_code=500, detail=str(e))
|
|
|
|
|
|
@router.get("/{task_id}", response_model=Task)
|
|
async def get_task(task_id: str):
|
|
"""
|
|
Get task details
|
|
|
|
Retrieve detailed information about a specific task.
|
|
|
|
- **task_id**: Task ID
|
|
|
|
Returns task details including status, progress, and result (if completed).
|
|
"""
|
|
try:
|
|
task = task_manager.get_task(task_id)
|
|
|
|
if not task:
|
|
raise HTTPException(status_code=404, detail=f"Task {task_id} not found")
|
|
|
|
return task
|
|
|
|
except HTTPException:
|
|
raise
|
|
except Exception as e:
|
|
logger.error(f"Get task error: {e}")
|
|
raise HTTPException(status_code=500, detail=str(e))
|
|
|
|
|
|
@router.delete("/{task_id}")
|
|
async def cancel_task(task_id: str):
|
|
"""
|
|
Cancel task
|
|
|
|
Cancel a running or pending task.
|
|
|
|
- **task_id**: Task ID
|
|
|
|
Returns success status.
|
|
"""
|
|
try:
|
|
success = task_manager.cancel_task(task_id)
|
|
|
|
if not success:
|
|
raise HTTPException(status_code=404, detail=f"Task {task_id} not found")
|
|
|
|
return {
|
|
"success": True,
|
|
"message": f"Task {task_id} cancelled successfully"
|
|
}
|
|
|
|
except HTTPException:
|
|
raise
|
|
except Exception as e:
|
|
logger.error(f"Cancel task error: {e}")
|
|
raise HTTPException(status_code=500, detail=str(e))
|
|
|