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

93 lines
2.2 KiB
Python

from typing import List, Optional, Dict, Any
from sqlalchemy.orm import Session
from app.models.genre import Genre
from app.models.movie_genre import MovieGenre
from app.api.schemas.genre import GenreCreate, GenreUpdate
def get(db: Session, genre_id: int) -> Optional[Genre]:
"""
Get a genre by ID.
"""
return db.query(Genre).filter(Genre.id == genre_id).first()
def get_by_name(db: Session, name: str) -> Optional[Genre]:
"""
Get a genre by name.
"""
return db.query(Genre).filter(Genre.name == name).first()
def get_multi(
db: Session,
skip: int = 0,
limit: int = 100,
filters: Optional[Dict[str, Any]] = None
) -> List[Genre]:
"""
Get multiple genres with pagination and optional filters.
"""
query = db.query(Genre)
# Apply filters if provided
if filters:
if name := filters.get("name"):
query = query.filter(Genre.name.ilike(f"%{name}%"))
if movie_id := filters.get("movie_id"):
query = query.join(MovieGenre).filter(MovieGenre.movie_id == movie_id)
# Sort by name
query = query.order_by(Genre.name)
# Get total count before pagination
total = query.count()
return query.offset(skip).limit(limit).all(), total
def create(db: Session, genre_in: GenreCreate) -> Genre:
"""
Create a new genre.
"""
db_genre = Genre(**genre_in.dict())
db.add(db_genre)
db.commit()
db.refresh(db_genre)
return db_genre
def update(
db: Session,
db_genre: Genre,
genre_in: GenreUpdate
) -> Genre:
"""
Update a genre.
"""
update_data = genre_in.dict(exclude_unset=True)
for field, value in update_data.items():
setattr(db_genre, field, value)
db.commit()
db.refresh(db_genre)
return db_genre
def delete(db: Session, genre_id: int) -> bool:
"""
Delete a genre by ID.
"""
db_genre = db.query(Genre).filter(Genre.id == genre_id).first()
if db_genre:
# Delete associated movie-genre relationships
db.query(MovieGenre).filter(MovieGenre.genre_id == genre_id).delete()
# Delete the genre
db.delete(db_genre)
db.commit()
return True
return False