from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from .. import schemas, models, auth, database router = APIRouter(prefix="/users", tags=["users"]) @router.post("/register", response_model=schemas.UserRead, status_code=status.HTTP_201_CREATED) def register(user_in: schemas.UserCreate, db: Session = Depends(database.get_db)): existing_user = db.query(models.User).filter( (models.User.username == user_in.username) | (models.User.email == user_in.email) ).first() if existing_user: raise HTTPException(status_code=400, detail="Username or email already registered") hashed_password = auth.get_password_hash(user_in.password) user = models.User(username=user_in.username, email=user_in.email, hashed_password=hashed_password) db.add(user) db.commit() db.refresh(user) return user @router.post("/login", response_model=schemas.Token) def login(form_data: auth.OAuth2PasswordRequestForm = Depends(), db: Session = Depends(database.get_db)): user = auth.authenticate_user(db, form_data.username, form_data.password) if not user: raise HTTPException(status_code=401, detail="Incorrect username or password", headers={"WWW-Authenticate": "Bearer"}) access_token = auth.create_access_token(data={"sub": user.username}) return {"access_token": access_token, "token_type": "bearer"} @router.get("/me", response_model=schemas.UserRead) def read_current_user(current_user: models.User = Depends(auth.get_current_user)): return current_user