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 email_campaigns.campaigns.enums import EmailCampaignStatus from email_campaigns.campaigns.repositories.campaign import EmailCampaignRepository from email_campaigns.campaigns.services.send_time_estimator import ( SendTimeEstimatorService, ) from email_campaigns.campaigns.validators import CampaignValidator @dataclass(kw_only=True) class BulkEstimateSendTimeRequest(AuthRequest): campaign_ids: list[str] @dataclass(kw_only=True) class CampaignEstimate: campaign_id: str estimated_send_duration: int emails_to_send: int @singleton class BulkEstimateSendTimeHandler: permission = Permission("email_campaign", "view") def __init__( self, campaign_repository: EmailCampaignRepository, estimator: SendTimeEstimatorService, auth_service: AuthService, campaign_validator: CampaignValidator, ) -> None: self.campaign_repository = campaign_repository self.estimator = estimator self.auth_service = auth_service self.campaign_validator = campaign_validator def handle( self, request: BulkEstimateSendTimeRequest, ) -> list[CampaignEstimate]: account_access = self.auth_service.authorize_for_permission( request.identity_id, permission=self.permission ) campaigns = self.campaign_repository.find_by_ids(request.campaign_ids) self.campaign_validator.validate_campaigns_access( list(campaigns), account_access ) eligible_campaigns = [ c for c in campaigns if c.status in (EmailCampaignStatus.SCHEDULED, EmailCampaignStatus.IN_PROGRESS) ] campaigns_estimates = self.estimator.estimate_send_duration_bulk( eligible_campaigns ) return [ CampaignEstimate( campaign_id=campaign_id, estimated_send_duration=duration, emails_to_send=emails_to_send, ) for campaign_id, duration, emails_to_send in campaigns_estimates ]