from dataclasses import dataclass from typing import ClassVar from anydi import singleton from fansifter_common.auth.requests import AuthRequest from fansifter_common.auth.services import AuthService from fansifter_common.auth.types import Permission 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 GetEmailReportingReportRequest(AuthRequest): report_id: str @singleton class GetEmailReportingReportHandler: permission: ClassVar[Permission] = Permission("email_campaign", "view") def __init__( self, auth_service: AuthService, report_repository: EmailReportingReportRepository, ) -> None: self.auth_service = auth_service self.report_repository = report_repository def handle(self, request: GetEmailReportingReportRequest) -> EmailReportingReport: self.auth_service.authorize_for_permission( request.identity_id, permission=self.permission ) 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 return report