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.google.services import GoogleAdReportingConnectionService @dataclass class GetGoogleAdReportingConnectionRequest(AuthRequest): user_id: str @dataclass class GetGoogleAdReportingConnectionResponse: status: AppConnectionStatus ad_accounts_count: int @singleton class GetGoogleAdReportingConnectionHandler: permission = Permission("ad_connection", "view") def __init__( self, db: DefaultDB, reporting_db: ReportingDB, auth_service: AuthService, ad_reporting_connection_service: GoogleAdReportingConnectionService, ) -> 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: GetGoogleAdReportingConnectionRequest ) -> GetGoogleAdReportingConnectionResponse: ad_reporting_connection = self.ad_reporting_connection_service.get_connection_by_identity_id_and_user_id( identity_id=request.identity_id, user_id=request.user_id, ) if not ad_reporting_connection: return GetGoogleAdReportingConnectionResponse( 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 GetGoogleAdReportingConnectionResponse( status=ad_reporting_connection.status, ad_accounts_count=ad_reporting_connection.ad_accounts_count, )