from anydi import singleton from fansifter_common.adapters.twilio.client import TwilioClient from fansifter_common.adapters.twilio.enums import TwilioMessageNumberType from fansifter_common.utils import timezone from ows_text_campaigns.adapters.db import DB from ows_text_campaigns.adapters.db.decorators import transactional from ows_text_campaigns.campaigns.enums import MessageChannel from ows_text_campaigns.twilio.constants import SUPPORTED_COUNTRIES from ows_text_campaigns.twilio.models import TwilioMessagePricingByCountry from ows_text_campaigns.twilio.repositories import ( TwilioMessagePricingByCountryRepository, ) @singleton class SyncTwilioPricingHandler: def __init__( self, db: DB, repository: TwilioMessagePricingByCountryRepository, client: TwilioClient, ) -> None: self.db = db self.repository = repository self.client = client self.supported_countries = SUPPORTED_COUNTRIES @transactional def handle(self) -> None: pricing_list: list[TwilioMessagePricingByCountry] = [] created_at = timezone.now() for country_iso2 in self.supported_countries: pricing = self.client.get_message_country_pricing(country_iso2=country_iso2) min_current_price = 0.0 max_current_price = 0.0 for sms_price in pricing.outbound_sms_prices: for price in sms_price.prices: if price.number_type == TwilioMessageNumberType.MOBILE: if ( min_current_price > price.current_price or min_current_price == 0 ): min_current_price = price.current_price if max_current_price < price.current_price: max_current_price = price.current_price pricing_list.append( TwilioMessagePricingByCountry( country_iso2=country_iso2, currency=pricing.price_unit, message_type=MessageChannel.SMS, min_current_price=min_current_price, max_current_price=max_current_price, created_at=created_at, ) ) self.repository.add_all(pricing_list)