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.enums import CampaignStatus from ows_text_campaigns.campaigns.repositories import MessageSendQueueRepository from ows_text_campaigns.campaigns.services import CampaignService @dataclass(kw_only=True) class GetCampaignLiveStatusResponse: status: CampaignStatus messages_to_send: int sent_messages: int @dataclass(kw_only=True) class GetCampaignLiveStatusRequest(AuthRequest): campaign_id: str @singleton class GetCampaignLiveStatusHandler: permission = Permission("text_campaign", "view") def __init__( self, auth_service: AuthService, campaign_service: CampaignService, message_send_queue_repository: MessageSendQueueRepository, ) -> None: self.auth_service = auth_service self.campaign_service = campaign_service self.message_send_queue_repository = message_send_queue_repository def handle( self, request: GetCampaignLiveStatusRequest ) -> GetCampaignLiveStatusResponse: campaign = self.campaign_service.get_campaign(request.campaign_id) self.auth_service.authorize_account( request.identity_id, account=campaign.account, permission=self.permission, ) message_send_queue = ( self.message_send_queue_repository.get_processing_by_campaign_id( request.campaign_id ) ) if message_send_queue is None: return GetCampaignLiveStatusResponse( status=campaign.status, messages_to_send=0, sent_messages=0, ) return GetCampaignLiveStatusResponse( status=campaign.status, messages_to_send=message_send_queue.total, sent_messages=message_send_queue.offset, )