from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from ..database import get_db from .. import models from ..auth import verify_password, hash_password, create_access_token, get_current_user from ..schemas import UserCreate, UserOut, Token, LoginRequest router = APIRouter(prefix="/auth", tags=["Authentication"]) @router.post("/signup", response_model=Token, status_code=status.HTTP_201_CREATED) def signup(payload: UserCreate, db: Session = Depends(get_db)): if db.query(models.User).filter(models.User.username == payload.username).first(): raise HTTPException(status_code=400, detail="Username already taken") if db.query(models.User).filter(models.User.email == payload.email).first(): raise HTTPException(status_code=400, detail="Email already registered") user = models.User( username=payload.username, email=payload.email, hashed_password=hash_password(payload.password), ) db.add(user) db.commit() db.refresh(user) token = create_access_token({"sub": user.username}) return Token(access_token=token, user=UserOut.model_validate(user)) @router.post("/login", response_model=Token) def login(payload: LoginRequest, db: Session = Depends(get_db)): user = db.query(models.User).filter(models.User.username == payload.username).first() if not user or not verify_password(payload.password, user.hashed_password): raise HTTPException(status_code=401, detail="Invalid username or password") token = create_access_token({"sub": user.username}) return Token(access_token=token, user=UserOut.model_validate(user)) @router.get("/me", response_model=UserOut) def me(current_user: models.User = Depends(get_current_user)): return current_user