From 2a8595b5fda4f3e48a65dcbbb4598bbc701d5069 Mon Sep 17 00:00:00 2001 From: Esa Kataja Date: Sat, 9 Nov 2024 19:13:46 +0200 Subject: [PATCH] Add Admin add / remove users endpoints --- src/lib/database/admin.py | 47 +++++++++++++++++++++++++++++++++++++++ src/models/user.py | 11 ++++++++- src/routes/admin.py | 28 ++++++++++++++++------- 3 files changed, 77 insertions(+), 9 deletions(-) create mode 100644 src/lib/database/admin.py diff --git a/src/lib/database/admin.py b/src/lib/database/admin.py new file mode 100644 index 0000000..4656c1f --- /dev/null +++ b/src/lib/database/admin.py @@ -0,0 +1,47 @@ +from lib.database.database import db_run +from models import Message +from models.user import UserCredentials +from models.movie import Movie +from models.card import Card + +import bcrypt + + +def add_user(user: UserCredentials): + hashed_password = bcrypt.hashpw( + user.password.encode("utf-8"), bcrypt.gensalt() + ).decode("utf-8") + 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") + + return Message(message="User added successfully", message_type="success") + + +def remove_user(user_id: str): + sql = f"DELETE FROM users WHERE id = '{user_id}'" + + try: + db_run(sql) + except: + return Message(message="User not found", message_type="error") + + return Message(message="User removed successfully", message_type="success") + + +def add_movie(movie: Movie): + pass + + +def remove_movie(movie_id: str): + pass + + +def add_card(card: Card): + pass + + +def remove_card(card_id: str): + pass diff --git a/src/models/user.py b/src/models/user.py index 3846424..8d44aa2 100644 --- a/src/models/user.py +++ b/src/models/user.py @@ -1,6 +1,7 @@ from pydantic import BaseModel, Field from datetime import datetime from typing import Optional +import bcrypt from lib import settings @@ -44,9 +45,17 @@ class UserBase(BaseModel): class UserIn(UserBase): password: Optional[str] = Field( - default=None, description="Password of the user", examples=["password"] + default=None, + description="Password of the user", + examples=[bcrypt.hashpw("password".encode("utf-8"), bcrypt.gensalt())], ) + @property + def hashed_password(self): + return bcrypt.hashpw(self.password.encode("utf-8"), bcrypt.gensalt()).decode( + "utf-8" + ) + class UserOut(UserBase): pass diff --git a/src/routes/admin.py b/src/routes/admin.py index 2920f95..7f60ccd 100644 --- a/src/routes/admin.py +++ b/src/routes/admin.py @@ -1,5 +1,17 @@ from fastapi import APIRouter +from models import Message +from models.user import UserIn, UserCredentials +from models.movie import Movie +from lib.database.admin import ( + add_user, + remove_user, + add_movie, + remove_movie, + add_card, + remove_card, +) + router = APIRouter( prefix="/admin", tags=["admin"], @@ -8,36 +20,36 @@ router = APIRouter( @router.post("/user") -async def add_user(user: str): +async def add_user_endpoint(user: UserCredentials): """Add a user to the database""" - return {"user": user} + return add_user(user) @router.delete("/user") -async def remove_user(user: str): +async def remove_user_endpoint(user_id: str): """Remove a user from the database""" - return {"user": user} + return remove_user(user_id) @router.post("/movie") -async def add_movie(movie: str): +async def add_movie_endpoint(movie: Movie): """Add a movie to the database""" return {"movie": movie} @router.delete("/movie") -async def remove_movie(movie: str): +async def remove_movie_endpoint(movie: str): """Remove a movie from the database""" return {"movie": movie} @router.post("/card") -async def add_card(card: str): +async def add_card_endpoint(card: str): """Add a card to the database""" return {"card": card} @router.delete("/card") -async def remove_card(card: str): +async def remove_card_endpoint(card: str): """Remove a card from the database""" return {"card": card}