Implement FastAPI Temporal MVP pipeline

This commit is contained in:
Codex
2026-03-27 00:10:28 +08:00
commit cc03da8a94
52 changed files with 3619 additions and 0 deletions

22
app/api/routers/assets.py Normal file
View File

@@ -0,0 +1,22 @@
"""Asset routes."""
from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession
from app.api.schemas.asset import AssetRead
from app.application.services.asset_service import AssetService
from app.infra.db.session import get_db_session
router = APIRouter(prefix="/orders", tags=["assets"])
asset_service = AssetService()
@router.get("/{order_id}/assets", response_model=list[AssetRead])
async def list_order_assets(
order_id: int,
session: AsyncSession = Depends(get_db_session),
) -> list[AssetRead]:
"""List assets generated for an order."""
return await asset_service.list_order_assets(session, order_id)

13
app/api/routers/health.py Normal file
View File

@@ -0,0 +1,13 @@
"""Health check routes."""
from fastapi import APIRouter
router = APIRouter(tags=["health"])
@router.get("/healthz")
async def healthcheck() -> dict[str, str]:
"""Return a simple health check response."""
return {"status": "ok"}

32
app/api/routers/orders.py Normal file
View File

@@ -0,0 +1,32 @@
"""Order routes."""
from fastapi import APIRouter, Depends, status
from sqlalchemy.ext.asyncio import AsyncSession
from app.api.schemas.order import CreateOrderRequest, CreateOrderResponse, OrderDetailResponse
from app.application.services.order_service import OrderService
from app.infra.db.session import get_db_session
router = APIRouter(prefix="/orders", tags=["orders"])
order_service = OrderService()
@router.post("", response_model=CreateOrderResponse, status_code=status.HTTP_201_CREATED)
async def create_order(
payload: CreateOrderRequest,
session: AsyncSession = Depends(get_db_session),
) -> CreateOrderResponse:
"""Create a new image pipeline order."""
return await order_service.create_order(session, payload)
@router.get("/{order_id}", response_model=OrderDetailResponse)
async def get_order(
order_id: int,
session: AsyncSession = Depends(get_db_session),
) -> OrderDetailResponse:
"""Fetch order details."""
return await order_service.get_order(session, order_id)

View File

@@ -0,0 +1,32 @@
"""Review routes."""
from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession
from app.api.schemas.review import PendingReviewResponse, SubmitReviewRequest, SubmitReviewResponse
from app.application.services.review_service import ReviewService
from app.infra.db.session import get_db_session
router = APIRouter(prefix="/reviews", tags=["reviews"])
review_service = ReviewService()
@router.get("/pending", response_model=list[PendingReviewResponse])
async def list_pending_reviews(
session: AsyncSession = Depends(get_db_session),
) -> list[PendingReviewResponse]:
"""List review tasks waiting for manual input."""
return await review_service.list_pending_reviews(session)
@router.post("/{order_id}/submit", response_model=SubmitReviewResponse)
async def submit_review(
order_id: int,
payload: SubmitReviewRequest,
session: AsyncSession = Depends(get_db_session),
) -> SubmitReviewResponse:
"""Submit a review decision for a workflow."""
return await review_service.submit_review(session, order_id, payload)

View File

@@ -0,0 +1,22 @@
"""Workflow routes."""
from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession
from app.api.schemas.workflow import WorkflowStatusResponse
from app.application.services.workflow_service import WorkflowService
from app.infra.db.session import get_db_session
router = APIRouter(prefix="/workflows", tags=["workflows"])
workflow_service = WorkflowService()
@router.get("/{order_id}", response_model=WorkflowStatusResponse)
async def get_workflow_status(
order_id: int,
session: AsyncSession = Depends(get_db_session),
) -> WorkflowStatusResponse:
"""Fetch persisted workflow status for an order."""
return await workflow_service.get_workflow_status(session, order_id)