# auth.py - Keep security-critical validation import re from datetime import datetime from typing import Optional from pydantic import BaseModel, ConfigDict, EmailStr, Field, field_validator class UserRegister(BaseModel): email: EmailStr = Field(..., description="Valid email address") username: str = Field(..., description="Username") password: str = Field(..., description="Password") # Keep security validation in Pydantic for auth @field_validator("username") @classmethod def validate_username(cls, v): if not re.match(r"^[a-zA-Z0-9_]+$", v): raise ValueError("Username must contain only letters, numbers, or underscores") return v.lower().strip() @field_validator("password") @classmethod def validate_password(cls, v): if len(v) < 6: raise ValueError("Password must be at least 6 characters long") return v class UserLogin(BaseModel): username: str = Field(..., description="Username") password: str = Field(..., description="Password") vendor_code: Optional[str] = Field(None, description="Optional vendor code for context") @field_validator("username") @classmethod def validate_username(cls, v): return v.strip() class UserResponse(BaseModel): model_config = ConfigDict(from_attributes=True) id: int email: str username: str role: str is_active: bool last_login: Optional[datetime] = None created_at: datetime updated_at: datetime class LoginResponse(BaseModel): access_token: str token_type: str = "bearer" expires_in: int user: UserResponse