from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from .. import auth, schemas from ..database import get_db from ..models import User router = APIRouter(prefix="/auth", tags=["auth"]) @router.post("/signup", response_model=schemas.TokenResponse, status_code=status.HTTP_201_CREATED) def signup(payload: schemas.SignupRequest, db: Session = Depends(get_db)): existing = db.query(User).filter(User.email == payload.email.lower()).first() if existing: raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="Email already registered") user = User( email=payload.email.lower(), hashed_password=auth.hash_password(payload.password), display_name=payload.display_name, ) db.add(user) db.commit() db.refresh(user) token = auth.create_access_token(user.id) return schemas.TokenResponse(access_token=token) @router.post("/login", response_model=schemas.TokenResponse) def login(payload: schemas.LoginRequest, db: Session = Depends(get_db)): user = db.query(User).filter(User.email == payload.email.lower()).first() if not user or not auth.verify_password(payload.password, user.hashed_password): raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid email or password") token = auth.create_access_token(user.id) return schemas.TokenResponse(access_token=token) @router.get("/me", response_model=schemas.UserOut) def me(current_user: User = Depends(auth.get_current_user)): return current_user