from dataclasses import dataclass from typing import ClassVar from anydi import singleton from fansifter_common.auth.requests import AuthAccountFilterRequest from fansifter_common.auth.services import AuthService from fansifter_common.auth.types import Permission from email_campaigns.adapters.db.decorators import transactional from email_campaigns.campaigns.repositories import EmailCampaignRepository from email_campaigns.reporting.exceptions import EmailReportingReportNotFoundError from email_campaigns.reporting.models import EmailReportingReport from email_campaigns.reporting.repositories import EmailReportingReportRepository @dataclass(kw_only=True) class UpdateEmailReportingReportRequest(AuthAccountFilterRequest): report_id: str name: str email_ids: list[str] | None = None global_participant_id: str | None = None @singleton class UpdateEmailReportingReportHandler: permission: ClassVar[Permission] = Permission("email_campaign", "view") def __init__( self, auth_service: AuthService, email_repository: EmailCampaignRepository, report_repository: EmailReportingReportRepository, ) -> None: self.auth_service = auth_service self.email_repository = email_repository self.report_repository = report_repository @transactional def handle( self, request: UpdateEmailReportingReportRequest ) -> EmailReportingReport: report = self.report_repository.get_by_id_and_identity_id( report_id=request.report_id, identity_id=request.identity_id, ) if report is None: raise EmailReportingReportNotFoundError account_access = self.auth_service.authorize_for_permission( request.identity_id, permission=self.permission ) vendor_ids = account_access.filter_vendor_ids(request.vendor_id) subaccount_ids = account_access.filter_subaccount_ids(request.subaccount_id) emails = self.email_repository.find_by_filters( email_ids=request.email_ids, global_participant_id=request.global_participant_id, vendor_ids=vendor_ids, subaccount_ids=subaccount_ids, ) report.name = request.name report.email_ids = [email.id for email in emails] self.report_repository.save(report) return report