from collections.abc import Sequence import sqlalchemy as sa from sqlalchemy.orm import joinedload, selectinload from dmp.adapters.db import Repository from dmp.tiktok.models import TikTokAdAccount, TikTokUserAdAccount class TikTokUserAdAccountRepository(Repository[TikTokUserAdAccount]): default_options = (joinedload(TikTokUserAdAccount.ad_account),) def find_by_ad_accounts_ids_and_identity_id( self, ad_accounts_ids: list[str], identity_id: str ) -> Sequence[TikTokUserAdAccount]: query = ( sa.select(TikTokUserAdAccount) .where( sa.and_( TikTokUserAdAccount.ad_account_id.in_(ad_accounts_ids), TikTokUserAdAccount.identity_id == identity_id, ) ) .options(*self.default_options) ) result = self.db.session.execute(query) return result.scalars().all() def find_by_identity_id(self, identity_id: str) -> Sequence[TikTokUserAdAccount]: query = ( sa.select(TikTokUserAdAccount) .where(TikTokUserAdAccount.identity_id == identity_id) .options(*self.default_options) ) result = self.db.session.execute(query) return result.scalars().all() def get_by_ad_account_id_and_identity_id( self, ad_account_id: str, identity_id: str ) -> TikTokUserAdAccount | None: query = ( sa.select(TikTokUserAdAccount) .where( sa.and_( TikTokUserAdAccount.ad_account_id == ad_account_id, TikTokUserAdAccount.identity_id == identity_id, ) ) .options(*self.default_options) ) result = self.db.session.execute(query) return result.scalar_one_or_none() def find_by_ad_account_id_and_account( self, ad_account_id: str, vendor_id: int, subaccount_id: int ) -> Sequence[TikTokUserAdAccount]: query = ( sa.select(TikTokUserAdAccount) .where( sa.and_( TikTokUserAdAccount.ad_account_id == ad_account_id, TikTokUserAdAccount.vendor_id == vendor_id, TikTokUserAdAccount.subaccount_id == subaccount_id, ) ) .options(*self.default_options) ) result = self.db.session.execute(query) return result.scalars().all() def find_by_vendor_and_subaccount_ids( self, vendor_ids: list[int], subaccount_ids: list[int] ) -> Sequence[TikTokUserAdAccount]: query = self.db.query_from_template( "tiktok-user-ad-account/find-by-vendor-and-subaccount-ids.sql", context={ "vendor_ids": vendor_ids, "subaccount_ids": subaccount_ids, }, ) return ( self.db.session.execute( sa.select(TikTokUserAdAccount) .from_statement(query) .options(selectinload(TikTokUserAdAccount.ad_account)) ) .scalars() .all() ) def find_by_ad_accounts_external_ids( self, ad_accounts_ids: set[str] ) -> Sequence[TikTokUserAdAccount]: if not ad_accounts_ids: return [] query = ( sa.select(TikTokUserAdAccount) .join(TikTokAdAccount) .where( TikTokAdAccount.external_id.in_(ad_accounts_ids), ) .options(*self.default_options) ) result = self.db.session.execute(query) return result.scalars().all()