from __future__ import annotations import datetime from collections import defaultdict from dataclasses import dataclass from anydi import singleton from fansifter_common.auth.requests import AuthRequest from fansifter_common.auth.services import AuthService from fansifter_common.auth.types import Permission from ows_text_campaigns.campaigns.repositories import CampaignRepository from ows_text_campaigns.campaigns.services import CampaignService from ows_text_campaigns.campaigns.types import CampaignSendCountry, SendTimezone @dataclass(kw_only=True) class GetCampaignSendTimezonesRequest(AuthRequest): campaign_id: str send_at: datetime.datetime @dataclass(kw_only=True) class GetCampaignSendTimezonesResponse: send_at: datetime.datetime countries: list[CampaignSendCountry] @singleton class GetCampaignSendTimezonesHandler: permission = Permission("text_campaign", "view") def __init__( self, auth_service: AuthService, campaign_service: CampaignService, campaign_repository: CampaignRepository, ) -> None: self.auth_service = auth_service self.campaign_service = campaign_service self.campaign_repository = campaign_repository def handle( self, request: GetCampaignSendTimezonesRequest ) -> GetCampaignSendTimezonesResponse: campaign = self.campaign_service.get_campaign(request.campaign_id) self.auth_service.authorize_account( request.identity_id, account=campaign.account, permission=self.permission, ) # Get available timezones timezones = self.campaign_repository.get_send_timezone( campaign_id=campaign.id, send_at=request.send_at, ) timezone_adjustments: set[str] = set() for adjustment in campaign.timezone_adjustments or []: timezone_adjustments.add(adjustment.key) timezone_by_country: dict[str, list[SendTimezone]] = defaultdict(list) for timezone in timezones: if timezone.adjustment_key in timezone_adjustments: timezone.is_adjusted = True timezone_by_country[timezone.country_code].append(timezone) # Build countries countries = [ CampaignSendCountry(country_code=country_code, timezones=timezones) for country_code, timezones in timezone_by_country.items() ] return GetCampaignSendTimezonesResponse( send_at=request.send_at, countries=countries, )