from dataclasses import dataclass from campaigns.auth.dtos import User from campaigns.connectors.db import Database, session_context from campaigns.core.handler import Handler from campaigns.meta.enums import ( CampaignCallToAction, CampaignContentType, CampaignLinkType, CampaignPlatform, ) from campaigns.meta.models import Campaign from campaigns.meta.repositories import CampaignRepository from campaigns.meta.services import CampaignPostService, CampaignService from campaigns.meta.validators import CampaignValidator @dataclass(frozen=True) class UpdateCampaignCreativeRequest: user: User campaign_id: str content_type: CampaignContentType platforms: list[CampaignPlatform] post_external_id: str | None primary_text: str | None headline: str | None description: str | None link_type: CampaignLinkType website_url: str | None landing_page_path: str | None landing_page_product_id: int | None call_to_action: CampaignCallToAction @dataclass class UpdateCampaignCreativeHandler( Handler[UpdateCampaignCreativeRequest, Campaign], ): db: Database campaign_validator: CampaignValidator campaign_repository: CampaignRepository campaign_service: CampaignService campaign_post_service: CampaignPostService @session_context(in_transaction=True) async def handle(self, request: UpdateCampaignCreativeRequest) -> Campaign: campaign = await self.campaign_service.get_user_campaign( user=request.user, campaign_id=request.campaign_id ) campaign.content_type = request.content_type campaign.platforms = request.platforms campaign.primary_text = request.primary_text campaign.headline = request.headline campaign.description = request.description campaign.link_type = request.link_type campaign.website_url = request.website_url campaign.landing_page_path = request.landing_page_path campaign.landing_page_product_id = request.landing_page_product_id campaign.call_to_action = request.call_to_action campaign.updated_by = request.user.id.identity_id if request.content_type == CampaignContentType.POST: post = await self.campaign_validator.validate_post_external_id( campaign, post_external_id=request.post_external_id ) if post.is_instagram: campaign.instagram_post_external_id = post.id campaign.facebook_post_external_id = None else: campaign.facebook_post_external_id = post.id campaign.instagram_post_external_id = None self.campaign_validator.validate_link_type(campaign) self.campaign_repository.add(campaign) return campaign