Coverage for app / routers / auth_router.py: 100%
26 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-21 22:41 +0300
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-21 22:41 +0300
1from typing import Annotated
3from fastapi import APIRouter, Depends, HTTPException, status
4from fastapi.security import OAuth2PasswordRequestForm
5from sqlalchemy.exc import SQLAlchemyError
6from sqlalchemy.ext.asyncio import AsyncSession
8from app.core.database import get_db
9from app.core.exceptions import AlreadyExistsError, AuthentificationError
10from app.schemas.user_schemas import AccessTokenInfo, UserRegister, UserRegisterResponse
11from app.services.user_service import login_user_service, register_user_service
13router = APIRouter(
14 prefix="/auth",
15 tags=["auth"],
16)
19@router.post("/register")
20async def register(
21 new_user: UserRegister,
22 db: Annotated[AsyncSession, Depends(get_db)],
23) -> UserRegisterResponse:
24 """
25 Вызывает сервис для регистрации пользователя.
27 Возвращает идентификатор пользователя и адрес электронной почты.
28 """
29 try:
30 user = await register_user_service(
31 db=db, email=new_user.email, password=new_user.password
32 )
33 return user
35 except AlreadyExistsError as e:
36 raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail=str(e))
38 except SQLAlchemyError:
39 raise HTTPException(
40 status.HTTP_500_INTERNAL_SERVER_ERROR,
41 detail="Database error",
42 )
45@router.post("/login")
46async def login(
47 form_data: Annotated[OAuth2PasswordRequestForm, Depends()],
48 db: Annotated[AsyncSession, Depends(get_db)],
49) -> AccessTokenInfo:
50 """
51 Вызывает сервис для проверки электронной почты и пароля пользователя.
53 Возвращает созданный JWT-токен и тип токена "Bearer".
54 """
55 try:
56 access_token = await login_user_service(
57 db=db,
58 email=form_data.username,
59 password=form_data.password,
60 )
61 except AuthentificationError as e:
62 raise HTTPException(
63 status_code=status.HTTP_401_UNAUTHORIZED,
64 detail=str(e),
65 )
67 return AccessTokenInfo(access_token=access_token, token_type="Bearer")