75 lines
2.1 KiB
Python
75 lines
2.1 KiB
Python
from __future__ import annotations
|
|
|
|
from fastapi import APIRouter, HTTPException
|
|
|
|
from app.storage.repository import Repository
|
|
|
|
|
|
router = APIRouter(prefix="/tasks", tags=["tasks"])
|
|
repository = Repository()
|
|
|
|
|
|
def _task_response(row: dict) -> dict:
|
|
return {
|
|
"taskId": row["id"],
|
|
"type": row["type"],
|
|
"appId": row["app_id"],
|
|
"appName": row["app_name"],
|
|
"status": row["status"],
|
|
"progress": row["progress"],
|
|
"currentStep": row["current_step"],
|
|
"currentComponentId": row["current_component_id"],
|
|
"errorMessage": row["error_message"],
|
|
"createdAt": row["created_at"],
|
|
"startedAt": row["started_at"],
|
|
"finishedAt": row["finished_at"],
|
|
}
|
|
|
|
|
|
@router.get("/{task_id}")
|
|
def get_task(task_id: str) -> dict:
|
|
task = repository.get_task(task_id)
|
|
if not task:
|
|
raise HTTPException(status_code=404, detail="Task not found")
|
|
return _task_response(task)
|
|
|
|
|
|
@router.get("/{task_id}/logs")
|
|
def get_task_logs(task_id: str) -> dict:
|
|
if not repository.get_task(task_id):
|
|
raise HTTPException(status_code=404, detail="Task not found")
|
|
return {
|
|
"taskId": task_id,
|
|
"logs": [
|
|
{
|
|
"time": item["timestamp"],
|
|
"level": item["level"],
|
|
"message": item["message"],
|
|
}
|
|
for item in repository.get_task_logs(task_id)
|
|
],
|
|
}
|
|
|
|
|
|
@router.get("/{task_id}/components")
|
|
def get_task_components(task_id: str) -> dict:
|
|
if not repository.get_task(task_id):
|
|
raise HTTPException(status_code=404, detail="Task not found")
|
|
return {
|
|
"taskId": task_id,
|
|
"components": [
|
|
{
|
|
"componentId": item["component_id"],
|
|
"type": item["type"],
|
|
"status": item["status"],
|
|
"progress": item["progress"],
|
|
"currentStep": item["current_step"],
|
|
"errorMessage": item["error_message"],
|
|
"startedAt": item["started_at"],
|
|
"finishedAt": item["finished_at"],
|
|
}
|
|
for item in repository.get_task_components(task_id)
|
|
],
|
|
}
|
|
|