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 email_campaigns.automated.enums import AutomatedEmailType from email_campaigns.automated.models import SourceCampaign from email_campaigns.automated.repositories import SourceCampaignRepository from email_campaigns.automated.types import ( SourceCampaignCriteria, SourceCampaignOrderBy, ) @dataclass(kw_only=True) class GetSourceCampaignsRequest(AuthAccountFilterRequest): DEFAULT_LIMIT: ClassVar[int] = 200 DEFAULT_OFFSET: ClassVar[int] = 0 DEFAULT_ORDER_BY: ClassVar[list[SourceCampaignOrderBy]] = ["createdAt.desc"] search: str | None current_automated_email_id: str | None email_type: AutomatedEmailType | None status: str | None order_by: list[SourceCampaignOrderBy] limit: int offset: int @dataclass class GetSourceCampaignsResponse: items: Sequence[SourceCampaign] total: int @singleton class GetSourceCampaignsHandler: permission = Permission("email_campaign", "view") def __init__( self, auth_service: AuthService, repository: SourceCampaignRepository, ) -> None: self.auth_service = auth_service self.repository = repository def handle(self, request: GetSourceCampaignsRequest) -> GetSourceCampaignsResponse: 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 = SourceCampaignCriteria( search=request.search, vendor_ids=set(vendor_ids), subaccount_ids=set(subaccount_ids), current_automated_email_id=request.current_automated_email_id, status=request.status, email_type=request.email_type, ) total = self.repository.count_by_criteria(criteria) if total == 0: return GetSourceCampaignsResponse(total=0, items=[]) source_campaigns = self.repository.find_by_criteria( criteria, order_by=request.order_by, limit=request.limit, offset=request.offset, ) return GetSourceCampaignsResponse(total=total, items=source_campaigns)