from dataclasses import dataclass from anydi import singleton from fansifter_common.artist.validators import ArtistValidator 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.services import AdReportingCampaignService from dmp.adapters.db import DefaultDB, ReportingDB, transactional @dataclass(kw_only=True) class AssignArtistsToAdReportingCampaignRequest(AuthRequest): campaign_id: str global_participant_ids: set[str] @singleton class AssignArtistsToAdReportingCampaignHandler: permission = Permission("ad_campaign", "edit") def __init__( self, db: DefaultDB, reporting_db: ReportingDB, auth_service: AuthService, campaign_service: AdReportingCampaignService, artist_validator: ArtistValidator, ) -> None: self.db = db self.reporting_db = reporting_db self.auth_service = auth_service self.campaign_service = campaign_service self.artist_validator = artist_validator @transactional def handle(self, request: AssignArtistsToAdReportingCampaignRequest) -> None: 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, ) # Validate global_participant_ids for global_participant_id in request.global_participant_ids - set( campaign.global_participant_ids ): self.artist_validator.validate_global_participant_id(global_participant_id) campaign.global_participant_ids = request.global_participant_ids self.campaign_service.save_campaign(campaign) return None