Refactor models and endpoints, add logging, and improve error handling.

This commit is contained in:
Esa Kataja
2024-12-01 22:29:00 +02:00
parent cecd9a4458
commit b5e693ab9f
8 changed files with 174 additions and 77 deletions
+55 -18
View File
@@ -1,10 +1,14 @@
from datetime import datetime
import bcrypt
import requests
from lib.database.database import db_run
from models import Message
from models.user import UserCredentials
from models.movie import Movie
from models.movie import MovieIn, Movie
from models.card import Card
import bcrypt
from lib.settings import settings
from lib.logger import logger
def add_user(user: UserCredentials):
@@ -14,40 +18,71 @@ def add_user(user: UserCredentials):
sql = f"INSERT INTO users (username, password) VALUES ('{user.username}', '{hashed_password}')"
try:
db_run(sql)
except:
return Message(message="User already exists", message_type="error")
except Exception as e:
return Message(message=f"User already exists. Error: {e}", message_type="error")
return Message(message="User added successfully", message_type="success")
def remove_user(user_id: str):
logger.debug(f"Removing user {user_id}")
sql = f"DELETE FROM users WHERE id = '{user_id}'"
try:
db_run(sql)
except:
return Message(message="User not found", message_type="error")
except Exception as e:
return Message(message=f"User not found. Error: {e}", message_type="error")
return Message(message="User removed successfully", message_type="success")
def add_movie(movie: Movie):
sql = "INSERT INTO movies (name, imdb_id, actors, release_date, plot, showtime) VALUES (?, ?, ?, ?, ?, ?)"
def add_movie(movie: MovieIn):
logger.info(f"Adding movie {movie.imdb_id}")
logger.debug(f"Requesting movie data from OMDB: {movie.imdb_id}")
request_url = "https://omdbapi.com/"
request_params = {
"apikey": settings.OMDB_API_KEY,
"i": movie.imdb_id,
}
response = requests.get(request_url, params=request_params)
if response.status_code != 200:
logger.error(f"Failed to add movie {movie.imdb_id}")
return Message(message="Failed to add movie", message_type="error")
movie_data = response.json()
logger.debug(f"Movie data received from OMDB: {movie_data}")
if "Released" in movie_data:
movie_data["Released"] = datetime.strptime(movie_data["Released"], "%d %b %Y")
new_movie = Movie(
name=movie_data["Title"],
imdb_id=movie_data["imdbID"],
actors=[actor.strip() for actor in movie_data["Actors"].split(",")],
release_date=movie_data["Released"],
plot=movie.plot,
poster_url=movie_data["Poster"],
showtime=movie.showtime,
)
logger.debug(f"Movie data: {new_movie.model_dump()}")
sql = "INSERT INTO movies (name, imdb_id, actors, release_date, plot, showtime, poster_url) VALUES (?, ?, ?, ?, ?, ?, ?)"
try:
db_run(
sql,
(
movie.name,
movie.imdb_id,
movie.actors,
movie.release_date,
movie.plot,
movie.showtime,
new_movie.name,
new_movie.imdb_id,
new_movie.actors,
new_movie.release_date,
new_movie.plot,
new_movie.showtime,
new_movie.poster_url,
),
)
except:
except Exception as e:
logger.error(f"Failed to add movie {movie.imdb_id}. Error: {e}")
return Message(message="Failed to add movie", message_type="error")
logger.info(f"Movie {movie.imdb_id} added successfully")
return Message(message="Movie added successfully", message_type="success")
@@ -55,8 +90,10 @@ def set_movie_watched(movie_id: str):
sql = f"UPDATE movies SET is_watched = TRUE WHERE id = '{movie_id}'"
try:
db_run(sql)
except:
return Message(message="Failed to set movie as watched", message_type="error")
except Exception as e:
return Message(
message=f"Failed to set movie as watched. Error: {e}", message_type="error"
)
return Message(message="Movie set as watched successfully", message_type="success")
+12 -15
View File
@@ -1,25 +1,22 @@
from models.movie import Movie
from lib.database.database import get_db
from lib.logger import logger
@logger.catch
def get_all_movies() -> list[Movie]:
logger.info("Getting all movies")
sql = "SELECT * FROM movies"
with get_db() as conn:
result = conn.execute(sql).fetchall()
result = conn.execute(sql).df()
result_dict = result.to_dict(orient="records")
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],
)
for row in result_dict:
row["id"] = str(row["id"])
logger.debug(f"Found movie: {row}")
print("Type of name:", type(row["name"]))
movie = Movie(**row)
movies.append(movie)
return movies
@@ -28,7 +25,7 @@ def get_all_movies() -> list[Movie]:
def get_next_movie() -> Movie | None:
sql = "SELECT * FROM movies WHERE is_watched = FALSE AND showtime > CURRENT_TIMESTAMP ORDER BY showtime ASC"
sql = "SELECT * FROM movies WHERE is_watched = FALSE AND showtime = CURRENT_DATE ORDER BY showtime ASC"
with get_db() as conn:
result = conn.execute(sql).fetchdf()
if result.empty:
+2 -1
View File
@@ -1,11 +1,12 @@
from datetime import datetime
from models.user import UserIn, UserOut
from lib.database.database import get_db, db_run
from lib.database.database import get_db
from lib.logger import logger
def set_last_login(user_id: str) -> datetime:
logger.debug(f"Setting last login for user {user_id}")
cur_time = datetime.now()
sql = f"UPDATE users SET last_login = '{cur_time}' WHERE id = '{user_id}'"
with get_db() as conn: