from dataclasses import dataclass from campaigns.connectors.db import Database, session_context from campaigns.connectors.facebook.base import FacebookClient from campaigns.connectors.facebook.enums import AdImageStatus from campaigns.core.handler import Handler from campaigns.meta.errors import MetaErrors from campaigns.meta.exceptions import CampaignAdImageDoesNotExist from campaigns.meta.models import CampaignImage from campaigns.meta.repositories import CampaignImageRepository from campaigns.meta.services import CampaignImageService @dataclass(frozen=True) class RefreshCampaignAdImageRequest: image_id: str @dataclass class RefreshCampaignAdImageHandler( Handler[RefreshCampaignAdImageRequest, CampaignImage], ): db: Database facebook_client: FacebookClient campaign_image_repository: CampaignImageRepository campaign_image_service: CampaignImageService @session_context(in_transaction=True) async def handle(self, request: RefreshCampaignAdImageRequest) -> CampaignImage: image = await self.campaign_image_service.get_image(request.image_id) if not image.image_hash: raise CampaignAdImageDoesNotExist ad_image = await self.facebook_client.get_ad_image(image.image_hash) if not ad_image: return image image.external_id = ad_image.id image.external_status = ad_image.status image.is_valid = ad_image.is_valid if not ad_image.is_valid: image.add_error( actual=ad_image.status, expected=[AdImageStatus.ACTIVE], code=MetaErrors.image_invalid_ad_image.code, ) self.campaign_image_repository.add(image) return image