from dataclasses import dataclass from audience_common.auth.account import Account from campaigns.auth.dtos import User from campaigns.config import settings from campaigns.connectors.aws.s3 import S3Client from campaigns.meta.exceptions import FacebookPageDoesNotExist, FacebookPageInvalidToken from campaigns.meta.models import FacebookPage from campaigns.meta.repositories import FacebookPageRepository from .facebook_page_token import FacebookPageTokenService @dataclass class FacebookPageService: s3: S3Client facebook_page_repository: FacebookPageRepository facebook_page_token_service: FacebookPageTokenService async def get_user_valid_page_for_account( self, *, user: User, page_id: str, account: Account ) -> FacebookPage: page = await self.get_user_page_for_label( user=user, page_id=page_id, account=account ) page = (await self.facebook_page_token_service.debug_tokens(pages=[page]))[0] if not page.is_valid: raise FacebookPageInvalidToken return page async def get_user_page_for_label( self, *, user: User, page_id: str, account: Account ) -> FacebookPage: page = await self.facebook_page_repository.get_or_none(page_id=page_id) if not page: raise FacebookPageDoesNotExist if page.association.orchard_identity_id == user.id.identity_id: return page if user.account_access.has_access_to_vendor(account.vendor_id, direct=True): page = await self.facebook_page_repository.get_by_vendor_id_subaccount_id_or_none( page_id=page_id, vendor_id=account.vendor_id, subaccount_id=0, ) elif account.subaccount_id and user.account_access.has_access_to_subaccount( account.subaccount_id, direct=True ): page = await self.facebook_page_repository.get_by_vendor_id_subaccount_id_or_none( page_id=page_id, vendor_id=account.vendor_id, subaccount_id=account.subaccount_id, ) else: page = None if page is None: raise FacebookPageDoesNotExist return page async def save_page_picture( self, page: FacebookPage, content: bytes ) -> FacebookPage: picture_bucket = settings.assets_bucket_name picture_key = f"{page.UPLOAD_FOLDER}/{page.id}/picture.png" await self.s3.put_object( bucket=picture_bucket, key=picture_key, content=content, content_type="image/png", ) page.picture_bucket = picture_bucket page.picture_key = picture_key return page