from collections.abc import Sequence 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 fansifter_common.email import EmailType from email_campaigns.automated.models import AutomatedEmail from email_campaigns.automated.repositories import AutomatedEmailRepository from email_campaigns.automated.types import ( AutomatedEmailCriteria, AutomatedEmailOrderBy, ) from email_campaigns.emails.repositories import EmailAnalyticsRepository from email_campaigns.rosters.types import FanDataListId @dataclass(kw_only=True) class GetAutomatedEmailsRequest(AuthAccountFilterRequest): DEFAULT_LIMIT: ClassVar[int] = 50 DEFAULT_OFFSET: ClassVar[int] = 0 DEFAULT_ORDER_BY: ClassVar[list[AutomatedEmailOrderBy]] = ["updatedAt.desc"] search: str | None fandata_list_ids: set[FanDataListId] | None is_automated: bool | None order_by: list[AutomatedEmailOrderBy] limit: int offset: int @dataclass class GetAutomatedEmailsResponse: items: Sequence[AutomatedEmail] total: int @singleton class GetAutomatedEmailsHandler: permission = Permission("email_campaign", "view") def __init__( self, auth_service: AuthService, email_analytics_repository: EmailAnalyticsRepository, automated_email_repository: AutomatedEmailRepository, ) -> None: self.auth_service = auth_service self.email_analytics_repository = email_analytics_repository self.automated_email_repository = automated_email_repository def handle(self, request: GetAutomatedEmailsRequest) -> GetAutomatedEmailsResponse: 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) criteria = AutomatedEmailCriteria( email_ids=None, vendor_ids=set(vendor_ids), subaccount_ids=set(subaccount_ids), fandata_list_ids=request.fandata_list_ids, is_automated=request.is_automated, search=request.search, ) total = self.automated_email_repository.count_by_criteria(criteria) if total == 0: return GetAutomatedEmailsResponse(total=0, items=[]) automated_emails = self.automated_email_repository.find_by_criteria( criteria, order_by=request.order_by, limit=request.limit, offset=request.offset, ) # Prefetch analytics for automated emails self.email_analytics_repository.prefetch_analytics( automated_emails, email_type=EmailType.AUTOMATED ) return GetAutomatedEmailsResponse(total=total, items=automated_emails)