from collections.abc import Sequence import sqlalchemy as sa from sqlalchemy.orm import contains_eager, joinedload from app.adapters.db import Repository from app.enums import CampaignStatus from app.models import Campaign, CampaignBatch class CampaignBatchRepository(Repository[CampaignBatch]): default_options = (joinedload(CampaignBatch.campaign),) def find_active(self) -> Sequence[CampaignBatch]: query = ( sa.select(CampaignBatch) .join(Campaign) .options(contains_eager(CampaignBatch.campaign)) .where( Campaign.status == CampaignStatus.IN_PROGRESS, Campaign.prepared_at.isnot(None), Campaign.cancelled_at.is_(None), Campaign.deleted_at.is_(None), CampaignBatch.completed_at.is_(None), CampaignBatch.cancelled_at.is_(None), ) ) result = self.db.session.execute(query) return result.scalars().all() def create_bulk(self, *, campaign_id: str, fansifter_only: bool) -> None: query = self.db.query_from_template( "campaign_batch/create_bulk.sql", context={ "campaign_id": campaign_id, "fansifter_only": fansifter_only, }, ) self.db.session.execute(query)