from typing import Annotated from fastapi import APIRouter, Depends, HTTPException, status from fastapi.security import OAuth2PasswordRequestForm from sqlmodel import select from app.deps import SessionDep from app.models import User from app.schemas import Token, UserCreate, UserRead from app.security import create_access_token, get_password_hash, verify_password router = APIRouter(prefix="/api/auth", tags=["auth"]) @router.post("/register", response_model=UserRead, status_code=status.HTTP_201_CREATED) def register(user_in: UserCreate, session: SessionDep): existing_user = session.exec(select(User).where(User.username == user_in.username)).first() if existing_user: raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Username already registered") user = User(username=user_in.username, hashed_password=get_password_hash(user_in.password)) session.add(user) session.commit() session.refresh(user) return user @router.post("/token", response_model=Token) def login( form_data: Annotated[OAuth2PasswordRequestForm, Depends()], session: SessionDep, ): user = session.exec(select(User).where(User.username == form_data.username)).first() if not user or not verify_password(form_data.password, user.hashed_password): 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 Token(access_token=access_token)