from dataclasses import dataclass from anydi import singleton from fansifter_common.auth.services import AuthService from fansifter_common.auth.types import Permission from dmp.tiktok.dtos import TikTokUserAdAccountLabel from dmp.tiktok.exceptions import TikTokConnectionNotFoundError from dmp.tiktok.repositories import ( TikTokAdReportingConnectionRepository, TikTokUserConnectionRepository, ) from dmp.tiktok.services import TikTokAdAccountService @dataclass(frozen=True) class GetTikTokUserAdAccountsRequest: identity_id: str user_id: str class TikTokAdReportingRepository: pass @singleton class GetTikTokUserAdAccountsHandler: permission = Permission("ad_connection", "view") def __init__( self, auth_service: AuthService, ad_account_service: TikTokAdAccountService, user_connection_repository: TikTokUserConnectionRepository, ad_reporting_connection_repository: TikTokAdReportingConnectionRepository, ) -> None: self.auth_service = auth_service self.ad_account_service = ad_account_service self.user_connection_repository = user_connection_repository self.ad_reporting_connection_repository = ad_reporting_connection_repository def handle( self, request: GetTikTokUserAdAccountsRequest ) -> list[TikTokUserAdAccountLabel]: user_connection = ( self.user_connection_repository.get_by_identity_id_and_user_id( identity_id=request.identity_id, user_id=request.user_id ) ) ad_reporting_connection = self.ad_reporting_connection_repository.get_connection_by_identity_id_and_user_id( identity_id=request.identity_id, user_id=request.user_id ) valid_connection = user_connection or ad_reporting_connection if not valid_connection: raise TikTokConnectionNotFoundError self.auth_service.check_owned_resource( valid_connection.identity_id, permission=self.permission, resource_id=valid_connection.id, ) return self.ad_account_service.get_user_ad_accounts_for_assignment( identity_id=request.identity_id, user_id=request.user_id )