from typing import Optional from fastapi import APIRouter, Depends, HTTPException, status from pydantic import BaseModel, EmailStr, validator from models import User from database import SessionLocal, engine from passlib.context import CryptContext router = APIRouter() # Password hashing pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") # User model for sign up class UserCreate(BaseModel): username: str email: EmailStr password: str @validator('username') def username_alphanumeric(cls, v): assert v.isalnum(), 'Username must be alphanumeric' return v # Helper function to get database session def get_db(): db = SessionLocal() try: yield db finally: db.close() @router.post("/signup", status_code=status.HTTP_201_CREATED) async def signup(user: UserCreate, db: SessionLocal = Depends(get_db)): """ Create a new user account """ # Check if user already exists existing_user = db.query(User).filter(User.email == user.email).first() if existing_user: raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Email already registered") # Hash the password hashed_password = pwd_context.hash(user.password) # Create the new user new_user = User(username=user.username, email=user.email, hashed_password=hashed_password) db.add(new_user) db.commit() db.refresh(new_user) return {"message": "User created successfully"}