from collections.abc import Sequence from pydantic import TypeAdapter from dmp.adapters.db import ReportingDB, ReportingRepository from dmp.config import Settings from dmp.songwhip.dtos import SongwhipCampaign from dmp.songwhip.models import SongwhipCustomPageDbt SongwhipCampaignList = TypeAdapter(list[SongwhipCampaign]) class SongwhipCampaignRepository(ReportingRepository[SongwhipCustomPageDbt]): def __init__(self, db: ReportingDB, settings: Settings) -> None: super().__init__(db) self.settings = settings def get_campaigns( self, vendor_ids: list[int], subaccount_ids: list[int], global_participant_ids: list[str] | None, campaign_ids: list[str] | None, limit: int, search: str | None = None, ) -> Sequence[SongwhipCampaign]: query = self.db.query_from_template( "songwhip-campaigns/find-by-criteria.sql", context={ "vendor_ids": vendor_ids, "subaccount_ids": subaccount_ids, "global_participant_ids": global_participant_ids, "campaign_ids": campaign_ids, "limit": limit, "search_campaign": search, }, ) response = self.db.session.execute(query).mappings() return SongwhipCampaignList.validate_python( response, context={"songwhip_url": self.settings.songwhip_url}, )