Automated Action 0186fc8e70 Create movie database backend with FastAPI and SQLite
This commit implements a simple movie database backend inspired by IMDb. It includes:
- API endpoints for movies, actors, directors and genres
- SQLAlchemy models with relationships
- Alembic migrations
- Pydantic schemas for request/response validation
- Search and filtering functionality
- Health check endpoint
- Complete documentation
2025-05-19 20:28:07 +00:00

85 lines
2.1 KiB
Python

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