from anydi import singleton from dmp.ad_reporting.dtos import AdReportingCampaignCriteria from dmp.ad_reporting.exceptions import ( AdReportingCampaignIsNotAllowedError, AdReportingInvalidCampaignIdError, AdReportingReportUniqueNameError, ) from dmp.ad_reporting.repositories import ( AdReportingCampaignRepository, AdReportingReportRepository, ) @singleton class AdReportingReportValidator: def __init__( self, campaign_repository: AdReportingCampaignRepository, report_repository: AdReportingReportRepository, ) -> None: self.campaign_repository = campaign_repository self.report_repository = report_repository def validate_name( self, name: str, identity_id: str, exclude_id: str | None = None ) -> None: """Validate report name under same user.""" if self.report_repository.exists_by_name_and_identity_id( name=name, identity_id=identity_id, exclude_id=exclude_id ): raise AdReportingReportUniqueNameError def validate_allowed_campaign_ids( self, *, campaign_ids: set[str], account_ids: set[str] ) -> None: """Validate campaign ids.""" if not account_ids: raise AdReportingCampaignIsNotAllowedError existing_campaign_ids = self.campaign_repository.find_ids_by_criteria( AdReportingCampaignCriteria( campaign_ids=campaign_ids, account_ids=account_ids, ), ) for campaign_id in campaign_ids: if campaign_id not in existing_campaign_ids: raise AdReportingInvalidCampaignIdError(campaign_id=campaign_id)