Files
2026-07-13 13:08:41 +08:00

79 lines
2.6 KiB
Python

from datetime import datetime
from typing import Literal
from fastapi import APIRouter, Depends, HTTPException, Path, Query
from sqlalchemy.ext.asyncio import AsyncSession
from sqlmodel import select
from models.sql.async_task import AsyncTaskModel
from services.database import get_async_session
API_V1_ASYNC_TASKS_ROUTER = APIRouter(
prefix="/api/v1/async-tasks",
tags=["Async Tasks"],
)
@API_V1_ASYNC_TASKS_ROUTER.get(
"",
response_model=list[AsyncTaskModel],
)
async def list_async_tasks(
task_type: str | None = Query(default=None, alias="type"),
status: str | None = Query(default=None),
created_at: datetime | None = Query(
default=None,
description=(
"Only include tasks created at or after this timestamp. "
"Alias for created_at_from."
),
),
created_at_from: datetime | None = Query(
default=None,
description="Only include tasks created at or after this timestamp",
),
created_at_to: datetime | None = Query(
default=None,
description="Only include tasks created at or before this timestamp",
),
order_by: Literal["created_at", "updated_at"] = Query(default="created_at"),
order: Literal["asc", "desc"] = Query(default="desc"),
limit: int = Query(default=50, ge=1, le=200),
offset: int = Query(default=0, ge=0),
sql_session: AsyncSession = Depends(get_async_session),
):
statement = select(AsyncTaskModel)
if task_type is not None:
statement = statement.where(AsyncTaskModel.type == task_type)
if status is not None:
statement = statement.where(AsyncTaskModel.status == status)
created_at_start = created_at_from or created_at
if created_at_start is not None:
statement = statement.where(AsyncTaskModel.created_at >= created_at_start)
if created_at_to is not None:
statement = statement.where(AsyncTaskModel.created_at <= created_at_to)
order_column = getattr(AsyncTaskModel, order_by)
statement = statement.order_by(
order_column.asc() if order == "asc" else order_column.desc()
)
statement = statement.offset(offset).limit(limit)
result = await sql_session.execute(statement)
return list(result.scalars().all())
@API_V1_ASYNC_TASKS_ROUTER.get(
"/status/{id}",
response_model=AsyncTaskModel,
)
async def check_async_task_status(
id: str = Path(description="ID of the async task"),
sql_session: AsyncSession = Depends(get_async_session),
):
task = await sql_session.get(AsyncTaskModel, id)
if not task:
raise HTTPException(status_code=404, detail="No async task found")
return task