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 AdReportingReportCriteria, AdReportingReportView from dmp.ad_reporting.enums import AdReportingPlatform from dmp.ad_reporting.repositories import AdReportingReportRepository from dmp.ad_reporting.services import AdReportingCampaignService from dmp.ad_reporting.types import AdReportingReportOrderBy @dataclass(kw_only=True) class GetAdReportingReportsRequest(AuthRequest): DEFAULT_LIMIT: ClassVar[int] = 25 DEFAULT_OFFSET: ClassVar[int] = 0 DEFAULT_ORDER_BY: ClassVar[list[AdReportingReportOrderBy]] = ["createdAt.desc"] search: str | None global_participant_id: str | None platform: AdReportingPlatform | None order_by: list[AdReportingReportOrderBy] limit: int offset: int @dataclass(frozen=True) class GetAdReportingReportsResponse: total: int items: Sequence[AdReportingReportView] @singleton class GetAdReportingReportsHandler: permission = Permission("ad_report", "view") def __init__( self, auth_service: AuthService, report_repository: AdReportingReportRepository, campaign_service: AdReportingCampaignService, ) -> None: self.auth_service = auth_service self.report_repository = report_repository self.campaign_service = campaign_service def handle( self, request: GetAdReportingReportsRequest ) -> GetAdReportingReportsResponse: self.auth_service.check_owned_resource( request.identity_id, permission=self.permission, ) criteria = AdReportingReportCriteria( search=request.search, global_participant_id=request.global_participant_id, platform=request.platform, identity_id=request.identity_id, ) total = self.report_repository.count_by_criteria(criteria) if total == 0: return GetAdReportingReportsResponse(total=0, items=[]) reports = self.report_repository.find_by_criteria( criteria, order_by=request.order_by, limit=request.limit, offset=request.offset, ) return GetAdReportingReportsResponse(total=total, items=reports)