44 lines
2.0 KiB
Python
44 lines
2.0 KiB
Python
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')
|