from typing import Annotated from fastapi import APIRouter, Depends, Request, status from sqlalchemy.ext.asyncio import AsyncSession from app.api.deps import get_current_user from app.database import get_db from app.models.user import User from app.schemas.auth import ( AuthResponse, LoginRequest, RefreshRequest, TokenResponse, UserResponse, RegisterRequest, ) from app.services import auth_service router = APIRouter(prefix="/auth", tags=["auth"]) @router.post("/register", response_model=AuthResponse, status_code=status.HTTP_201_CREATED) async def register( data: RegisterRequest, request: Request, db: Annotated[AsyncSession, Depends(get_db)], ): return await auth_service.register_user( db, data, ip_address=request.client.host if request.client else None, device_info=request.headers.get("user-agent"), ) @router.post("/login", response_model=AuthResponse) async def login( data: LoginRequest, request: Request, db: Annotated[AsyncSession, Depends(get_db)], ): return await auth_service.login_user( db, email=data.email, password=data.password, remember_me=data.remember_me, ip_address=request.client.host if request.client else None, device_info=request.headers.get("user-agent"), ) @router.post("/refresh", response_model=TokenResponse) async def refresh( data: RefreshRequest, db: Annotated[AsyncSession, Depends(get_db)], ): return await auth_service.refresh_tokens(db, data.refresh_token) @router.post("/logout", status_code=status.HTTP_204_NO_CONTENT) async def logout( data: RefreshRequest, db: Annotated[AsyncSession, Depends(get_db)], ): await auth_service.logout_user(db, data.refresh_token) @router.get("/me", response_model=UserResponse) async def me(user: Annotated[User, Depends(get_current_user)]): return UserResponse.model_validate(user)