from dataclasses import dataclass from anydi import singleton 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.tiktok.dtos import AssignTikTokUserAdAccountLabelData from dmp.tiktok.services import TikTokUserAdAccountService from dmp.tiktok.validators import TikTokAdAccountValidator, TikTokConnectionValidator @dataclass class AssignLabelsToTikTokUserAdAccountsRequest(AuthRequest): assignments: list[AssignTikTokUserAdAccountLabelData] @singleton class AssignLabelsToTikTokUserAdAccountsHandler: permission = Permission("ad_account", "assign") def __init__( self, db: DefaultDB, auth_service: AuthService, user_ad_account_service: TikTokUserAdAccountService, ad_account_validator: TikTokAdAccountValidator, connection_validator: TikTokConnectionValidator, ) -> None: self.db = db self.auth_service = auth_service self.user_ad_account_service = user_ad_account_service self.ad_account_validator = ad_account_validator self.connection_validator = connection_validator @transactional def handle(self, request: AssignLabelsToTikTokUserAdAccountsRequest) -> None: ad_account_ids = [ assignment.ad_account_id for assignment in request.assignments ] self.ad_account_validator.validate_ad_account_ids(ad_account_ids) self.connection_validator.validate_connection_for_ad_accounts_exists( identity_id=request.identity_id, ad_account_ids=ad_account_ids, ) authorized_accounts = set() for assignment in request.assignments: if assignment.account in authorized_accounts: continue self.auth_service.check_account_owned_resource( request.identity_id, account=assignment.account, permission=self.permission, resource_identity_id=request.identity_id, resource_id=assignment.ad_account_id, ) authorized_accounts.add(assignment.account) self.user_ad_account_service.create_or_update_user_ad_accounts_for_user( assignments=request.assignments, identity_id=request.identity_id )