43 lines
1.5 KiB
Python
43 lines
1.5 KiB
Python
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
|