from dataclasses import dataclass from anydi import singleton from fansifter_common.auth.exceptions import PermissionDenied from fansifter_common.auth.requests import AuthRequest from fansifter_common.auth.services import AuthService from fansifter_common.auth.types import Permission from dmp.adapters.db import DefaultDB, transactional from dmp.adapters.features import Features from dmp.audiences.dtos import AudienceAdAccount from dmp.audiences.enums import AudienceTarget from dmp.audiences.repositories import AudienceAdAccountRepository from dmp.audiences.services import AudienceService @dataclass class GetAudienceAdAccountsRequest(AuthRequest): audience_id: str @singleton class GetAudienceAdAccountsHandler: permission = Permission("audience", "view_ad_target") ad_account_permission = Permission("ad_account", "view") def __init__( self, db: DefaultDB, auth_service: AuthService, audience_service: AudienceService, audience_ad_account_repository: AudienceAdAccountRepository, features: Features, ) -> None: self.db = db self.auth_service = auth_service self.audience_service = audience_service self.audience_ad_account_repository = audience_ad_account_repository self.features = features @transactional def handle(self, request: GetAudienceAdAccountsRequest) -> list[AudienceAdAccount]: audience = self.audience_service.get_audience(request.audience_id) if audience.target != AudienceTarget.ADS: raise PermissionDenied( "Ad accounts available only for audience with ADS target" ) self.auth_service.check_account_resource( request.identity_id, account=audience.account, permission=self.permission, resource_id=audience.id, ) if self.features.is_on_for_identity( "audience_allow_audience_sharing_to_all_ad_accounts", identity_id=request.identity_id, ): account_access = self.auth_service.authorize_for_permission( request.identity_id, permission=self.ad_account_permission ) return self.audience_ad_account_repository.find_for_audience_sharing( audience_id=audience.id, identity_id=request.identity_id, vendor_ids=account_access.vendor_ids, subaccount_ids=account_access.subaccount_ids, ) return self.audience_ad_account_repository.find_for_audience_sharing( audience_id=audience.id, identity_id=request.identity_id, )