import logging from dataclasses import dataclass from datetime import UTC, datetime, timedelta from fansifter_common.adapters.db import Database from app.adapters.aws.kms import KMSClient from app.adapters.database.repository import AdAccountRepository from app.adapters.meta.client import FacebookClient from app.adapters.tiktok.client import TiktokClient from app.models import CustomAudience, Event logger = logging.getLogger(__name__) @dataclass(kw_only=True) class EventHandler: db: Database kms_client: KMSClient ad_account_repository: AdAccountRepository facebook_client: FacebookClient tiktok_client: TiktokClient def handle(self, event: Event) -> None: logger.info( "Starting deleting outdated audiences for %s platform, %s account", event.platform, event.ad_account, ) with self.db.session_factory(): encrypted_token = self.ad_account_repository.get_api_token( event.platform, event.ad_account ) api_token = self.kms_client.decrypt(encrypted_token, context={"field": "token"}) client: FacebookClient | TiktokClient if event.platform == "META": client = self.facebook_client elif event.platform == "TIKTOK": client = self.tiktok_client else: raise NotImplementedError( f"Client is not implemented for {event.platform} platform" ) audiences = client.get_audiences(event.ad_account, api_token) outdated_audiences = self.filter_outdated_audiences( audiences, event.audience_ttl_days ) if outdated_audiences: client.delete_audiences(event.ad_account, outdated_audiences, api_token) logger.info( "Outdated audiences for %s platform, %s account was deleted", event.platform, event.ad_account, ) else: logger.info( "No outdated audiences was found for %s platform", event.platform ) def filter_outdated_audiences( self, audiences: list[CustomAudience], audience_ttl_days: int ) -> list[CustomAudience]: now = datetime.now(UTC) outdated_audiences = [] for audience in audiences: if audience.time_created + timedelta(days=audience_ttl_days) < now: outdated_audiences.append(audience) return outdated_audiences