57 lines
1.5 KiB
Python
57 lines
1.5 KiB
Python
"""API 路由 — 项目管理"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
from typing import Any, Dict, List, Optional
|
|
|
|
from fastapi import APIRouter, HTTPException
|
|
|
|
from src.blackboard.registry import ProjectRegistry
|
|
from src.utils import get_data_root
|
|
|
|
router = APIRouter(prefix="/api/projects", tags=["projects"])
|
|
|
|
|
|
def _registry() -> ProjectRegistry:
|
|
return ProjectRegistry(get_data_root())
|
|
|
|
|
|
@router.get("")
|
|
async def list_projects():
|
|
reg = _registry()
|
|
projects = reg.list_projects()
|
|
return {"projects": {pid: info for pid, info in projects.items()
|
|
if info.get("status") != "archived"}}
|
|
|
|
|
|
@router.post("")
|
|
async def create_project(body: Dict[str, Any]):
|
|
reg = _registry()
|
|
try:
|
|
info = reg.create_project(
|
|
body["id"], body["name"],
|
|
agents=body.get("agents", []),
|
|
description=body.get("description", ""),
|
|
)
|
|
return {"ok": True, "project_id": body["id"]}
|
|
except ValueError as e:
|
|
raise HTTPException(409, str(e))
|
|
|
|
|
|
@router.get("/{project_id}")
|
|
async def get_project(project_id: str):
|
|
reg = _registry()
|
|
info = reg.get_project(project_id)
|
|
if not info:
|
|
raise HTTPException(404, f"Project not found: {project_id}")
|
|
return info
|
|
|
|
|
|
@router.post("/{project_id}/archive")
|
|
async def archive_project(project_id: str):
|
|
reg = _registry()
|
|
if not reg.archive_project(project_id):
|
|
raise HTTPException(404, f"Project not found: {project_id}")
|
|
return {"ok": True}
|