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 dmp.adapters.db import ReportingDB from dmp.songwhip.dtos import SongwhipCampaign from dmp.songwhip.repositories import SongwhipCampaignRepository @dataclass(kw_only=True) class GetCampaignsRequest(AuthAccountFilterRequest): DEFAULT_LIMIT: ClassVar[int] = 50 search: str | None = None global_participant_ids: list[str] | None = None campaign_ids: list[str] | None = None limit: int = DEFAULT_LIMIT @singleton class GetCampaignsHandler: permission = Permission("audience", "access") def __init__( self, db: ReportingDB, auth_service: AuthService, repository: SongwhipCampaignRepository, ) -> None: self.db = db self.auth_service = auth_service self.repository = repository def handle( self, request: GetCampaignsRequest, ) -> Sequence[SongwhipCampaign]: account_access = self.auth_service.authorize_optional_account( request.identity_id, permission=self.permission, account=request.account, ) vendor_ids = account_access.filter_vendor_ids(request.vendor_id) subaccount_ids = account_access.filter_subaccount_ids(request.subaccount_id) return self.repository.get_campaigns( vendor_ids, subaccount_ids, request.global_participant_ids, request.campaign_ids, request.limit, request.search, )