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.adapters.db.decorators import transactional from email_campaigns.audiences.repositories import AudienceRepository from email_campaigns.campaigns.models import EmailCampaign from email_campaigns.campaigns.services import EmailCampaignService from email_campaigns.campaigns.validators import CampaignValidator @dataclass(kw_only=True) class DuplicateCampaignRequest(AuthRequest): campaign_id: str name: str @singleton class DuplicateCampaignHandler: permission = Permission("email_campaign", "edit") def __init__( self, auth_service: AuthService, campaign_service: EmailCampaignService, campaign_validator: CampaignValidator, audience_repository: AudienceRepository, ) -> None: self.auth_service = auth_service self.campaign_service = campaign_service self.campaign_validator = campaign_validator self.audience_repository = audience_repository @transactional def handle(self, request: DuplicateCampaignRequest) -> EmailCampaign: campaign = self.campaign_service.get_campaign(request.campaign_id) self.auth_service.authorize_account( request.identity_id, account=campaign.account, permission=self.permission, ) # Validate the new name self.campaign_validator.validate_name(request.name, account=campaign.account) campaign_copy = EmailCampaign( name=request.name, vendor_id=campaign.vendor_id, subaccount_id=campaign.subaccount_id, global_participant_id=campaign.global_participant_id, custom_list_id=campaign.custom_list_id, created_by=request.identity_id, updated_by=request.identity_id, ) audience = self.audience_repository.get(campaign.audience_id) campaign_copy.audience = audience campaign_copy.sender_name = campaign.sender_name campaign_copy.email_username = campaign.email_username campaign_copy.email_domain = campaign.email_domain campaign_copy.email_domain_id = campaign.email_domain_id campaign_copy.subject = campaign.subject campaign_copy.html_content = campaign.html_content campaign_copy.css_content = campaign.css_content campaign_copy.custom_fonts = campaign.custom_fonts campaign_copy.preview_text = campaign.preview_text # Save the email campaign self.campaign_service.save_campaign(campaign_copy) return campaign_copy