| """Workflow API endpoints.""" |
|
|
| from datetime import datetime |
| from typing import Optional |
|
|
| from fastapi import APIRouter, Depends, HTTPException, status |
| from pydantic import BaseModel, Field |
| from sqlalchemy.ext.asyncio import AsyncSession |
|
|
| from backend.api.deps import get_current_user, get_db |
| from backend.db.models import User |
| from backend.db.repository import create_workflow, get_workflow_by_id, get_workflows_by_user |
|
|
| router = APIRouter(prefix="/api/workflows", tags=["workflows"]) |
|
|
|
|
| |
|
|
| class WorkflowCreateRequest(BaseModel): |
| prompt: str = Field(..., min_length=1) |
|
|
|
|
| class TaskResponse(BaseModel): |
| id: str |
| task_type: str |
| status: str |
| created_at: datetime |
|
|
| model_config = {"from_attributes": True} |
|
|
|
|
| class WorkflowResponse(BaseModel): |
| id: str |
| prompt: str |
| status: str |
| created_at: datetime |
| updated_at: datetime |
|
|
| model_config = {"from_attributes": True} |
|
|
|
|
| class WorkflowDetailResponse(WorkflowResponse): |
| tasks: list[TaskResponse] = [] |
|
|
|
|
| |
|
|
| @router.post("", response_model=WorkflowResponse, status_code=status.HTTP_201_CREATED) |
| async def create( |
| body: WorkflowCreateRequest, |
| current_user: User = Depends(get_current_user), |
| session: AsyncSession = Depends(get_db), |
| ): |
| """Create a new workflow (status=pending, no execution yet).""" |
| workflow = await create_workflow(session, user_id=current_user.id, prompt=body.prompt) |
| return workflow |
|
|
|
|
| @router.get("", response_model=list[WorkflowResponse]) |
| async def list_workflows( |
| current_user: User = Depends(get_current_user), |
| session: AsyncSession = Depends(get_db), |
| ): |
| """List all workflows for the current user.""" |
| workflows = await get_workflows_by_user(session, current_user.id) |
| return workflows |
|
|
|
|
| @router.get("/{workflow_id}", response_model=WorkflowDetailResponse) |
| async def get_workflow( |
| workflow_id: str, |
| current_user: User = Depends(get_current_user), |
| session: AsyncSession = Depends(get_db), |
| ): |
| """Get a single workflow with its tasks.""" |
| workflow = await get_workflow_by_id(session, workflow_id) |
| if not workflow: |
| raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Workflow not found") |
| if workflow.user_id != current_user.id: |
| raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Access denied") |
| return workflow |
|
|