from fastapi import APIRouter, Depends, HTTPException, status, Body from fastapi.security import OAuth2PasswordRequestForm from sqlalchemy.ext.asyncio import AsyncSession from app.db.session import get_db from app.schemas.user import UserCreate, User from app.schemas.token import Token from app.services.auth_service import auth_service from app.api.deps import get_current_active_user router = APIRouter() @router.post("/register", response_model=User, status_code=status.HTTP_201_CREATED) async def register( user_in: UserCreate, db: AsyncSession = Depends(get_db) ): """Регистрация нового пользователя""" try: user = await auth_service.register(db, user_in) return user except ValueError as e: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail=str(e) ) @router.post("/login", response_model=Token) async def login( form_data: OAuth2PasswordRequestForm = Depends(), db: AsyncSession = Depends(get_db) ): """Аутентификация пользователя""" token = await auth_service.authenticate(db, form_data.username, form_data.password) if not token: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect email or password", headers={"WWW-Authenticate": "Bearer"}, ) return token @router.post("/refresh", response_model=Token) async def refresh_token( refresh_token: str = Body(..., embed=True) ): """Обновление access token""" new_access_token = auth_service.refresh_access_token(refresh_token) if not new_access_token: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid refresh token" ) return Token(access_token=new_access_token, token_type="bearer") @router.get("/me", response_model=User) async def read_users_me(current_user: User = Depends(get_current_active_user)): """Получить информацию о текущем пользователе""" return current_user