from collections.abc import Sequence from dataclasses import dataclass from typing import ClassVar 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 AdReportingCampaignReport from dmp.ad_reporting.repositories import AdReportingReportRepository from dmp.ad_reporting.services import AdReportingCampaignService @dataclass(kw_only=True) class GetAdReportingCampaignReportsRequest(AuthRequest): DEFAULT_LIMIT: ClassVar[int] = 100 campaign_id: str search: str | None limit: int | None = None @singleton class GetAdReportingCampaignReportsHandler: permission = Permission("ad_campaign", "view") def __init__( self, auth_service: AuthService, campaign_service: AdReportingCampaignService, report_repository: AdReportingReportRepository, ) -> None: self.auth_service = auth_service self.campaign_service = campaign_service self.report_repository = report_repository def handle( self, request: GetAdReportingCampaignReportsRequest ) -> Sequence[AdReportingCampaignReport]: account_access = self.auth_service.authorize_for_permission( request.identity_id, permission=self.permission, ) campaign = self.campaign_service.get_allowed_campaign( account_access, campaign_id=request.campaign_id ) return self.report_repository.find_by_identity_id_and_campaign_id( identity_id=request.identity_id, campaign_id=campaign.id, search=request.search, limit=request.limit or request.DEFAULT_LIMIT, )