"""Authentication routes.""" from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from app.database import get_db from app.models import User from app.schemas import UserRegister, UserLogin, TokenResponse, UserResponse from app.auth import hash_password, verify_password, create_access_token router = APIRouter(prefix="/auth", tags=["auth"]) @router.post("/register", response_model=TokenResponse) def register(user_data: UserRegister, db: Session = Depends(get_db)): """Register a new user.""" # Check if user already exists existing_user = db.query(User).filter( (User.username == user_data.username) | (User.email == user_data.email) ).first() if existing_user: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="Username or email already registered" ) # Create new user hashed_password = hash_password(user_data.password) new_user = User( username=user_data.username, email=user_data.email, hashed_password=hashed_password ) db.add(new_user) db.commit() db.refresh(new_user) # Create access token access_token = create_access_token(data={"sub": new_user.id}) return { "access_token": access_token, "token_type": "bearer", "user": UserResponse.from_orm(new_user) } @router.post("/login", response_model=TokenResponse) def login(user_data: UserLogin, db: Session = Depends(get_db)): """Login a user.""" user = db.query(User).filter(User.username == user_data.username).first() if not user or not verify_password(user_data.password, user.hashed_password): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid username or password" ) # Create access token access_token = create_access_token(data={"sub": user.id}) return { "access_token": access_token, "token_type": "bearer", "user": UserResponse.from_orm(user) }