from dataclasses import dataclass from audience_common.auth.account import Account from campaigns.auth.dtos import User from campaigns.connectors.db import Database, session_context from campaigns.core.handler import Handler from campaigns.meta.models import FacebookPage from campaigns.meta.repositories import FacebookPageRepository from campaigns.meta.services import FacebookPageTokenService @dataclass(frozen=True) class GetFacebookUserPagesForLabelRequest: user: User account: Account @dataclass class GetFacebookUserPagesForLabelHandler( Handler[GetFacebookUserPagesForLabelRequest, list[FacebookPage]], ): db: Database facebook_page_repository: FacebookPageRepository facebook_page_token_service: FacebookPageTokenService @session_context(in_transaction=False) async def handle( self, request: GetFacebookUserPagesForLabelRequest ) -> list[FacebookPage]: pages = [] if request.user.account_access.has_access_to_vendor( request.account.vendor_id, direct=True ): pages = await self.facebook_page_repository.find_by_vendor_id_subaccount_id( vendor_id=request.account.vendor_id, subaccount_id=0, is_manageable=True, ) elif ( request.account.subaccount_id and request.user.account_access.has_access_to_subaccount( request.account.subaccount_id, direct=True ) ): pages = await self.facebook_page_repository.find_by_vendor_id_subaccount_id( vendor_id=request.account.vendor_id, subaccount_id=request.account.subaccount_id, is_manageable=True, ) pages = await self.facebook_page_token_service.debug_tokens(pages=pages) # Removing potential duplicate access to the same # Facebook Page by different users valid_pages = {page.external_id: page for page in pages if page.is_valid} return sorted(valid_pages.values(), key=lambda page: page.name)