from dataclasses import dataclass from datetime import date from anydi import singleton from fansifter_common.auth.types import Permission from pydantic import TypeAdapter from dmp.adapters.db import ReportingDB from dmp.artists.cache import ArtistCache, cached_artist_data from dmp.artists.dtos import FansCampaignValue from dmp.artists.exceptions import DateValueError from dmp.artists.requests import ArtistFanReportFilterRequest from dmp.artists.services import ArtistAccessService @dataclass(kw_only=True) class GetArtistFansCountByCampaignSummaryRequest(ArtistFanReportFilterRequest): start_date: date end_date: date countries: list[str] | None = None def __post_init__(self) -> None: if self.start_date >= self.end_date: raise DateValueError SummaryValueListValidator = TypeAdapter(list[FansCampaignValue]) @singleton class GetArtistFansCountByCampaignSummaryHandler: permission = Permission("fan_data_list", "view") def __init__( self, db: ReportingDB, artist_access_service: ArtistAccessService, artist_cache: ArtistCache, ) -> None: self.db = db self.artist_access_service = artist_access_service self.artist_cache = artist_cache def handle( self, request: GetArtistFansCountByCampaignSummaryRequest ) -> list[FansCampaignValue]: artist_access = self.artist_access_service.check_artist_access( request.identity_id, request.global_participant_id, request.account, permission=self.permission, ) return self._get_summary( request.global_participant_id, vendor_id=request.vendor_id, subaccount_id=request.subaccount_id, start_date=request.start_date, end_date=request.end_date, countries=request.countries, identity_id=request.identity_id, is_global=artist_access.is_global, ) @cached_artist_data("by-campaign-summary") def _get_summary( self, global_participant_id: str, vendor_id: int | None, subaccount_id: int | None, start_date: date, end_date: date, countries: list[str] | None, identity_id: str, is_global: bool, ) -> list[FansCampaignValue]: template_name = self._get_template_name(countries=countries) query = self.db.query_from_template( template_name, context={ "vendor_id": vendor_id, "subaccount_id": subaccount_id, "global_participant_id": global_participant_id, "start_date": start_date, "end_date": end_date, "identity_id": identity_id, "countries": countries, "is_global": is_global, }, ) return SummaryValueListValidator.validate_python( self.db.session.execute(query).mappings() ) @staticmethod def _get_template_name(countries: list[str] | None) -> str: if countries: return "artist/get-artist-fans-count-by-acquisition-campaign-country.sql" return "artist/get-artist-fans-count-by-acquisition-campaign.sql"