from fastapi import APIRouter, Depends, HTTPException, status from fastapi.security import OAuth2PasswordRequestForm from sqlalchemy.orm import Session from datetime import timedelta from app.db.session import get_db from app.services.user_service import UserService from app.schemas.user import UserCreate, User, Token, UserLogin from app.core.security import create_access_token from app.core.config import settings router = APIRouter() @router.post("/register", response_model=User, status_code=status.HTTP_201_CREATED) def register(user_data: UserCreate, db: Session = Depends(get_db)): user_service = UserService(db) existing_user = user_service.get_user_by_email(user_data.email) if existing_user: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="Email already registered" ) user = user_service.create_user(user_data) return user @router.post("/login", response_model=Token) def login(user_data: UserLogin, db: Session = Depends(get_db)): user_service = UserService(db) user = user_service.authenticate_user(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 = create_access_token( data={"sub": user.email}, expires_delta=access_token_expires ) return {"access_token": access_token, "token_type": "bearer"} @router.post("/token", response_model=Token) def login_for_access_token( form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db) ): user_service = UserService(db) user = user_service.authenticate_user(form_data.username, form_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 = create_access_token( data={"sub": user.email}, expires_delta=access_token_expires ) return {"access_token": access_token, "token_type": "bearer"}