from collections.abc import Sequence from anydi import singleton from dmp.meta.dtos import AssignMetaUserAdAccountLabelData from dmp.meta.models import MetaUserAdAccount from dmp.meta.repositories import MetaUserAdAccountRepository @singleton class MetaUserAdAccountService: def __init__( self, user_ad_account_repository: MetaUserAdAccountRepository, ) -> None: self.user_ad_account_repository = user_ad_account_repository def get_user_ad_accounts(self, identity_id: str) -> Sequence[MetaUserAdAccount]: return self.user_ad_account_repository.find_by_identity_id(identity_id) def get_labels_ad_accounts( self, vendor_ids: list[int], subaccount_ids: list[int] ) -> Sequence[MetaUserAdAccount]: return self.user_ad_account_repository.find_by_vendor_and_subaccount_ids( vendor_ids=vendor_ids, subaccount_ids=subaccount_ids ) def get_ad_accounts(self, ad_accounts_ids: set[str]) -> Sequence[MetaUserAdAccount]: return self.user_ad_account_repository.find_by_ad_accounts_external_ids( ad_accounts_ids=ad_accounts_ids ) def create_or_update_user_ad_accounts_for_user( self, assignments: list[AssignMetaUserAdAccountLabelData], identity_id: str ) -> list[MetaUserAdAccount]: existed_user_ad_accounts = ( self.user_ad_account_repository.find_by_ad_accounts_ids_and_identity_id( ad_accounts_ids=[ assignment.ad_account_id for assignment in assignments ], identity_id=identity_id, ) ) existed_user_ad_accounts_by_id = { existed_user_ad_account.ad_account_id: existed_user_ad_account for existed_user_ad_account in existed_user_ad_accounts } user_ad_accounts = [] for update_assignment in assignments: if update_assignment.ad_account_id in existed_user_ad_accounts_by_id.keys(): existed_user_ad_account = existed_user_ad_accounts_by_id[ update_assignment.ad_account_id ] existed_user_ad_account.vendor_id = update_assignment.vendor_id existed_user_ad_account.subaccount_id = update_assignment.subaccount_id user_ad_accounts.append(existed_user_ad_account) else: new_user_ad_account = MetaUserAdAccount( ad_account_id=update_assignment.ad_account_id, identity_id=identity_id, vendor_id=update_assignment.vendor_id, subaccount_id=update_assignment.subaccount_id, ) user_ad_accounts.append(new_user_ad_account) self.user_ad_account_repository.add_all(user_ad_accounts) return user_ad_accounts