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, ReportingDB, transactional from dmp.app_connections.enums import AppConnectionStatus from dmp.meta.services import MetaAdReportingConnectionService @dataclass class GetMetaAdReportingConnectionRequest(AuthRequest): pass @dataclass class GetMetaAdReportingConnectionResponse: status: AppConnectionStatus ad_accounts_count: int @singleton class GetMetaAdReportingConnectionHandler: permission = Permission("ad_connection", "view") def __init__( self, db: DefaultDB, reporting_db: ReportingDB, auth_service: AuthService, ad_reporting_connection_service: MetaAdReportingConnectionService, ) -> None: self.db = db self.reporting_db = reporting_db self.auth_service = auth_service self.ad_reporting_connection_service = ad_reporting_connection_service @transactional def handle( self, request: GetMetaAdReportingConnectionRequest ) -> GetMetaAdReportingConnectionResponse: ad_reporting_connection = ( self.ad_reporting_connection_service.get_by_identity_id(request.identity_id) ) if not ad_reporting_connection: return GetMetaAdReportingConnectionResponse( status=AppConnectionStatus.NOT_CONNECTED, ad_accounts_count=0, ) self.auth_service.check_owned_resource( ad_reporting_connection.identity_id, permission=self.permission, resource_id=ad_reporting_connection.id, ) return GetMetaAdReportingConnectionResponse( status=ad_reporting_connection.status, ad_accounts_count=ad_reporting_connection.ad_accounts_count, )