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": "Токены успешно обновлены"}