from dataclasses import dataclass from anydi import singleton from fansifter_common.auth.services import AuthService from fansifter_common.auth.types import Permission from dmp.meta.dtos import MetaUserAdAccountLabel from dmp.meta.exceptions import MetaConnectionNotFoundError from dmp.meta.repositories import ( MetaAdReportingConnectionRepository, MetaUserConnectionRepository, ) from dmp.meta.services import MetaAdAccountService @dataclass(frozen=True) class GetMetaUserAdAccountsRequest: identity_id: str @singleton class GetMetaUserAdAccountsHandler: permission = Permission("ad_connection", "view") def __init__( self, auth_service: AuthService, ad_account_service: MetaAdAccountService, user_connection_repository: MetaUserConnectionRepository, ad_reporting_connection_repository: MetaAdReportingConnectionRepository, ) -> 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: GetMetaUserAdAccountsRequest ) -> list[MetaUserAdAccountLabel]: user_connection = self.user_connection_repository.get_by_identity_id( request.identity_id ) ad_reporting_connection = ( self.ad_reporting_connection_repository.get_by_identity_id( request.identity_id ) ) valid_connection = user_connection or ad_reporting_connection if not valid_connection: raise MetaConnectionNotFoundError 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( request.identity_id )