from dataclasses import dataclass from anydi import singleton from dmp.adapters.db import DefaultDB, ReportingDB, transactional from dmp.adapters.fivetran import FivetranClient from dmp.app_connections.enums import AppConnectionStatus from dmp.tiktok.exceptions import TikTokAdReportingConnectionNotFoundError from dmp.tiktok.models import TikTokAdReportingConnection from dmp.tiktok.repositories import TikTokAdReportingConnectionRepository from dmp.tiktok.services import TikTokAdReportingConnectionService @dataclass class RefreshTikTokAdReportingConnectionRequest: fivetran_connection_id: str @singleton class RefreshTikTokAdReportingConnectionHandler: def __init__( self, db: DefaultDB, reporting_db: ReportingDB, fivetran_client: FivetranClient, ad_reporting_connection_repository: TikTokAdReportingConnectionRepository, ad_reporting_connection_service: TikTokAdReportingConnectionService, ) -> None: self.db = db self.reporting_db = reporting_db self.fivetran_client = fivetran_client self.ad_reporting_connection_repository = ad_reporting_connection_repository self.ad_reporting_connection_service = ad_reporting_connection_service @transactional def handle( self, request: RefreshTikTokAdReportingConnectionRequest ) -> TikTokAdReportingConnection: connection = ( self.ad_reporting_connection_repository.get_by_fivetran_connection_id( fivetran_connection_id=request.fivetran_connection_id ) ) if not connection or connection.status == AppConnectionStatus.DELETED: raise TikTokAdReportingConnectionNotFoundError connection = self.ad_reporting_connection_service.refresh_connection(connection) return connection