from typing import Optional from pydantic import BaseModel, EmailStr, Field import enum class UserRole(str, enum.Enum): USER = "user" ADMIN = "admin" class UserBase(BaseModel): email: EmailStr full_name: Optional[str] = None is_active: Optional[bool] = True class UserCreate(UserBase): password: str role: Optional[UserRole] = UserRole.USER class UserUpdate(BaseModel): email: Optional[EmailStr] = None full_name: Optional[str] = None password: Optional[str] = None is_active: Optional[bool] = None class UserInDBBase(UserBase): id: int is_verified: bool is_kyc_verified: bool role: UserRole is_two_factor_enabled: bool class Config: orm_mode = True class User(UserInDBBase): pass class UserInDB(UserInDBBase): hashed_password: str class Token(BaseModel): access_token: str token_type: str refresh_token: Optional[str] = None requires_two_factor: Optional[bool] = False class TokenPayload(BaseModel): sub: str exp: int role: str class RefreshToken(BaseModel): refresh_token: str class PasswordReset(BaseModel): email: EmailStr class PasswordResetConfirm(BaseModel): token: str new_password: str class EmailVerification(BaseModel): token: str class TwoFactorSetup(BaseModel): password: str class TwoFactorVerify(BaseModel): code: str = Field(..., min_length=6, max_length=6) class TwoFactorLogin(BaseModel): token: str code: str = Field(..., min_length=6, max_length=6) class TwoFactorDisable(BaseModel): password: str code: str = Field(..., min_length=6, max_length=6)