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.models import EmailReportingReport from email_campaigns.reporting.repositories import EmailReportingReportRepository @dataclass(kw_only=True) class ListEmailReportingReportsRequest(AuthRequest): DEFAULT_LIMIT: ClassVar[int] = 50 DEFAULT_OFFSET: ClassVar[int] = 0 name: str | None limit: int offset: int @dataclass class ListEmailReportingReportsResponse: total: int items: list[EmailReportingReport] @singleton class ListEmailReportingReportsHandler: 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: ListEmailReportingReportsRequest ) -> ListEmailReportingReportsResponse: self.auth_service.authorize_for_permission( request.identity_id, permission=self.permission ) total = self.report_repository.count_by_identity_id( identity_id=request.identity_id, name=request.name, ) if total == 0: return ListEmailReportingReportsResponse(total=0, items=[]) items = self.report_repository.find_by_identity_id( identity_id=request.identity_id, name=request.name, limit=request.limit, offset=request.offset, ) return ListEmailReportingReportsResponse(total=total, items=items)