from typing import Optional from pydantic import BaseModel, EmailStr, validator from sqlalchemy.orm import Session from models import User class UserCreate(BaseModel): username: str email: EmailStr password: str @validator('username') def validate_username(cls, username): if len(username) < 3: raise ValueError('Username must be at least 3 characters long') return username @validator('password') def validate_password(cls, password): if len(password) < 8: raise ValueError('Password must be at least 8 characters long') return password def validate_email(email: str) -> bool: """ Validate an email address format. Args: email: The email address to validate Returns: bool: True if email format is valid, False otherwise """ pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$' return bool(re.match(pattern, email)) def get_user_by_email(db: Session, email: str) -> Optional[User]: """ Get a user by their email address. Args: db: Database session email: Email to search for Returns: User object if found, None otherwise """ return db.query(User).filter(User.email == email).first() def create_user(db: Session, user_data: UserCreate) -> User: """ Create a new user with validation and error handling. Args: db: Database session user_data: User data for creation Returns: User object if created successfully, raises ValueError otherwise """ # Check if email is valid if not validate_email(user_data.email): raise ValueError("Invalid email format") # Check if user already exists existing_user = get_user_by_email(db, user_data.email) if existing_user: raise ValueError("Email already registered") # Create the user db_user = User( username=user_data.username, email=user_data.email, password=user_data.password # In a real app, hash this password ) db.add(db_user) db.commit() db.refresh(db_user) return db_user