from dataclasses import dataclass from anydi import singleton from fansifter_common.auth.requests import AuthRequest from fansifter_common.auth.services import AuthService from fansifter_common.auth.types import Permission from dmp.adapters.db import DefaultDB, transactional from dmp.adapters.fivetran import FivetranClient from dmp.app_connections.enums import AppConnectionStatus from dmp.meta.exceptions import MetaAdReportingConnectionNotFoundError from dmp.meta.repositories import MetaAdReportingConnectionRepository from dmp.meta.services import MetaAdReportingConnectionService @dataclass class ReconnectMetaAdReportingRequest(AuthRequest): redirect_uri: str @dataclass class ReconnectMetaAdReportingResponse: connection_id: str connect_card_uri: str @singleton class ReconnectMetaAdReportingHandler: permission = Permission("ad_connection", "revoke") def __init__( self, db: DefaultDB, auth_service: AuthService, fivetran_client: FivetranClient, ad_reporting_connection_service: MetaAdReportingConnectionService, ad_reporting_connection_repository: MetaAdReportingConnectionRepository, ) -> None: self.db = db self.auth_service = auth_service self.fivetran_client = fivetran_client self.ad_reporting_connection_service = ad_reporting_connection_service self.ad_reporting_connection_repository = ad_reporting_connection_repository @transactional def handle( self, request: ReconnectMetaAdReportingRequest ) -> ReconnectMetaAdReportingResponse: connection = self.ad_reporting_connection_service.get_by_identity_id( identity_id=request.identity_id ) if not connection or connection.status == AppConnectionStatus.DELETED: raise MetaAdReportingConnectionNotFoundError else: self.auth_service.check_owned_resource( connection.identity_id, permission=self.permission, resource_id=connection.id, ) connection.initial_email_sent = False connect_card = self.fivetran_client.get_connect_card( connection_id=connection.fivetran_connector_id, redirect_uri=request.redirect_uri, ) self.ad_reporting_connection_repository.add(connection) return ReconnectMetaAdReportingResponse( connection_id=connection.id, connect_card_uri=connect_card.uri, )