from typing import List, Optional, Dict, Any from sqlalchemy.orm import Session from app.models.director import Director from app.models.movie import Movie from app.api.schemas.director import DirectorCreate, DirectorUpdate def get(db: Session, director_id: int) -> Optional[Director]: """ Get a director by ID. """ return db.query(Director).filter(Director.id == director_id).first() def get_multi( db: Session, skip: int = 0, limit: int = 100, filters: Optional[Dict[str, Any]] = None ) -> List[Director]: """ Get multiple directors with pagination and optional filters. """ query = db.query(Director) # Apply filters if provided if filters: if name := filters.get("name"): query = query.filter(Director.name.ilike(f"%{name}%")) # Sort by name query = query.order_by(Director.name) # Get total count before pagination total = query.count() return query.offset(skip).limit(limit).all(), total def create(db: Session, director_in: DirectorCreate) -> Director: """ Create a new director. """ db_director = Director(**director_in.dict()) db.add(db_director) db.commit() db.refresh(db_director) return db_director def update( db: Session, db_director: Director, director_in: DirectorUpdate ) -> Director: """ Update a director. """ update_data = director_in.dict(exclude_unset=True) for field, value in update_data.items(): setattr(db_director, field, value) db.commit() db.refresh(db_director) return db_director def delete(db: Session, director_id: int) -> bool: """ Delete a director by ID. """ db_director = db.query(Director).filter(Director.id == director_id).first() if db_director: # Unlink movies from this director db.query(Movie).filter(Movie.director_id == director_id).update( {Movie.director_id: None}, synchronize_session=False ) # Delete the director db.delete(db_director) db.commit() return True return False