import json from datetime import datetime from typing import Optional, Any, Dict from pydantic import BaseModel, field_validator class NotificationOutboxBase(BaseModel): msg_id: Optional[str] = None channel: Optional[str] = None payload: Optional[Dict[str, Any]] = None priority: Optional[int] = 10 status: Optional[str] = "pending" attempts: Optional[int] = 0 next_retry_at: Optional[datetime] = None @field_validator("payload", mode="before") def normalize_json_field(cls, v): if v is None: return None if isinstance(v, str): try: return json.loads(v) except Exception: return {} return v class NotificationOutboxCreate(NotificationOutboxBase): channel: str payload: Dict[str, Any] class NotificationOutboxUpdate(BaseModel): channel: Optional[str] = None payload: Optional[Dict[str, Any]] = None priority: Optional[int] = None status: Optional[str] = None attempts: Optional[int] = None next_retry_at: Optional[datetime] = None @field_validator("payload", mode="before") def normalize_json_field(cls, v): if v is None: return None if isinstance(v, str): try: return json.loads(v) except Exception: return {} return v class NotificationOutboxOut(NotificationOutboxBase): id: int created_at: datetime updated_at: datetime model_config = { "from_attributes": True }