from anydi import singleton from dmp.meta.exceptions import ( InvalidMetaAdAccountId, MetaAdReportingConnectionConflictError, MetaConnectionNotFoundError, ) from dmp.meta.repositories import ( MetaAdAccountRepository, MetaAdReportingConnectionRepository, MetaUserConnectionRepository, ) @singleton class MetaAdReportingConnectionValidator: def __init__( self, ad_reporting_connection_repository: MetaAdReportingConnectionRepository ) -> None: self.ad_reporting_connection_repository = ad_reporting_connection_repository def validate_uniqueness(self, identity_id: str) -> None: """Validate that one user have not more than one connection.""" if self.ad_reporting_connection_repository.exists_by_identity_id(identity_id): raise MetaAdReportingConnectionConflictError @singleton class MetaConnectionValidator: def __init__( self, ad_reporting_connection_repository: MetaAdReportingConnectionRepository, user_connection_repository: MetaUserConnectionRepository, ) -> 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_connection = self.user_connection_repository.get_by_identity_id( identity_id ) ad_reporting_connection = ( self.ad_reporting_connection_repository.get_by_identity_id(identity_id) ) connection_ad_account_ids = set() if user_connection: connection_ad_account_ids.update( {account.id for account in user_connection.ad_accounts} ) if ad_reporting_connection: 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 MetaConnectionNotFoundError @singleton class MetaAdAccountValidator: def __init__(self, ad_account_repository: MetaAdAccountRepository) -> 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 InvalidMetaAdAccountId