from anydi import singleton from dmp.tiktok.exceptions import ( InvalidTikTokAdAccountId, TikTokConnectionNotFoundError, ) from dmp.tiktok.repositories import ( TikTokAdAccountRepository, TikTokAdReportingConnectionRepository, TikTokUserConnectionRepository, ) @singleton class TikTokConnectionValidator: def __init__( self, ad_reporting_connection_repository: TikTokAdReportingConnectionRepository, user_connection_repository: TikTokUserConnectionRepository, ) -> None: self.ad_reporting_connection_repository = ad_reporting_connection_repository self.user_connection_repository = user_connection_repository def validate_connection_for_ad_accounts_exists( self, identity_id: str, ad_account_ids: list[str] ) -> None: """ Validate that one of user connection or ad reporting connections exists for each ad_account_id. """ user_connections = self.user_connection_repository.get_by_identity_id( identity_id ) ad_reporting_connections = ( self.ad_reporting_connection_repository.get_by_identity_id(identity_id) ) connection_ad_account_ids = set() if user_connections: for user_connection in user_connections: connection_ad_account_ids.update( {account.id for account in user_connection.ad_accounts} ) if ad_reporting_connections: for ad_reporting_connection in ad_reporting_connections: connection_ad_account_ids.update( {account.id for account in ad_reporting_connection.ad_accounts} ) if not set(ad_account_ids).issubset(connection_ad_account_ids): raise TikTokConnectionNotFoundError @singleton class TikTokAdAccountValidator: def __init__(self, ad_account_repository: TikTokAdAccountRepository) -> None: self.ad_account_repository = ad_account_repository def validate_ad_account_ids(self, ad_account_ids: list[str]) -> None: """Validate that ad accounts exists.""" ad_accounts_count = self.ad_account_repository.count_by_ids(ad_account_ids) if len(ad_account_ids) != ad_accounts_count: raise InvalidTikTokAdAccountId