2025-03-11 17:25:02 +00:00

51 lines
1.4 KiB
Python

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"}