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 ( AdReportingCampaignObjective, AdReportingCampaignObjectiveCriteria, ) from dmp.ad_reporting.repositories import AdReportingCampaignRepository from dmp.ad_reporting.services import AdReportingAccountService @dataclass(kw_only=True) class GetAdReportingCampaignsObjectivesRequest(AuthRequest): report_id: str | None = None @singleton class GetAdReportingCampaignsObjectivesHandler: permission = Permission("ad_campaign", "view") def __init__( self, auth_service: AuthService, campaign_repository: AdReportingCampaignRepository, account_service: AdReportingAccountService, ) -> None: self.auth_service = auth_service self.campaign_repository = campaign_repository self.account_service = account_service def handle( self, request: GetAdReportingCampaignsObjectivesRequest ) -> list[AdReportingCampaignObjective]: account_access = self.auth_service.authorize_for_permission( request.identity_id, permission=self.permission, ) account_ids = self.account_service.get_allowed_account_ids(account_access) if not account_ids: return [] return self.campaign_repository.find_unique_campaigns_objectives_by_criteria( AdReportingCampaignObjectiveCriteria( account_ids=account_ids, report_id=request.report_id ), )