from dataclasses import dataclass from anydi import singleton from fansifter_common.auth.services import AuthService from dmp.adapters.db import DefaultDB, transactional from dmp.core.types import EncryptedToken from dmp.google.exceptions import ( GoogleAudienceNotFoundError, GoogleUserConnectionNotFoundError, ) from dmp.google.repositories import GoogleAudienceRepository from dmp.google.services import GoogleUserConnectionService @dataclass class GetGoogleAudienceShareRequest: share_id: str @dataclass class GetGoogleAudienceShareResponse: audience_id: str audience_external_id: str user_list_resource: str audience_name: str fans_count: int ad_account_external_id: str parent_ad_account_external_id: str | None user_access_token: EncryptedToken @singleton class GetGoogleAudienceShareHandler: def __init__( self, db: DefaultDB, auth_service: AuthService, google_audience_repository: GoogleAudienceRepository, user_connection_service: GoogleUserConnectionService, ) -> None: self.db = db self.auth_service = auth_service self.google_audience_repository = google_audience_repository self.user_connection_service = user_connection_service @transactional def handle( self, request: GetGoogleAudienceShareRequest ) -> GetGoogleAudienceShareResponse: google_audience = self.google_audience_repository.get_by_share_id( request.share_id ) if google_audience is None: raise GoogleAudienceNotFoundError share = google_audience.share user_connection = ( self.user_connection_service.get_active_audience_sharing_connection( audience_id=google_audience.audience_id, ad_account_id=google_audience.ad_account_id, identity_id=share.created_by, ) ) if user_connection is None: raise GoogleUserConnectionNotFoundError parent_ad_accounts = [ connection_ad_account.parent_ad_account_id for connection_ad_account in user_connection.connection_ad_accounts if connection_ad_account.ad_account_id == google_audience.ad_account_id ] if parent_ad_accounts: parent_ad_account_id = parent_ad_accounts[0] else: parent_ad_account_id = None access_token = self.user_connection_service.get_connection_access_token( connection=user_connection ) encrypted_access_token = self.user_connection_service.encrypt_token( access_token.access_token ) return GetGoogleAudienceShareResponse( audience_id=google_audience.id, audience_external_id=google_audience.external_id, user_list_resource=google_audience.resource_name, audience_name=google_audience.name, fans_count=google_audience.fans_count, ad_account_external_id=google_audience.ad_account.external_id, parent_ad_account_external_id=parent_ad_account_id, user_access_token=encrypted_access_token, )