from dataclasses import dataclass from campaigns.connectors.facebook.base import FacebookClient from campaigns.connectors.facebook.exceptions import FacebookClientError from campaigns.meta.dtos import CampaignPost from campaigns.meta.exceptions import CampaignPostDoesNotExist from campaigns.meta.models import Campaign from .facebook_page_token import FacebookPageTokenService @dataclass class CampaignPostService: facebook_client: FacebookClient facebook_page_token_service: FacebookPageTokenService async def get_campaign_post( self, campaign: Campaign, *, post_external_id: str | None = None ) -> CampaignPost: post_external_id = post_external_id or campaign.post_external_id if not post_external_id: raise CampaignPostDoesNotExist page = campaign.facebook_page page_token = await self.facebook_page_token_service.decrypt_token(page) try: facebook_post = await self.facebook_client.get_post( post_id=post_external_id, page_access_token=page_token, ) except FacebookClientError: pass else: return CampaignPost.from_api_obj(facebook_post) try: instagram_post = await self.facebook_client.get_instagram_media_item( post_id=post_external_id, page_access_token=page_token, ) except FacebookClientError: pass else: return CampaignPost.from_api_obj(instagram_post) raise CampaignPostDoesNotExist