"""Authentication API endpoints.""" from datetime import timedelta from fastapi import APIRouter, HTTPException, status from app.api.deps import Database, CurrentUser from app.config import get_settings from app.schemas.auth import UserCreate, UserLogin, UserResponse, Token from app.services.auth import AuthService router = APIRouter() settings = get_settings() @router.post("/register", response_model=UserResponse, status_code=status.HTTP_201_CREATED) async def register(user_data: UserCreate, db: Database): """Register a new user.""" # Check if user exists existing_user = await AuthService.get_user_by_email(db, user_data.email) if existing_user: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="Email already registered", ) # Create user user = await AuthService.create_user( db=db, email=user_data.email, password=user_data.password, name=user_data.name, ) return user @router.post("/login", response_model=Token) async def login(user_data: UserLogin, db: Database): """Authenticate user and return JWT token.""" user = await AuthService.authenticate_user(db, user_data.email, user_data.password) if not user: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect email or password", headers={"WWW-Authenticate": "Bearer"}, ) access_token_expires = timedelta(minutes=settings.access_token_expire_minutes) access_token = AuthService.create_access_token( data={"sub": str(user.id), "email": user.email}, expires_delta=access_token_expires, ) return Token( access_token=access_token, token_type="bearer", expires_in=settings.access_token_expire_minutes * 60, ) @router.get("/me", response_model=UserResponse) async def get_current_user_info(current_user: CurrentUser): """Get current user information.""" return current_user @router.put("/me", response_model=UserResponse) async def update_current_user( current_user: CurrentUser, db: Database, name: str = None, ): """Update current user information.""" if name is not None: current_user.name = name await db.commit() await db.refresh(current_user) return current_user