from collections.abc import Sequence import sqlalchemy as sa from app.adapters.db import Repository from app.enums import CampaignStatus from app.models import Campaign class CampaignRepository(Repository[Campaign]): def find_ready_to_dispatch(self) -> Sequence[Campaign]: """ Get campaigns in SCHEDULED, STARTING or IN_PROGRESS status, and filter scheduled campaigns by send_at in Python to use Snowflake cached results and avoid warehouse compute costs. """ query = sa.select(Campaign).where( Campaign.status.in_( [ CampaignStatus.SCHEDULED, CampaignStatus.IN_PROGRESS, ] ), ) result = self.db.session.execute(query) return [ campaign for campaign in result.scalars().all() if campaign.is_ready_to_dispatch() ] def update_as_sent(self, campaign_id: str) -> bool: query = self.db.query_from_template( "campaign/update_as_sent.sql", context={ "campaign_id": campaign_id, }, ) result = self.db.session.connection().execute(query) return result.rowcount == 1