from dataclasses import dataclass from campaigns.assets.services import AssetService 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 CampaignImage from campaigns.meta.repositories import CampaignImageRepository from campaigns.meta.services import CampaignImageService from campaigns.utils.image import get_image_content_or_none @dataclass(frozen=True) class CreateCampaignAdImageRequest: image_id: str image_url: str @dataclass class CreateCampaignAdImageHandler( Handler[CreateCampaignAdImageRequest, CampaignImage], ): db: Database facebook_client: FacebookClient campaign_image_repository: CampaignImageRepository campaign_image_service: CampaignImageService asset_service: AssetService @session_context(in_transaction=True) async def handle(self, request: CreateCampaignAdImageRequest) -> CampaignImage: image = await self.campaign_image_service.get_image(request.image_id) if image.image_hash: return image ad_image = await self.facebook_client.create_ad_image(request.image_url) image.image_hash = ad_image.hash thumbnail_content = await get_image_content_or_none(ad_image.url_256) if thumbnail_content: image.asset = await self.asset_service.save_asset_thumbnail( content=thumbnail_content, asset=image.asset ) self.campaign_image_repository.add(image) return image