from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from database import get_db from models import Project, ProjectCreate, ProjectUpdate, ProjectResponse router = APIRouter(prefix="/projects", tags=["projects"]) @router.get("", response_model=list[ProjectResponse]) def list_projects(db: Session = Depends(get_db)): return db.query(Project).order_by(Project.created_at.desc()).all() @router.post("", response_model=ProjectResponse, status_code=201) def create_project(data: ProjectCreate, db: Session = Depends(get_db)): project = Project(**data.model_dump()) db.add(project) db.commit() db.refresh(project) return project @router.get("/{project_id}", response_model=ProjectResponse) def get_project(project_id: int, db: Session = Depends(get_db)): project = db.query(Project).filter(Project.id == project_id).first() if not project: raise HTTPException(status_code=404, detail="Project not found") return project @router.put("/{project_id}", response_model=ProjectResponse) def update_project(project_id: int, data: ProjectUpdate, db: Session = Depends(get_db)): project = db.query(Project).filter(Project.id == project_id).first() if not project: raise HTTPException(status_code=404, detail="Project not found") for field, value in data.model_dump(exclude_unset=True).items(): setattr(project, field, value) db.commit() db.refresh(project) return project @router.delete("/{project_id}", status_code=204) def delete_project(project_id: int, db: Session = Depends(get_db)): project = db.query(Project).filter(Project.id == project_id).first() if not project: raise HTTPException(status_code=404, detail="Project not found") db.delete(project) db.commit()