75 lines
2.5 KiB
Python
75 lines
2.5 KiB
Python
from typing import List
|
|
from fastapi import APIRouter, Response, Depends
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.models import Dean
|
|
from app.auth.utils import authenticate_user, set_tokens
|
|
from app.dependencies.auth_dep import (
|
|
get_current_user,
|
|
check_refresh_token,
|
|
)
|
|
from app.dependencies.dao_dep import get_session_with_commit, get_session_without_commit
|
|
from app.exceptions import UserAlreadyExistsException, IncorrectEmailOrPasswordException
|
|
from app.auth.dao import DeansDAO
|
|
from app.auth.schemas import SDeanRegister, SDeanAuth, EmailModel, SDeanAddDB, SDeanInfo
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.post("/register/")
|
|
async def register_user(
|
|
user_data: SDeanRegister, session: AsyncSession = Depends(get_session_with_commit)
|
|
) -> dict:
|
|
# Проверка существования пользователя
|
|
user_dao = DeansDAO(session)
|
|
|
|
existing_user = await user_dao.find_one_or_none(
|
|
filters=EmailModel(email=user_data.email)
|
|
)
|
|
if existing_user:
|
|
raise UserAlreadyExistsException
|
|
|
|
# Подготовка данных для добавления
|
|
user_data_dict = user_data.model_dump()
|
|
user_data_dict.pop("confirm_password", None)
|
|
|
|
# Добавление пользователя
|
|
await user_dao.add(values=SDeanAddDB(**user_data_dict))
|
|
|
|
return {"message": "Вы успешно зарегистрированы!"}
|
|
|
|
|
|
@router.post("/login/")
|
|
async def auth_user(
|
|
response: Response,
|
|
user_data: SDeanAuth,
|
|
session: AsyncSession = Depends(get_session_without_commit),
|
|
) -> dict:
|
|
users_dao = DeansDAO(session)
|
|
user = await users_dao.find_one_or_none(filters=EmailModel(email=user_data.email))
|
|
|
|
if not (user and await authenticate_user(user=user, password=user_data.password)):
|
|
raise IncorrectEmailOrPasswordException
|
|
set_tokens(response, user.id)
|
|
return {"ok": True, "message": "Авторизация успешна!"}
|
|
|
|
|
|
@router.post("/logout")
|
|
async def logout(response: Response):
|
|
response.delete_cookie("user_access_token")
|
|
response.delete_cookie("user_refresh_token")
|
|
return {"message": "Пользователь успешно вышел из системы"}
|
|
|
|
|
|
@router.get("/me/")
|
|
async def get_me(user_data: Dean = Depends(get_current_user)) -> SDeanInfo:
|
|
return SDeanInfo.model_validate(user_data)
|
|
|
|
|
|
@router.post("/refresh")
|
|
async def process_refresh_token(
|
|
response: Response, user: Dean = Depends(check_refresh_token)
|
|
):
|
|
set_tokens(response, user.id)
|
|
return {"message": "Токены успешно обновлены"}
|