""" Authentication API routes """ from fastapi import APIRouter, Depends, HTTPException, status, Request from sqlalchemy.ext.asyncio import AsyncSession import logging from app.core.database import get_db from app.schemas.auth import UserRegistration, UserLogin, TokenResponse, RefreshTokenRequest, UserResponse from app.services.auth_service import AuthService from app.core.security import security_manager logger = logging.getLogger(__name__) router = APIRouter() @router.post("/register", response_model=UserResponse) async def register( user_data: UserRegistration, db: AsyncSession = Depends(get_db) ): """Register a new user""" try: return await AuthService.register_user(user_data, db) except HTTPException: raise except Exception as e: logger.error(f"Registration error: {e}") raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Registration failed" ) @router.post("/login", response_model=TokenResponse) async def login( login_data: UserLogin, request: Request, db: AsyncSession = Depends(get_db) ): """User login""" try: ip_address = request.client.host user_agent = request.headers.get("user-agent", "") return await AuthService.login_user(login_data, db, ip_address, user_agent) except HTTPException: raise except Exception as e: logger.error(f"Login error: {e}") raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Login failed" ) @router.post("/refresh", response_model=TokenResponse) async def refresh_token( refresh_data: RefreshTokenRequest, db: AsyncSession = Depends(get_db) ): """Refresh access token""" try: return await AuthService.refresh_token(refresh_data.refresh_token, db) except HTTPException: raise except Exception as e: logger.error(f"Token refresh error: {e}") raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Token refresh failed" ) @router.post("/verify") async def verify_token( request: Request, db: AsyncSession = Depends(get_db) ): """Verify access token""" try: auth_header = request.headers.get("Authorization") if not auth_header or not auth_header.startswith("Bearer "): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Authorization header required" ) token = auth_header.split(" ")[1] return await AuthService.verify_token(token, db) except HTTPException: raise except Exception as e: logger.error(f"Token verification error: {e}") raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Token verification failed" ) @router.post("/logout") async def logout( request: Request, db: AsyncSession = Depends(get_db) ): """User logout""" try: auth_header = request.headers.get("Authorization") if not auth_header or not auth_header.startswith("Bearer "): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Authorization header required" ) token = auth_header.split(" ")[1] user_data = await AuthService.verify_token(token, db) await AuthService.logout_user(user_data["user_id"], db) return {"message": "Logged out successfully"} except HTTPException: raise except Exception as e: logger.error(f"Logout error: {e}") raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Logout failed" )