# App/Messages/Schema.py from pydantic import BaseModel, UUID4, Field, ConfigDict, condecimal, constr, validator from datetime import datetime from typing import Optional, Dict import uuid from pydantic import BaseModel, UUID4, Field, validator, ConfigDict from uuid import uuid4, UUID class TransactionSchema(BaseModel): transaction_id: str amount_received: float phone_number: str name: str date: datetime new_balance: float class PayloadSchema(BaseModel): message: str phoneNumber: str receivedAt: datetime simNumber: Optional[int] class MessageCreate(BaseModel): deviceId: Optional[str] event: Optional[str] id: Optional[str] payload: PayloadSchema webhookId: Optional[str] class MessageResponse(BaseModel): id: Optional[UUID4] = Field( default_factory=uuid.uuid4 ) # Automatically generate UUID4 if not provided device_id: Optional[str] = None event: Optional[str] = None message_id: Optional[str] = None webhook_id: Optional[str] = None message_content: Optional[str] = None phone_number: Optional[str] = None received_at: Optional[datetime] = None sim_number: Optional[int] = None parsed_data: Optional[Dict] = None # Include parsed_data in the response created_time: Optional[datetime] = None model_config = ConfigDict(from_attributes=True) @validator("id", pre=True, always=True) def validate_uuid(cls, v): """ Ensure all ID fields are valid UUIDs. If the input is invalid or missing, generate a new UUID. """ if v is None or not isinstance(v, (UUID, str)): return uuid4() # Generate a new UUID if not provided or invalid try: return UUID(v) # Validate and convert to UUID except ValueError: return uuid4() # Generate a new UUID if validation fails # class Config: # orm_mode = True # allow_population_by_field_name = True