Spaces:
Running
Running
| """ | |
| Database Models | |
| Pydantic models for database tables | |
| """ | |
| from datetime import datetime | |
| from typing import Optional, List, Any | |
| from pydantic import BaseModel, Field | |
| from enum import Enum | |
| # ============================================================================ | |
| # ENUMS | |
| # ============================================================================ | |
| class UserRole(str, Enum): | |
| USER = "user" | |
| ADMIN = "admin" | |
| SUPER_ADMIN = "super_admin" | |
| class AdminRole(str, Enum): | |
| MODERATOR = "moderator" | |
| ADMIN = "admin" | |
| SUPER_ADMIN = "super_admin" | |
| class MessageRole(str, Enum): | |
| USER = "user" | |
| ASSISTANT = "assistant" | |
| SYSTEM = "system" | |
| class MemoryLayer(str, Enum): | |
| MID_TERM = "mid_term" | |
| LONG_TERM = "long_term" | |
| class ProcessingStatus(str, Enum): | |
| PENDING = "pending" | |
| PROCESSING = "processing" | |
| COMPLETED = "completed" | |
| FAILED = "failed" | |
| class Theme(str, Enum): | |
| LIGHT = "light" | |
| DARK = "dark" | |
| SYSTEM = "system" | |
| # ============================================================================ | |
| # USER MODELS | |
| # ============================================================================ | |
| class UserProfile(BaseModel): | |
| """User profile model""" | |
| id: str # UUID | |
| email: str | |
| full_name: Optional[str] = None | |
| avatar_url: Optional[str] = None | |
| company_name: Optional[str] = None | |
| role: UserRole = UserRole.USER | |
| is_active: bool = True | |
| created_at: datetime = Field(default_factory=datetime.now) | |
| updated_at: datetime = Field(default_factory=datetime.now) | |
| class UserProfileCreate(BaseModel): | |
| """Create user profile""" | |
| email: str | |
| full_name: Optional[str] = None | |
| company_name: Optional[str] = None | |
| class UserProfileUpdate(BaseModel): | |
| """Update user profile""" | |
| full_name: Optional[str] = None | |
| avatar_url: Optional[str] = None | |
| company_name: Optional[str] = None | |
| class AdminUser(BaseModel): | |
| """Admin user model""" | |
| id: str | |
| user_id: str | |
| admin_role: AdminRole = AdminRole.MODERATOR | |
| permissions: dict = {} | |
| granted_by: Optional[str] = None | |
| granted_at: datetime = Field(default_factory=datetime.now) | |
| is_active: bool = True | |
| notes: Optional[str] = None | |
| # ============================================================================ | |
| # CONVERSATION MODELS | |
| # ============================================================================ | |
| class Conversation(BaseModel): | |
| """Conversation model""" | |
| id: str | |
| user_id: str | |
| title: Optional[str] = None | |
| mode: str = "auto" | |
| is_archived: bool = False | |
| message_count: int = 0 | |
| last_message_at: Optional[datetime] = None | |
| created_at: datetime = Field(default_factory=datetime.now) | |
| updated_at: datetime = Field(default_factory=datetime.now) | |
| class ConversationCreate(BaseModel): | |
| """Create conversation""" | |
| title: Optional[str] = None | |
| mode: str = "auto" | |
| class Message(BaseModel): | |
| """Message model""" | |
| id: str | |
| conversation_id: str | |
| user_id: str | |
| role: MessageRole | |
| content: str | |
| mode: Optional[str] = None | |
| sources: Optional[List[str]] = None | |
| metadata: dict = {} | |
| created_at: datetime = Field(default_factory=datetime.now) | |
| class MessageCreate(BaseModel): | |
| """Create message""" | |
| conversation_id: str | |
| role: MessageRole | |
| content: str | |
| mode: Optional[str] = None | |
| sources: Optional[List[str]] = None | |
| metadata: dict = {} | |
| # ============================================================================ | |
| # FILE MODELS | |
| # ============================================================================ | |
| class UserFile(BaseModel): | |
| """User file metadata model""" | |
| id: str | |
| user_id: str | |
| filename: str | |
| original_filename: str | |
| file_type: str | |
| file_size: int | |
| mime_type: Optional[str] = None | |
| storage_path: str | |
| bucket_name: str = "user-files" | |
| is_processed: bool = False | |
| is_indexed: bool = False | |
| processing_status: ProcessingStatus = ProcessingStatus.PENDING | |
| processing_error: Optional[str] = None | |
| metadata: dict = {} | |
| uploaded_at: datetime = Field(default_factory=datetime.now) | |
| processed_at: Optional[datetime] = None | |
| class UserFileCreate(BaseModel): | |
| """Create user file record""" | |
| filename: str | |
| original_filename: str | |
| file_type: str | |
| file_size: int | |
| mime_type: Optional[str] = None | |
| storage_path: str | |
| metadata: dict = {} | |
| # ============================================================================ | |
| # QUERY MODELS | |
| # ============================================================================ | |
| class UserQuery(BaseModel): | |
| """User query log model""" | |
| id: str | |
| user_id: str | |
| conversation_id: Optional[str] = None | |
| query_text: str | |
| query_type: Optional[str] = None | |
| response_time_ms: Optional[int] = None | |
| tokens_used: Optional[int] = None | |
| cache_hit: bool = False | |
| sources_used: Optional[List[str]] = None | |
| created_at: datetime = Field(default_factory=datetime.now) | |
| class UserQueryCreate(BaseModel): | |
| """Create query log""" | |
| conversation_id: Optional[str] = None | |
| query_text: str | |
| query_type: Optional[str] = None | |
| response_time_ms: Optional[int] = None | |
| tokens_used: Optional[int] = None | |
| cache_hit: bool = False | |
| sources_used: Optional[List[str]] = None | |
| # ============================================================================ | |
| # MEMORY MODELS | |
| # ============================================================================ | |
| class UserMemory(BaseModel): | |
| """User memory model""" | |
| id: str | |
| user_id: str | |
| memory_layer: MemoryLayer | |
| memory_type: str | |
| content: dict | |
| embedding: Optional[List[float]] = None | |
| metadata: dict = {} | |
| confidence: Optional[float] = None | |
| expires_at: Optional[datetime] = None | |
| access_count: int = 0 | |
| last_accessed: Optional[datetime] = None | |
| created_at: datetime = Field(default_factory=datetime.now) | |
| updated_at: datetime = Field(default_factory=datetime.now) | |
| class UserMemoryCreate(BaseModel): | |
| """Create memory entry""" | |
| memory_layer: MemoryLayer | |
| memory_type: str | |
| content: dict | |
| metadata: dict = {} | |
| confidence: Optional[float] = None | |
| expires_at: Optional[datetime] = None | |
| # ============================================================================ | |
| # PREFERENCES MODELS | |
| # ============================================================================ | |
| class UserPreferences(BaseModel): | |
| """User preferences model""" | |
| id: str | |
| user_id: str | |
| theme: Theme = Theme.DARK | |
| currency_code: str = "INR" | |
| currency_symbol: str = "₹" | |
| language: str = "en" | |
| notifications_enabled: bool = True | |
| email_notifications: bool = True | |
| auto_save_conversations: bool = True | |
| default_chat_mode: str = "auto" | |
| custom_settings: dict = {} | |
| created_at: datetime = Field(default_factory=datetime.now) | |
| updated_at: datetime = Field(default_factory=datetime.now) | |
| class UserPreferencesUpdate(BaseModel): | |
| """Update user preferences""" | |
| theme: Optional[Theme] = None | |
| currency_code: Optional[str] = None | |
| currency_symbol: Optional[str] = None | |
| language: Optional[str] = None | |
| notifications_enabled: Optional[bool] = None | |
| email_notifications: Optional[bool] = None | |
| auto_save_conversations: Optional[bool] = None | |
| default_chat_mode: Optional[str] = None | |
| custom_settings: Optional[dict] = None | |
| # ============================================================================ | |
| # AUTH MODELS | |
| # ============================================================================ | |
| class AuthSignUp(BaseModel): | |
| """Signup request""" | |
| email: str | |
| password: str | |
| full_name: Optional[str] = None | |
| company_name: Optional[str] = None | |
| class AuthLogin(BaseModel): | |
| """Login request""" | |
| email: str | |
| password: str | |
| class AuthMagicLink(BaseModel): | |
| """Magic link request""" | |
| email: str | |
| class AuthResponse(BaseModel): | |
| """Auth response""" | |
| user: Optional[UserProfile] = None | |
| access_token: Optional[str] = None | |
| refresh_token: Optional[str] = None | |
| expires_at: Optional[int] = None | |
| message: Optional[str] = None | |
| class AuthUser(BaseModel): | |
| """Authenticated user from JWT""" | |
| id: str | |
| email: str | |
| role: UserRole = UserRole.USER | |
| is_admin: bool = False | |