from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from app.auth import get_current_admin from app.database import get_db from app import models, schemas router = APIRouter(prefix="/api/projects", tags=["Projects"]) @router.get("", response_model=list[schemas.ProjectOut]) def list_projects(status_filter: str | None = None, db: Session = Depends(get_db)): query = db.query(models.Project) if status_filter: query = query.filter(models.Project.status == status_filter) return query.order_by(models.Project.order).all() @router.get("/{slug}", response_model=schemas.ProjectOut) def get_project(slug: str, db: Session = Depends(get_db)): project = db.query(models.Project).filter(models.Project.slug == slug).first() if not project: raise HTTPException(status.HTTP_404_NOT_FOUND, "پروژه پیدا نشد") return project @router.post("", response_model=schemas.ProjectOut, status_code=status.HTTP_201_CREATED) def create_project( payload: schemas.ProjectCreate, db: Session = Depends(get_db), _admin=Depends(get_current_admin), ): if db.query(models.Project).filter(models.Project.slug == payload.slug).first(): raise HTTPException(status.HTTP_400_BAD_REQUEST, "این slug قبلاً استفاده شده است") project = models.Project(**payload.model_dump()) db.add(project) db.commit() db.refresh(project) return project @router.put("/{project_id}", response_model=schemas.ProjectOut) def update_project( project_id: int, payload: schemas.ProjectUpdate, db: Session = Depends(get_db), _admin=Depends(get_current_admin), ): project = db.get(models.Project, project_id) if not project: raise HTTPException(status.HTTP_404_NOT_FOUND, "پروژه پیدا نشد") for field, value in payload.model_dump(exclude_unset=True).items(): setattr(project, field, value) db.commit() db.refresh(project) return project @router.delete("/{project_id}", status_code=status.HTTP_204_NO_CONTENT) def delete_project( project_id: int, db: Session = Depends(get_db), _admin=Depends(get_current_admin), ): project = db.get(models.Project, project_id) if not project: raise HTTPException(status.HTTP_404_NOT_FOUND, "پروژه پیدا نشد") db.delete(project) db.commit() return None