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.adapters.db.decorators import transactional from ows_text_campaigns.assets.models import Asset from ows_text_campaigns.audiences.repositories import AudienceRepository from ows_text_campaigns.campaigns.models import Campaign from ows_text_campaigns.campaigns.repositories import CampaignRepository from ows_text_campaigns.campaigns.services import CampaignService from ows_text_campaigns.campaigns.utils import replace_standard_links_tags from ows_text_campaigns.campaigns.validators import CampaignValidator @dataclass(kw_only=True) class DuplicateCampaignRequest(AuthRequest): campaign_id: str name: str @singleton class DuplicateCampaignHandler: permission = Permission("text_campaign", "create") def __init__( self, auth_service: AuthService, campaign_service: CampaignService, campaign_repository: CampaignRepository, campaign_validator: CampaignValidator, audience_repository: AudienceRepository, ) -> None: self.auth_service = auth_service self.campaign_service = campaign_service self.campaign_repository = campaign_repository self.campaign_validator = campaign_validator self.audience_repository = audience_repository @transactional def handle(self, request: DuplicateCampaignRequest) -> Campaign: campaign = self.campaign_service.get_campaign(request.campaign_id) self.auth_service.authorize_account( request.identity_id, account=campaign.account, permission=self.permission, ) # Validate text campaign name self.campaign_validator.validate_name(request.name, account=campaign.account) campaign_copy = Campaign( name=request.name, vendor_id=campaign.vendor_id, subaccount_id=campaign.subaccount_id, global_participant_id=campaign.global_participant_id, channel=campaign.channel, created_by=request.identity_id, updated_by=request.identity_id, ) campaign_copy.assets = [ Asset( object_type=asset.object_type, object_id=campaign_copy.id, original_filename=asset.original_filename, key=asset.key, content_type=asset.content_type, extension=asset.extension, file_size=asset.file_size, image_width=asset.image_width, image_height=asset.image_height, created_by=request.identity_id, ) for asset in campaign.assets ] # Copy audience if exists if campaign.audience_id: audience = self.audience_repository.get(campaign.audience_id) campaign_copy.audience = audience # Smart copy of the original campaign content campaign_copy.content = replace_standard_links_tags(campaign.get_content()) self.campaign_repository.save(campaign_copy) return campaign_copy