from dataclasses import dataclass from typing import ClassVar from fansifter_common.auth.requests import AuthRequest from fansifter_common.auth.services import AuthService from fansifter_common.auth.types import Permission from email_campaigns.adapters.db import Repository from email_campaigns.emails.exceptions import EmailNotFoundError from email_campaigns.emails.models import BaseEmail from email_campaigns.emails.repositories import EmailAnalyticsRepository from email_campaigns.emails.types import EmailLinkAnalytics @dataclass(kw_only=True) class GetEmailLinkAnalyticsRequest(AuthRequest): email_id: str @dataclass class GetEmailLinkAnalyticsResponse: data: list[EmailLinkAnalytics] | None class GetEmailLinkAnalyticsHandler[T: BaseEmail]: permission: ClassVar[Permission] def __init__( self, auth_service: AuthService, email_repository: Repository[T], email_analytics_repository: EmailAnalyticsRepository, ) -> None: self.auth_service = auth_service self.email_repository = email_repository self.email_analytics_repository = email_analytics_repository def handle( self, request: GetEmailLinkAnalyticsRequest ) -> GetEmailLinkAnalyticsResponse: email = self.email_repository.get(request.email_id) if email is None: raise EmailNotFoundError self.auth_service.authorize_account( request.identity_id, account=email.account, permission=self.permission, ) data = self.email_analytics_repository.find_link_analytics_by_id( request.email_id, email_type=email.email_type ) if len(data) == 0: return GetEmailLinkAnalyticsResponse(data=None) return GetEmailLinkAnalyticsResponse(data=data)