""" Projects API Router """ from typing import List from uuid import UUID from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select from app.core.database import get_db from app.models.models import Project from app.schemas.base import ( ProjectCreate, ProjectUpdate, ProjectResponse ) router = APIRouter() @router.get("/", response_model=dict) async def list_projects(db: AsyncSession = Depends(get_db)): """List all projects""" result = await db.execute(select(Project).order_by(Project.created_at.desc())) projects = result.scalars().all() return {"projects": [ProjectResponse.model_validate(p) for p in projects]} @router.post("/", response_model=dict) async def create_project(project: ProjectCreate, db: AsyncSession = Depends(get_db)): """Create a new project""" db_project = Project(**project.model_dump()) db.add(db_project) await db.commit() await db.refresh(db_project) return {"id": str(db_project.id)} @router.get("/{project_id}", response_model=dict) async def get_project(project_id: UUID, db: AsyncSession = Depends(get_db)): """Get project by ID""" result = await db.execute(select(Project).where(Project.id == project_id)) project = result.scalar_one_or_none() if not project: raise HTTPException(status_code=404, detail="Project not found") return ProjectResponse.model_validate(project) @router.put("/{project_id}", response_model=dict) async def update_project(project_id: UUID, project: ProjectUpdate, db: AsyncSession = Depends(get_db)): """Update project""" result = await db.execute(select(Project).where(Project.id == project_id)) db_project = result.scalar_one_or_none() if not db_project: raise HTTPException(status_code=404, detail="Project not found") for key, value in project.model_dump(exclude_unset=True).items(): setattr(db_project, key, value) await db.commit() await db.refresh(db_project) return ProjectResponse.model_validate(db_project) @router.delete("/{project_id}", response_model=dict) async def delete_project(project_id: UUID, db: AsyncSession = Depends(get_db)): """Delete project""" result = await db.execute(select(Project).where(Project.id == project_id)) project = result.scalar_one_or_none() if not project: raise HTTPException(status_code=404, detail="Project not found") await db.delete(project) await db.commit() return {"message": "Project deleted successfully"}