From 60ff8a296dff593b39b4c7d28c1391eac62ba0c3 Mon Sep 17 00:00:00 2001 From: Esa Kataja Date: Sat, 9 Nov 2024 18:32:28 +0200 Subject: [PATCH] Add Movie endpoint --- src/lib/database/movie.py | 51 +++++++++++++++++++++++++++++++++++++++ src/models/movie.py | 45 ++++++++++++++++++++++++++-------- src/routes/movie.py | 25 ++++++++++++++++--- 3 files changed, 108 insertions(+), 13 deletions(-) create mode 100644 src/lib/database/movie.py diff --git a/src/lib/database/movie.py b/src/lib/database/movie.py new file mode 100644 index 0000000..164288f --- /dev/null +++ b/src/lib/database/movie.py @@ -0,0 +1,51 @@ +from models.movie import Movie +from lib.database.database import get_db + + +def get_all_movies() -> list[Movie]: + sql = "SELECT * FROM movies" + with get_db() as conn: + result = conn.execute(sql).fetchall() + movies = [] + for row in result: + movie = Movie( + id=str(row[0]), + name=row[1], + imdb_id=row[2], + actors=row[3], + release_date=row[4], + plot=row[5], + showtime=row[6], + is_watched=row[7], + created_at=row[8], + updated_at=row[9], + ) + movies.append(movie) + + return movies + + return + + +def get_next_movie() -> Movie: + sql = "SELECT * FROM movies WHERE is_watched = FALSE AND showtime > CURRENT_TIMESTAMP ORDER BY showtime ASC" + with get_db() as conn: + result = conn.execute(sql).fetchone() + if result is None: + return None + movie = Movie( + id=str(result[0]), + name=result[1], + imdb_id=result[2], + actors=result[3], + release_date=result[4], + plot=result[5], + showtime=result[6], + is_watched=result[7], + created_at=result[8], + updated_at=result[9], + ) + + return movie + + return diff --git a/src/models/movie.py b/src/models/movie.py index 88d3976..dc1ad85 100644 --- a/src/models/movie.py +++ b/src/models/movie.py @@ -4,13 +4,38 @@ from typing import Optional class Movie(BaseModel): - id: Optional[str] - name: str - imdb_id: str - actors: list[str] - plot: str - release_date: datetime - showtime: datetime - is_watched: bool = Field(default=False) - created_at: datetime = Field(default_factory=datetime.utcnow) - updated_at: datetime = Field(default_factory=datetime.utcnow) + id: Optional[str] = Field( + default=None, examples=["123e4567-e89b-12d3-a456-426655440000"] + ) + name: str = Field( + description="Name of the movie", examples=["A Maple Valley Christmas"] + ) + imdb_id: str = Field(description="IMDB ID of the movie", examples=["tt1234567"]) + actors: list[str] = Field( + description="Actors of the movie", + examples=[["Peyton List", "Andrew W. Walker"]], + ) + plot: str = Field( + description="Plot of the movie", examples=["Erica is a rancher..."] + ) + release_date: datetime = Field( + description="Release date of the movie", examples=["2022-11-05"] + ) + showtime: datetime = Field( + description="Showtime of the movie", examples=["2024-12-01"] + ) + is_watched: bool = Field( + default=False, + description="Whether the movie is watched or not", + examples=[True], + ) + created_at: datetime = Field( + default_factory=datetime.utcnow, + description="Creation date of the movie", + examples=[datetime.utcnow()], + ) + updated_at: datetime = Field( + default_factory=datetime.utcnow, + description="Modification date of the movie", + examples=[datetime.utcnow()], + ) diff --git a/src/routes/movie.py b/src/routes/movie.py index bc9ee44..995aa71 100644 --- a/src/routes/movie.py +++ b/src/routes/movie.py @@ -1,4 +1,8 @@ -from fastapi import APIRouter +from fastapi import APIRouter, Response + +from lib.database.movie import get_all_movies, get_next_movie +from models.movie import Movie +from models import Message router = APIRouter( prefix="/movie", @@ -7,6 +11,21 @@ router = APIRouter( ) -@router.get("/") +@router.get("/", response_model=list[Movie]) async def get_movies(): - return {"movies": ["movie1", "movie2", "movie3"]} + return get_all_movies() + + +@router.get("/next", response_model=Movie) +async def get_next_movie_endpoint(): + """Get the next movie to watch""" + next_movie = get_next_movie() + if next_movie is None: + return Response( + status_code=200, + media_type="application/json", + content=Message( + message="No more movies to watch", message_type="info" + ).model_dump_json(), + ) + return get_next_movie()