from pydantic import BaseModel, EmailStr, Field from typing import Optional, List from datetime import datetime import uuid class UserBase(BaseModel): email: EmailStr first_name: str last_name: Optional[str] = None phone_number: Optional[str] = None status: Optional[str] = "active" class UserSignup(UserBase): password: str = Field(..., min_length=8) class UserSignin(BaseModel): email: EmailStr password: str class AccessInRole(BaseModel): id: str access_code: str category: str name: str class RoleInUser(BaseModel): id: uuid.UUID role_name: str accesses: List[str] = [] class UserResponse(UserBase): id: uuid.UUID tenant_id: Optional[uuid.UUID] = None tenant_name: Optional[str] = None tenant_logo_url: Optional[str] = None created_at: datetime updated_at: datetime role: Optional[RoleInUser] = None class Config: from_attributes = True class UserUpdate(BaseModel): first_name: Optional[str] = None last_name: Optional[str] = None phone_number: Optional[str] = None email: Optional[EmailStr] = None status: Optional[str] = None class TokenResponse(BaseModel): access_token: str refresh_token: str token_type: str = "bearer" user: UserResponse class RefreshTokenRequest(BaseModel): refresh_token: str class ResetPassword(BaseModel): old_password: str new_password: str = Field(..., min_length=8) class ForgotPasswordRequest(BaseModel): email: EmailStr class VerifyOTPRequest(BaseModel): email: EmailStr otp: str = Field(..., min_length=6, max_length=6, pattern=r'^\d{6}$') class ResetPasswordWithOTP(BaseModel): email: EmailStr otp: str = Field(..., min_length=6, max_length=6, pattern=r'^\d{6}$') new_password: str = Field(..., min_length=8)