from fastapi import APIRouter, Depends, HTTPException, status from fastapi.security import OAuth2PasswordRequestForm from sqlalchemy.orm import Session from typing import Optional from models import User from schemas import UserCreate, Token from utils import get_db, authenticate_user, create_access_token router = APIRouter() @router.post("/login", response_model=Token) async def login(form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db)): """ Authenticate a user and return an access token """ user = authenticate_user(db, form_data.username, form_data.password) if not user: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect username or password", headers={"WWW-Authenticate": "Bearer"}, ) access_token = create_access_token(data={"sub": user.username}) return {"access_token": access_token, "token_type": "bearer"} @router.post("/signup", response_model=Token, status_code=status.HTTP_201_CREATED) async def signup(user_data: UserCreate, db: Session = Depends(get_db)): """ Create a new user and return an access token """ existing_user = db.query(User).filter(User.username == user_data.username).first() if existing_user: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="Username already exists", ) new_user = User(**user_data.dict()) db.add(new_user) db.commit() db.refresh(new_user) access_token = create_access_token(data={"sub": new_user.username}) return {"access_token": access_token, "token_type": "bearer"}