from collections.abc import Sequence from dataclasses import dataclass from anydi import singleton from email_campaigns.automated.enums import AutomatedEmailType from email_campaigns.automated.exceptions import SourceCampaignNotFoundError from email_campaigns.automated.models import AutomatedEmail from email_campaigns.automated.repositories import ( AutomatedEmailRepository, SourceCampaignRepository, ) from email_campaigns.emails.models import EmailDomain @dataclass(kw_only=True) class SourceCampaignAutomatedEmailItem: automated_email: AutomatedEmail subscription_only: bool potential_mailing_list_ids: list[str] @property def id(self) -> str: return self.automated_email.id @property def name(self) -> str: return self.automated_email.name @property def type(self) -> AutomatedEmailType: return self.automated_email.type @property def subject(self) -> str | None: return self.automated_email.subject @property def preview_text(self) -> str | None: return self.automated_email.preview_text @property def sender_name(self) -> str | None: return self.automated_email.sender_name @property def email_username(self) -> str | None: return self.automated_email.email_username @property def email_domain(self) -> EmailDomain | None: return self.automated_email.email_domain @dataclass(kw_only=True) class GetSourceCampaignAutomatedEmailsRequest: source: str campaign_id: str @dataclass(kw_only=True) class GetSourceCampaignAutomatedEmailsResponse: items: Sequence[SourceCampaignAutomatedEmailItem] @singleton class GetSourceCampaignAutomatedEmailsHandler: def __init__( self, source_campaign_repository: SourceCampaignRepository, automated_email_repository: AutomatedEmailRepository, ) -> None: self.source_campaign_repository = source_campaign_repository self.automated_email_repository = automated_email_repository def handle( self, request: GetSourceCampaignAutomatedEmailsRequest ) -> GetSourceCampaignAutomatedEmailsResponse: source_campaign = ( self.source_campaign_repository.find_by_source_and_campaign_id( request.source, request.campaign_id ) ) if source_campaign is None: raise SourceCampaignNotFoundError automated_emails = self.automated_email_repository.find_by_source_campaign_id( source_campaign.id ) mailing_lists_by_email = ( self.source_campaign_repository.find_potential_mailing_list_ids( source=request.source, campaign_id=request.campaign_id, ) ) items: list[SourceCampaignAutomatedEmailItem] = [] for email in automated_emails: subscription_only = False for conn in email.source_campaign_connections: if conn.source_campaign_id == source_campaign.id: subscription_only = conn.subscription_only break items.append( SourceCampaignAutomatedEmailItem( automated_email=email, subscription_only=subscription_only, potential_mailing_list_ids=mailing_lists_by_email.get(email.id, []), ) ) return GetSourceCampaignAutomatedEmailsResponse( items=items, )