from __future__ import annotations from typing import Any from uuid import UUID from fastapi import APIRouter, Query from pydantic import BaseModel, Field from bid_doctor.core.db import tenant_tx from bid_doctor.identity.deps import Ctx from bid_doctor.project import service, workbench router = APIRouter(tags=["projects"]) class ProjectIn(BaseModel): name: str | None = Field(default=None, max_length=200) @router.get("/projects") async def list_projects(ctx: Ctx, limit: int = Query(default=20, ge=1, le=100)) -> dict[str, Any]: # TODO(工作台筛选):status / deadline / q / 游标分页,按 openapi.yaml 补齐 async with tenant_tx(ctx) as s: return {"items": await workbench.rows(s, ctx, limit), "next_cursor": None} @router.post("/projects", status_code=201) async def create_project(body: ProjectIn, ctx: Ctx) -> dict[str, Any]: async with tenant_tx(ctx) as s: p = await service.create(s, ctx, body.name) return await workbench.detail(s, ctx, p.id) @router.get("/projects/{project_id}") async def get_project(project_id: UUID, ctx: Ctx) -> dict[str, Any]: async with tenant_tx(ctx) as s: return await workbench.detail(s, ctx, project_id)