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.ad_reporting.dtos import ( AdReportingAd, AdReportingAdCriteria, ) from dmp.ad_reporting.exceptions import AdReportingAdNotFoundError from dmp.ad_reporting.repositories import ( AdReportingAdRepository, ) from dmp.ad_reporting.services import ( AdReportingAccountService, AdReportingBenchmarkService, AdReportingReportService, ) @dataclass(kw_only=True) class GetAdReportingReportAdRequest(AuthRequest): report_id: str ad_id: str @singleton class GetAdReportingReportAdHandler: permission = Permission("ad_report", "view") def __init__( self, auth_service: AuthService, ad_repository: AdReportingAdRepository, account_service: AdReportingAccountService, report_service: AdReportingReportService, benchmark_service: AdReportingBenchmarkService, ) -> None: self.auth_service = auth_service self.ad_repository = ad_repository self.account_service = account_service self.report_service = report_service self.benchmark_service = benchmark_service def handle(self, request: GetAdReportingReportAdRequest) -> AdReportingAd: report = self.report_service.get_report( report_id=request.report_id, identity_id=request.identity_id, ) self.auth_service.check_owned_resource( report.identity_id, permission=self.permission, resource_id=report.id, ) ads = self.ad_repository.find_by_criteria( AdReportingAdCriteria( ad_ids={request.ad_id}, ), limit=1, ) try: ad = ads[0] except IndexError as exc: raise AdReportingAdNotFoundError from exc if ad.campaign_id not in report.campaign_ids: raise AdReportingAdNotFoundError ad_account_labels = self.account_service.get_ad_account_labels( account_ids={ad.account_id}, platform=ad.platform, ) ad.accounts = ad_account_labels.get(ad.account_id, set()) ad.report_id = report.id ad.report_name = report.name return ad