from typing import Literal, TypedDict from owsclient import OwsClient from pydantic import BaseModel, RootModel MessageChannel = Literal["SMS", "WHATSAPP"] class PersonalizedAttributes(TypedDict): fan_id: str phone_number: str channel: MessageChannel class RenderedMessage(BaseModel): fan_id: str channel: MessageChannel recipient: str sender: str message: str media_url: str | list[str] | None RenderedMessages = RootModel[list[RenderedMessage]] class OwsTextCampaignsClient: service_name = "ows-text-campaigns" def __init__(self, ows_client: OwsClient) -> None: self.ows_client = ows_client def render_messages( self, campaign_id: str, *, attributes: list[PersonalizedAttributes] ) -> list[RenderedMessage]: if not attributes: return [] response = self.ows_client.post( self.service_name, f"/campaigns/{campaign_id}/messages/batch-render", json={ "personalized_attributes": attributes, }, ) return RenderedMessages.model_validate_json(response.content).root