import re from typing import Optional from pydantic import BaseModel, EmailStr, Field, field_validator def _validate_password_complexity(v: str) -> str: if not re.search(r'[A-Z]', v): raise ValueError('Password must contain at least one uppercase letter') if not re.search(r'[a-z]', v): raise ValueError('Password must contain at least one lowercase letter') if not re.search(r'[0-9]', v): raise ValueError('Password must contain at least one digit') return v class ChangePasswordRequest(BaseModel): current_password: str new_password: str = Field(..., min_length=10, description="Password must be at least 10 characters") @field_validator('new_password') @classmethod def password_complexity(cls, v: str) -> str: return _validate_password_complexity(v) class ForgotPasswordRequest(BaseModel): email: EmailStr class VerifyResetTokenRequest(BaseModel): token: str class VerifyResetTokenResponse(BaseModel): valid: bool email: Optional[str] = None class ResetPasswordRequest(BaseModel): token: str new_password: str = Field(..., min_length=10, description="Password must be at least 10 characters") @field_validator('new_password') @classmethod def password_complexity(cls, v: str) -> str: return _validate_password_complexity(v)