
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
77 lines
1.8 KiB
Python
77 lines
1.8 KiB
Python
from datetime import date
|
|
from typing import List, Optional, TYPE_CHECKING
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
# Shared properties
|
|
class MovieBase(BaseModel):
|
|
title: str
|
|
release_date: Optional[date] = None
|
|
overview: Optional[str] = None
|
|
poster_path: Optional[str] = None
|
|
runtime: Optional[int] = None
|
|
rating: Optional[float] = Field(None, ge=0, le=10)
|
|
|
|
|
|
# Properties to receive on movie creation
|
|
class MovieCreate(MovieBase):
|
|
director_id: Optional[int] = None
|
|
genre_ids: List[int] = []
|
|
actor_ids: List[int] = []
|
|
|
|
|
|
# Properties to receive on movie update
|
|
class MovieUpdate(MovieBase):
|
|
title: Optional[str] = None
|
|
director_id: Optional[int] = None
|
|
genre_ids: Optional[List[int]] = None
|
|
actor_ids: Optional[List[int]] = None
|
|
|
|
|
|
# Properties shared by models stored in DB
|
|
class MovieInDBBase(MovieBase):
|
|
id: int
|
|
director_id: Optional[int] = None
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
# Properties to return to client
|
|
class Movie(MovieInDBBase):
|
|
pass
|
|
|
|
|
|
# Properties properties stored in DB
|
|
class MovieInDB(MovieInDBBase):
|
|
pass
|
|
|
|
|
|
# Forward references for circular imports
|
|
if TYPE_CHECKING:
|
|
from app.api.schemas.director import Director
|
|
from app.api.schemas.genre import Genre
|
|
from app.api.schemas.actor import Actor
|
|
|
|
|
|
# Properties for movie with details
|
|
class MovieDetails(Movie):
|
|
director: Optional["Director"] = None
|
|
genres: List["Genre"] = []
|
|
actors: List["Actor"] = []
|
|
|
|
|
|
# Import the forward references after the class definitions
|
|
# to avoid circular import issues
|
|
from app.api.schemas.director import Director # noqa: E402
|
|
from app.api.schemas.genre import Genre # noqa: E402
|
|
from app.api.schemas.actor import Actor # noqa: E402
|
|
|
|
# Update forward references
|
|
MovieDetails.model_rebuild()
|
|
|
|
|
|
# Properties for list
|
|
class MovieList(BaseModel):
|
|
data: List[Movie]
|
|
total: int |