from typing import Annotated from anydi import Inject from fansifter_common.api.schemas import response_errors from fastapi import APIRouter, BackgroundTasks, Response from starlette import status from twilio.twiml.messaging_response import MessagingResponse from ows_text_campaigns.api.schemas import TwilioInboundMessageBody from ows_text_campaigns.twilio.exceptions import TwilioConnectionError from ows_text_campaigns.twilio.handlers import SyncTwilioPricingHandler from ows_text_campaigns.twilio.handlers.inbound import TwilioInboundMessageHandler router = APIRouter(prefix="/twilio", tags=["Twilio"]) @router.post( "/sync-pricing", operation_id="syncTwilioPricing", summary="Sync messaging pricing for TWILIO. Internal use only.", tags=["Internal"], responses=response_errors( TwilioConnectionError, ), status_code=status.HTTP_204_NO_CONTENT, ) def handle_sync_twilio_pricing( handler: Annotated[SyncTwilioPricingHandler, Inject()], ) -> None: handler.handle() @router.post( "/inbound", operation_id="TwilioInboundMessage", summary="Handle inbound message from Twilio.", ) def handle_twilio_inbound_message( handler: Annotated[TwilioInboundMessageHandler, Inject()], body: TwilioInboundMessageBody, background_tasks: BackgroundTasks, ) -> Response: background_tasks.add_task(handler.handle, body) response = MessagingResponse() return Response(content=str(response), media_type="application/xml")