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.fivetran import FivetranClient from dmp.adapters.fivetran.models import ConnectCard from dmp.shopify.models import ShopifyStoreAssociation from dmp.shopify.services import StoreAssociationService @dataclass class ReconnectStoreRequest(AuthRequest): association_id: str redirect_uri: str @singleton class ReconnectStoreHandler: permission = Permission("fan_data_channel", "connect") def __init__( self, auth_service: AuthService, fivetran_client: FivetranClient, store_association_service: StoreAssociationService, ) -> None: self.auth_service = auth_service self.fivetran_client = fivetran_client self.store_association_service = store_association_service def handle( self, request: ReconnectStoreRequest ) -> tuple[ShopifyStoreAssociation, ConnectCard]: store = self.store_association_service.get_store(request.association_id) self.auth_service.check_account_resource( request.identity_id, account=store.account, permission=self.permission, resource_id=store.id, ) connect_card = self.fivetran_client.get_connect_card( connection_id=store.fivetran_connector_id, redirect_uri=request.redirect_uri, ) return store, connect_card