from dataclasses import dataclass import sqlalchemy as sa 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 ReportingDB, transactional from dmp.adapters.fivetran import FivetranClient from dmp.app_connections.enums import AppConnectionStatus from dmp.config import Settings from dmp.shopify.repositories import ( CollectionArtistRepository, StoreAssociationRepository, ) from dmp.shopify.services import StoreAssociationService @dataclass class DeleteStoreRequest(AuthRequest): association_id: str @singleton class DeleteStoreHandler: permission = Permission("fan_data_channel", "revoke") def __init__( self, db: ReportingDB, auth_service: AuthService, store_association_service: StoreAssociationService, store_association_repository: StoreAssociationRepository, collection_artist_repository: CollectionArtistRepository, fivetran_client: FivetranClient, settings: Settings, ) -> None: self.db = db self.auth_service = auth_service self.store_association_service = store_association_service self.store_association_repository = store_association_repository self.collection_artist_repository = collection_artist_repository self.fivetran_client = fivetran_client self.settings = settings @transactional def handle(self, request: DeleteStoreRequest) -> None: 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, ) self.fivetran_client.delete_connection(store.fivetran_connector_id) if store.status != AppConnectionStatus.PENDING: self.collection_artist_repository.delete_by_association_id( association_id=store.id ) self._drop_snowflake_schema( database=self.settings.snowflake_shopify_integrations_database, schema=store.fivetran_schema, ) store.status = AppConnectionStatus.DELETED self.store_association_repository.add(store) return None def _drop_snowflake_schema(self, database: str | None, schema: str) -> None: query = f"DROP SCHEMA IF EXISTS {f'{database}.' if database else ''}{schema} CASCADE;" self.db.session.execute(sa.text(query)) return None