From 3874e58dc2fa0d69cd6136089ad86ffe072bbb27 Mon Sep 17 00:00:00 2001 From: Harry Date: Fri, 5 Sep 2025 11:31:48 +0800 Subject: [PATCH] refactor(trigger): enhance trigger provider deletion process and session management --- .../console/workspace/trigger_providers.py | 24 +++++++++--- .../trigger/trigger_provider_service.py | 37 +++++++++---------- .../workflow_plugin_trigger_service.py | 24 ++++++------ 3 files changed, 47 insertions(+), 38 deletions(-) diff --git a/api/controllers/console/workspace/trigger_providers.py b/api/controllers/console/workspace/trigger_providers.py index d585b66964..eb940ca21b 100644 --- a/api/controllers/console/workspace/trigger_providers.py +++ b/api/controllers/console/workspace/trigger_providers.py @@ -2,6 +2,7 @@ import logging from flask import make_response, redirect, request from flask_restx import Resource, reqparse +from sqlalchemy.orm import Session from werkzeug.exceptions import BadRequest, Forbidden from configs import dify_config @@ -11,11 +12,13 @@ from core.model_runtime.utils.encoders import jsonable_encoder from core.plugin.entities.plugin import TriggerProviderID from core.plugin.entities.plugin_daemon import CredentialType from core.plugin.impl.oauth import OAuthHandler +from extensions.ext_database import db from libs.login import current_user, login_required from models.account import Account from services.plugin.oauth_service import OAuthProxyService from services.trigger.trigger_provider_service import TriggerProviderService from services.trigger.trigger_subscription_builder_service import TriggerSubscriptionBuilderService +from services.workflow_plugin_trigger_service import WorkflowPluginTriggerService logger = logging.getLogger(__name__) @@ -212,12 +215,21 @@ class TriggerSubscriptionDeleteApi(Resource): raise Forbidden() try: - result = TriggerProviderService.delete_trigger_provider( - tenant_id=user.current_tenant_id, - subscription_id=subscription_id, - ) - return result - + with Session(db.engine) as session: + # Delete trigger provider subscription + TriggerProviderService.delete_trigger_provider( + session=session, + tenant_id=user.current_tenant_id, + subscription_id=subscription_id, + ) + # Delete plugin triggers + WorkflowPluginTriggerService.delete_plugin_trigger_by_subscription( + session=session, + tenant_id=user.current_tenant_id, + subscription_id=subscription_id, + ) + session.commit() + return {"result": "success"} except ValueError as e: raise BadRequest(str(e)) except Exception as e: diff --git a/api/services/trigger/trigger_provider_service.py b/api/services/trigger/trigger_provider_service.py index 8bdded8522..5570b46062 100644 --- a/api/services/trigger/trigger_provider_service.py +++ b/api/services/trigger/trigger_provider_service.py @@ -162,34 +162,31 @@ class TriggerProviderService: raise ValueError(str(e)) @classmethod - def delete_trigger_provider(cls, tenant_id: str, subscription_id: str) -> dict: + def delete_trigger_provider(cls, session: Session, tenant_id: str, subscription_id: str): """ - Delete a trigger provider subscription. + Delete a trigger provider subscription within an existing session. + :param session: Database session :param tenant_id: Tenant ID :param subscription_id: Subscription instance ID :return: Success response """ - with Session(db.engine) as session: - db_provider = session.query(TriggerSubscription).filter_by(tenant_id=tenant_id, id=subscription_id).first() - if not db_provider: - raise ValueError(f"Trigger provider subscription {subscription_id} not found") + db_provider = session.query(TriggerSubscription).filter_by(tenant_id=tenant_id, id=subscription_id).first() + if not db_provider: + raise ValueError(f"Trigger provider subscription {subscription_id} not found") - provider_controller = TriggerManager.get_trigger_provider( - tenant_id, TriggerProviderID(db_provider.provider_id) - ) - # Clear cache - _, cache = create_trigger_provider_encrypter_for_subscription( - tenant_id=tenant_id, - controller=provider_controller, - subscription=db_provider, - ) + provider_controller = TriggerManager.get_trigger_provider( + tenant_id, TriggerProviderID(db_provider.provider_id) + ) + # Clear cache + _, cache = create_trigger_provider_encrypter_for_subscription( + tenant_id=tenant_id, + controller=provider_controller, + subscription=db_provider, + ) - session.delete(db_provider) - session.commit() - - cache.delete() - return {"result": "success"} + session.delete(db_provider) + cache.delete() @classmethod def refresh_oauth_token( diff --git a/api/services/workflow_plugin_trigger_service.py b/api/services/workflow_plugin_trigger_service.py index 337a79ec8b..b171e73709 100644 --- a/api/services/workflow_plugin_trigger_service.py +++ b/api/services/workflow_plugin_trigger_service.py @@ -317,32 +317,32 @@ class WorkflowPluginTriggerService: @classmethod def delete_plugin_trigger_by_subscription( cls, + session: Session, tenant_id: str, subscription_id: str, ) -> None: - """Delete a plugin trigger by tenant_id and subscription_id + """Delete a plugin trigger by tenant_id and subscription_id within an existing session Args: + session: Database session tenant_id: The tenant ID subscription_id: The subscription ID Raises: NotFound: If plugin trigger not found """ - with Session(db.engine) as session: - # Find plugin trigger using indexed columns - plugin_trigger = session.scalar( - select(WorkflowPluginTrigger).where( - WorkflowPluginTrigger.tenant_id == tenant_id, - WorkflowPluginTrigger.subscription_id == subscription_id, - ) + # Find plugin trigger using indexed columns + plugin_trigger = session.scalar( + select(WorkflowPluginTrigger).where( + WorkflowPluginTrigger.tenant_id == tenant_id, + WorkflowPluginTrigger.subscription_id == subscription_id, ) + ) - if not plugin_trigger: - raise NotFound("Plugin trigger not found") + if not plugin_trigger: + raise NotFound("Plugin trigger not found") - session.delete(plugin_trigger) - session.commit() + session.delete(plugin_trigger) @classmethod def delete_all_by_subscription(