from datetime import timedelta from fastapi import APIRouter, Depends, HTTPException, status from fastapi.security import OAuth2PasswordRequestForm from sqlalchemy.orm import Session from database import get_db from schemas import UserCreate, UserResponse, Token from auth import ( authenticate_user, create_access_token, create_user, get_current_active_user ) from config import get_settings from models import User settings = get_settings() router = APIRouter(prefix="/api/auth", tags=["Authentication"]) @router.post("/register", response_model=UserResponse, status_code=status.HTTP_201_CREATED) async def register(user_data: UserCreate, db: Session = Depends(get_db)): """Регистрация нового пользователя""" user = create_user( db=db, username=user_data.username, email=user_data.email, password=user_data.password ) return user @router.post("/login", response_model=Token) async def login( form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db) ): """Вход в систему""" user = authenticate_user(db, form_data.username, form_data.password) if not user: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect username or password", headers={"WWW-Authenticate": "Bearer"}, ) # Обновление времени последнего входа from datetime import datetime user.last_login = datetime.utcnow() db.commit() access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES) access_token = create_access_token( data={"sub": user.username}, expires_delta=access_token_expires ) return {"access_token": access_token, "token_type": "bearer"} @router.get("/me", response_model=UserResponse) async def read_users_me(current_user: User = Depends(get_current_active_user)): """Получение информации о текущем пользователе""" return current_user @router.post("/logout") async def logout(current_user: User = Depends(get_current_active_user)): """Выход из системы""" return {"message": "Successfully logged out"}