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.models import EmailReportingReport from email_campaigns.reporting.repositories import EmailReportingReportRepository @dataclass(kw_only=True) class CreateEmailReportingReportRequest(AuthAccountFilterRequest): name: str email_ids: list[str] | None = None global_participant_id: str | None = None @singleton class CreateEmailReportingReportHandler: 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: CreateEmailReportingReportRequest ) -> EmailReportingReport: 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 = EmailReportingReport( identity_id=request.identity_id, name=request.name ) report.email_ids = [email.id for email in emails] self.report_repository.save(report) return report