54 lines
1.4 KiB
Python
54 lines
1.4 KiB
Python
from fastapi import APIRouter, Response
|
|
import bcrypt
|
|
|
|
from models.user import UserIn, UserOut, UserCredentials
|
|
from models.general import Message
|
|
from lib.database import get_all_users, get_user_by_username
|
|
|
|
|
|
router = APIRouter(
|
|
prefix="/user",
|
|
tags=["user"],
|
|
responses={404: {"description": "Not found"}},
|
|
)
|
|
|
|
|
|
@router.get("/", response_model=list[UserOut])
|
|
async def get_users() -> list[UserOut]:
|
|
"""Get all users"""
|
|
return get_all_users()
|
|
|
|
|
|
@router.post(
|
|
"/login",
|
|
responses={
|
|
200: {"model": UserOut, "description": "Login successful"},
|
|
400: {"model": Message},
|
|
404: {"model": Message},
|
|
},
|
|
)
|
|
async def login(user: UserCredentials):
|
|
"""Login a user"""
|
|
user_from_db: UserIn = get_user_by_username(user.username)
|
|
if user_from_db is None:
|
|
return Response(
|
|
status_code=404,
|
|
media_type="application/json",
|
|
content=Message(
|
|
message="User not found", message_type="error"
|
|
).model_dump_json(),
|
|
)
|
|
|
|
password = user.password.encode("utf-8")
|
|
|
|
if bcrypt.checkpw(password, user_from_db.password.encode("utf-8")):
|
|
return UserOut(**user_from_db.model_dump())
|
|
|
|
return Response(
|
|
status_code=400,
|
|
media_type="application/json",
|
|
content=Message(
|
|
message="Invalid password", message_type="error"
|
|
).model_dump_json(),
|
|
)
|