71 lines
2.4 KiB
Python
71 lines
2.4 KiB
Python
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
|