from typing import Optional import re from pydantic import BaseModel, field_validator from app.models.user import UserRole # Remove EmailStr import and use custom validation instead # Shared properties class UserBase(BaseModel): email: Optional[str] = None is_active: Optional[bool] = True role: Optional[UserRole] = None @field_validator('email') @classmethod def validate_email(cls, v): if v is None: return v pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$' if not re.match(pattern, v): raise ValueError('Invalid email format') return v # Properties to receive via API on creation class UserCreate(UserBase): email: str password: str role: UserRole = UserRole.USER # Properties to receive via API on update class UserUpdate(UserBase): password: Optional[str] = None class UserInDBBase(UserBase): id: Optional[int] = None role: UserRole = UserRole.USER class Config: from_attributes = True # Additional properties to return via API class User(UserInDBBase): pass # Additional properties stored in DB class UserInDB(UserInDBBase): hashed_password: str