from typing import Any, Optional from fastapi import APIRouter, Depends, HTTPException, Query, Path from sqlalchemy.orm import Session from app.api import crud from app.api.schemas.director import ( Director, DirectorCreate, DirectorUpdate, DirectorDetails, DirectorList ) from app.db.session import get_db router = APIRouter(prefix="/directors") @router.get("", response_model=DirectorList) def read_directors( db: Session = Depends(get_db), skip: int = Query(0, ge=0), limit: int = Query(100, ge=1, le=100), name: Optional[str] = None, ) -> Any: """ Retrieve all directors with optional filtering. """ # Build filter dict from query parameters filters = {} if name: filters["name"] = name directors, total = crud.director.get_multi(db, skip=skip, limit=limit, filters=filters) return {"data": directors, "total": total} @router.post("", response_model=Director, status_code=201) def create_director( *, db: Session = Depends(get_db), director_in: DirectorCreate, ) -> Any: """ Create a new director. """ director = crud.director.create(db, director_in=director_in) return director @router.get("/{director_id}", response_model=DirectorDetails) def read_director( *, db: Session = Depends(get_db), director_id: int = Path(..., ge=1), ) -> Any: """ Get a specific director by ID. """ director = crud.director.get(db, director_id=director_id) if not director: raise HTTPException(status_code=404, detail="Director not found") return director @router.put("/{director_id}", response_model=Director) def update_director( *, db: Session = Depends(get_db), director_id: int = Path(..., ge=1), director_in: DirectorUpdate, ) -> Any: """ Update a director. """ director = crud.director.get(db, director_id=director_id) if not director: raise HTTPException(status_code=404, detail="Director not found") director = crud.director.update(db, db_director=director, director_in=director_in) return director @router.delete("/{director_id}", status_code=204, response_model=None) def delete_director( *, db: Session = Depends(get_db), director_id: int = Path(..., ge=1), ) -> Any: """ Delete a director. """ success = crud.director.delete(db, director_id=director_id) if not success: raise HTTPException(status_code=404, detail="Director not found") return None