from typing import Any from fastapi import APIRouter, Depends, HTTPException, Response, Request from fastapi.encoders import jsonable_encoder from sqlalchemy.orm import Session from fuware.core.config import get_app_settings from fuware.core.message_code import message_code from fuware.core.security.hasher import get_hasher from fuware.db.db_setup import generate_session from fuware.schemas import ReturnValue, UserRequest, PrivateUser, UserCreate from fuware.services import UserService public_router = APIRouter(tags=["Users: Authentication"]) user_service = UserService() hasher = get_hasher() settings = get_app_settings() message = message_code() @public_router.put('/register') def register_user(user: UserCreate, db: Session = Depends(generate_session)) -> ReturnValue[Any]: db_user = user_service.get_by_username(username=user.username) if db_user: raise HTTPException(status_code=400, detail=message.CREATED_USER) user_return = user_service.create(db=db, user=user) return ReturnValue(status=200, data=jsonable_encoder(user_return)) @public_router.post('/login', response_model=ReturnValue[PrivateUser]) def user_login(user: UserRequest, response: Response, db: Session = Depends(generate_session)) -> ReturnValue[Any]: db_user = user_service.check_exist(user=user) cookieEncode = user_service.check_login(db=db, user_id=db_user.id) response.set_cookie(key=settings.COOKIE_KEY, value=cookieEncode, max_age=86400, httponly=True) return ReturnValue(status=200, data=db_user) @public_router.get('/logout', response_model=ReturnValue[Any]) def user_logout(request: Request, response: Response, db: Session = Depends(generate_session)) -> ReturnValue[Any]: session_id = request.cookies.get(settings.COOKIE_KEY) if not session_id: response.delete_cookie(key=settings.COOKIE_KEY) return ReturnValue(status=200, data='Logged out') user_service.delete_session(db=db, user_ss=session_id) response.delete_cookie(key=settings.COOKIE_KEY) return ReturnValue(status=200, data='Logged out')