from dataclasses import dataclass from campaigns.connectors.db import Database, session_context from campaigns.connectors.facebook.base import FacebookClient from campaigns.core.handler import Handler from campaigns.meta.models import CampaignVideo from campaigns.meta.repositories import CampaignVideoRepository from campaigns.meta.services import CampaignVideoService @dataclass(frozen=True) class CreateCampaignAdVideoRequest: video_id: str video_url: str @dataclass class CreateCampaignAdVideoHandler( Handler[CreateCampaignAdVideoRequest, CampaignVideo], ): db: Database facebook_client: FacebookClient campaign_video_repository: CampaignVideoRepository campaign_video_service: CampaignVideoService @session_context(in_transaction=True) async def handle(self, request: CreateCampaignAdVideoRequest) -> CampaignVideo: video = await self.campaign_video_service.get_video(request.video_id) if video.external_id: return video ad_video = await self.facebook_client.create_ad_video(request.video_url) video.external_id = ad_video.id self.campaign_video_repository.add(video) return video