from dataclasses import dataclass from fansifter_common.adapters.db import BaseRepository, Database from sqlalchemy import select from app.adapters.database.db_models import ( MetaUserConnection, TiktokUserConnection, ) from app.app_types import EncryptedToken user_connection_models: dict[ str, type[MetaUserConnection] | type[TiktokUserConnection] ] = { "META": MetaUserConnection, "TIKTOK": TiktokUserConnection, } @dataclass(kw_only=True) class AdAccountRepository( BaseRepository[Database, MetaUserConnection | TiktokUserConnection] ): db: Database def get_api_token(self, platform: str, ad_account: str) -> EncryptedToken: user_connection_model = user_connection_models[platform] query = ( select(user_connection_model.token) .where(user_connection_model.is_valid) .where(user_connection_model.external_id == ad_account) .order_by(user_connection_model.updated_at.desc()) .limit(1) ) result = self.db.session.execute(query).scalar_one() return EncryptedToken(result)