"""API проектов M1."""
from fastapi import APIRouter, HTTPException
from sqlalchemy import select
from app.dependencies import DbDep, UserDep
from app.models import Project
from app.schemas import ProjectCreate, ProjectOut, ProjectUpdate
router = APIRouter(prefix="/api/projects", tags=["projects"])
VALID_RELEVANCE = {"active", "paused", "archived"}
@router.post("", response_model=ProjectOut)
async def create_project(schema: ProjectCreate, db: DbDep, user: UserDep) -> Project:
exists = db.scalars(select(Project).where(Project.name == schema.name)).first()
if exists is not None:
raise HTTPException(status_code=409, detail="Project name already exists")
project = Project(name=schema.name, priority=schema.priority, note=schema.note)
db.add(project)
db.flush()
return project
@router.get("", response_model=list[ProjectOut])
async def list_projects(db: DbDep, user: UserDep) -> list[Project]:
return list(db.scalars(select(Project).order_by(Project.id)).all())
@router.patch("/{project_id}", response_model=ProjectOut)
async def update_project(
project_id: int, schema: ProjectUpdate, db: DbDep, user: UserDep
) -> Project:
project = db.get(Project, project_id)
if project is None:
raise HTTPException(status_code=404, detail="Project not found")
data = schema.model_dump(exclude_unset=True)
if "relevance_status" in data and data["relevance_status"] not in VALID_RELEVANCE:
raise HTTPException(
status_code=422, detail=f"Unknown relevance_status: {data['relevance_status']}"
)
for field, value in data.items():
setattr(project, field, value)
return project
@router.delete("/{project_id}")
async def delete_project(project_id: int, db: DbDep) -> dict[str, bool]:
project = db.get(Project, project_id)
if project is None:
raise HTTPException(status_code=404, detail="Project not found")
db.delete(project)
return {"ok": True}