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(), )