From 896f3252b807a6ed3bab6f8d562ba31023385b0b Mon Sep 17 00:00:00 2001 From: Harry Date: Thu, 25 Sep 2025 18:22:19 +0800 Subject: [PATCH] refactor(api): refactor all - Replaced direct imports of `TriggerProviderID` and `ToolProviderID` from `core.plugin.entities.plugin` with imports from `models.provider_ids` for better organization. - Refactored workflow node classes to inherit from a unified `Node` class, improving consistency and maintainability. - Removed unused code and comments to clean up the implementation, particularly in the `workflow_trigger.py` and `builtin_tools_manage_service.py` files. These changes enhance the clarity and structure of the codebase, facilitating easier future modifications. --- api/commands.py | 4 +- api/controllers/console/__init__.py | 15 +-- .../console/app/workflow_trigger.py | 99 ------------------- .../console/workspace/tool_providers.py | 3 +- .../console/workspace/trigger_providers.py | 2 +- api/core/app/apps/workflow/app_runner.py | 2 +- api/core/entities/provider_entities.py | 2 +- api/core/helper/name_generator.py | 2 +- api/core/plugin/entities/plugin.py | 2 +- api/core/plugin/impl/tool.py | 2 - api/core/plugin/impl/trigger.py | 2 +- api/core/trigger/provider.py | 2 +- api/core/trigger/trigger_manager.py | 2 +- api/core/workflow/enums.py | 10 ++ .../workflow/nodes/trigger_plugin/entities.py | 2 +- .../trigger_plugin/trigger_plugin_node.py | 8 +- .../trigger_schedule/trigger_schedule_node.py | 8 +- .../workflow/nodes/trigger_webhook/node.py | 8 +- api/models/provider_ids.py | 5 + api/services/datasource_provider_service.py | 2 +- .../plugin/plugin_parameter_service.py | 2 +- .../tools/builtin_tools_manage_service.py | 2 - api/services/tools/tools_transform_service.py | 2 +- .../trigger/trigger_provider_service.py | 2 +- .../trigger_subscription_builder_service.py | 2 +- api/services/trigger_service.py | 4 +- api/services/webhook_service.py | 2 +- .../workflow_plugin_trigger_service.py | 2 +- api/tasks/trigger_processing_tasks.py | 2 +- .../tools/test_tools_transform_service.py | 19 ++-- 30 files changed, 61 insertions(+), 160 deletions(-) diff --git a/api/commands.py b/api/commands.py index e493e7fad3..5bd92ba4b6 100644 --- a/api/commands.py +++ b/api/commands.py @@ -15,12 +15,12 @@ from sqlalchemy.orm import sessionmaker from configs import dify_config from constants.languages import languages from core.helper import encrypter +from core.plugin.entities.plugin_daemon import CredentialType from core.plugin.impl.plugin import PluginInstaller from core.rag.datasource.vdb.vector_factory import Vector from core.rag.datasource.vdb.vector_type import VectorType from core.rag.index_processor.constant.built_in_field import BuiltInField from core.rag.models.document import Document -from core.tools.entities.tool_entities import CredentialType from core.tools.utils.system_oauth_encryption import encrypt_system_oauth_params from events.app_event import app_was_created from extensions.ext_database import db @@ -1234,7 +1234,7 @@ def setup_system_trigger_oauth_client(provider, client_params): """ Setup system trigger oauth client """ - from core.plugin.entities.plugin import TriggerProviderID + from models.provider_ids import TriggerProviderID from models.trigger import TriggerOAuthSystemClient provider_id = TriggerProviderID(provider) diff --git a/api/controllers/console/__init__.py b/api/controllers/console/__init__.py index c5b981bae1..0bd2612841 100644 --- a/api/controllers/console/__init__.py +++ b/api/controllers/console/__init__.py @@ -137,20 +137,6 @@ from .explore import ( # Import tag controllers from .tag import tags -# Import workspace controllers -from .workspace import ( - account, - agent_providers, - endpoint, - load_balancing_config, - members, - model_providers, - models, - plugin, - tool_providers, - workspace, -) - # Explore Audio api.add_resource(ChatAudioApi, "/installed-apps//audio-to-text", endpoint="installed_app_audio") api.add_resource(ChatTextApi, "/installed-apps//text-to-audio", endpoint="installed_app_text") @@ -312,5 +298,6 @@ __all__ = [ "workflow_draft_variable", "workflow_run", "workflow_statistic", + "workflow_trigger", "workspace", ] diff --git a/api/controllers/console/app/workflow_trigger.py b/api/controllers/console/app/workflow_trigger.py index abfe882b67..584f7c084b 100644 --- a/api/controllers/console/app/workflow_trigger.py +++ b/api/controllers/console/app/workflow_trigger.py @@ -9,7 +9,6 @@ from configs import dify_config from controllers.console import api from controllers.console.app.wraps import get_app_model from controllers.console.wraps import account_initialization_required, setup_required -from core.model_runtime.utils.encoders import jsonable_encoder from extensions.ext_database import db from fields.workflow_trigger_fields import trigger_fields, triggers_list_fields, webhook_trigger_fields from libs.login import current_user, login_required @@ -18,104 +17,6 @@ from models.workflow import AppTrigger, AppTriggerStatus, WorkflowWebhookTrigger logger = logging.getLogger(__name__) -from services.workflow_plugin_trigger_service import WorkflowPluginTriggerService - - -class PluginTriggerApi(Resource): - """Workflow Plugin Trigger API""" - - @setup_required - @login_required - @account_initialization_required - @get_app_model(mode=AppMode.WORKFLOW) - def post(self, app_model): - """Create plugin trigger""" - parser = reqparse.RequestParser() - parser.add_argument("node_id", type=str, required=False, location="json") - parser.add_argument("provider_id", type=str, required=False, location="json") - parser.add_argument("trigger_name", type=str, required=False, location="json") - parser.add_argument("subscription_id", type=str, required=False, location="json") - args = parser.parse_args() - - assert isinstance(current_user, Account) - assert current_user.current_tenant_id is not None - if not current_user.is_editor: - raise Forbidden() - - plugin_trigger = WorkflowPluginTriggerService.create_plugin_trigger( - app_id=app_model.id, - tenant_id=current_user.current_tenant_id, - node_id=args["node_id"], - provider_id=args["provider_id"], - trigger_name=args["trigger_name"], - subscription_id=args["subscription_id"], - ) - - return jsonable_encoder(plugin_trigger) - - @setup_required - @login_required - @account_initialization_required - @get_app_model(mode=AppMode.WORKFLOW) - def get(self, app_model): - """Get plugin trigger""" - parser = reqparse.RequestParser() - parser.add_argument("node_id", type=str, required=True, help="Node ID is required") - args = parser.parse_args() - - plugin_trigger = WorkflowPluginTriggerService.get_plugin_trigger( - app_id=app_model.id, - node_id=args["node_id"], - ) - - return jsonable_encoder(plugin_trigger) - - @setup_required - @login_required - @account_initialization_required - @get_app_model(mode=AppMode.WORKFLOW) - def put(self, app_model): - """Update plugin trigger""" - parser = reqparse.RequestParser() - parser.add_argument("node_id", type=str, required=True, help="Node ID is required") - parser.add_argument("subscription_id", type=str, required=True, location="json", help="Subscription ID") - args = parser.parse_args() - - assert isinstance(current_user, Account) - assert current_user.current_tenant_id is not None - if not current_user.is_editor: - raise Forbidden() - - plugin_trigger = WorkflowPluginTriggerService.update_plugin_trigger( - app_id=app_model.id, - node_id=args["node_id"], - subscription_id=args["subscription_id"], - ) - - return jsonable_encoder(plugin_trigger) - - @setup_required - @login_required - @account_initialization_required - @get_app_model(mode=AppMode.WORKFLOW) - def delete(self, app_model): - """Delete plugin trigger""" - parser = reqparse.RequestParser() - parser.add_argument("node_id", type=str, required=True, help="Node ID is required") - args = parser.parse_args() - - assert isinstance(current_user, Account) - assert current_user.current_tenant_id is not None - if not current_user.is_editor: - raise Forbidden() - - WorkflowPluginTriggerService.delete_plugin_trigger( - app_id=app_model.id, - node_id=args["node_id"], - ) - - return {"result": "success"}, 204 - class WebhookTriggerApi(Resource): """Webhook Trigger API""" diff --git a/api/controllers/console/workspace/tool_providers.py b/api/controllers/console/workspace/tool_providers.py index 5d88c79e78..63a0809bc9 100644 --- a/api/controllers/console/workspace/tool_providers.py +++ b/api/controllers/console/workspace/tool_providers.py @@ -21,11 +21,12 @@ from core.mcp.auth.auth_provider import OAuthClientProvider from core.mcp.error import MCPAuthError, MCPError from core.mcp.mcp_client import MCPClient from core.model_runtime.utils.encoders import jsonable_encoder -from core.plugin.entities.plugin import ToolProviderID from core.plugin.entities.plugin_daemon import CredentialType from core.plugin.impl.oauth import OAuthHandler from libs.helper import StrLen, alphanumeric, uuid_value from libs.login import login_required +from models.provider_ids import ToolProviderID + # from models.provider_ids import ToolProviderID from services.plugin.oauth_service import OAuthProxyService from services.tools.api_tools_manage_service import ApiToolManageService diff --git a/api/controllers/console/workspace/trigger_providers.py b/api/controllers/console/workspace/trigger_providers.py index 70c73afe1f..0566adccb8 100644 --- a/api/controllers/console/workspace/trigger_providers.py +++ b/api/controllers/console/workspace/trigger_providers.py @@ -9,7 +9,6 @@ from configs import dify_config from controllers.console import api from controllers.console.wraps import account_initialization_required, setup_required 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 core.trigger.entities.entities import SubscriptionBuilderUpdater @@ -17,6 +16,7 @@ from core.trigger.trigger_manager import TriggerManager from extensions.ext_database import db from libs.login import current_user, login_required from models.account import Account +from models.provider_ids import TriggerProviderID from services.plugin.oauth_service import OAuthProxyService from services.trigger.trigger_provider_service import TriggerProviderService from services.trigger.trigger_subscription_builder_service import TriggerSubscriptionBuilderService diff --git a/api/core/app/apps/workflow/app_runner.py b/api/core/app/apps/workflow/app_runner.py index 859f906cfd..bf07dbcc52 100644 --- a/api/core/app/apps/workflow/app_runner.py +++ b/api/core/app/apps/workflow/app_runner.py @@ -1,6 +1,6 @@ import logging import time -from typing import cast +from typing import Optional, cast from core.app.apps.base_app_queue_manager import AppQueueManager from core.app.apps.workflow.app_config_manager import WorkflowAppConfig diff --git a/api/core/entities/provider_entities.py b/api/core/entities/provider_entities.py index dd6f689258..deac8847e6 100644 --- a/api/core/entities/provider_entities.py +++ b/api/core/entities/provider_entities.py @@ -1,5 +1,5 @@ from enum import StrEnum, auto -from typing import Union +from typing import Optional, Union from pydantic import BaseModel, ConfigDict, Field diff --git a/api/core/helper/name_generator.py b/api/core/helper/name_generator.py index 4e19e3946f..b5f9299d9f 100644 --- a/api/core/helper/name_generator.py +++ b/api/core/helper/name_generator.py @@ -3,7 +3,7 @@ import re from collections.abc import Sequence from typing import Any -from core.tools.entities.tool_entities import CredentialType +from core.plugin.entities.plugin_daemon import CredentialType logger = logging.getLogger(__name__) diff --git a/api/core/plugin/entities/plugin.py b/api/core/plugin/entities/plugin.py index fd53a44db6..71bd55df83 100644 --- a/api/core/plugin/entities/plugin.py +++ b/api/core/plugin/entities/plugin.py @@ -1,7 +1,7 @@ import datetime from collections.abc import Mapping from enum import StrEnum, auto -from typing import Any +from typing import Any, Optional from packaging.version import InvalidVersion, Version from pydantic import BaseModel, Field, field_validator, model_validator diff --git a/api/core/plugin/impl/tool.py b/api/core/plugin/impl/tool.py index 4513bf2fbe..6fa5136b42 100644 --- a/api/core/plugin/impl/tool.py +++ b/api/core/plugin/impl/tool.py @@ -8,8 +8,6 @@ from core.plugin.entities.plugin_daemon import CredentialType, PluginBasicBoolea from core.plugin.impl.base import BasePluginClient from core.plugin.utils.chunk_merger import merge_blob_chunks from core.schemas.resolver import resolve_dify_schema_refs - -# from core.tools.entities.tool_entities import CredentialType, ToolInvokeMessage, ToolParameter from core.tools.entities.tool_entities import ToolInvokeMessage, ToolParameter from models.provider_ids import GenericProviderID, ToolProviderID diff --git a/api/core/plugin/impl/trigger.py b/api/core/plugin/impl/trigger.py index c0316cd46d..e02065e724 100644 --- a/api/core/plugin/impl/trigger.py +++ b/api/core/plugin/impl/trigger.py @@ -4,7 +4,6 @@ from typing import Any from flask import Request -from core.plugin.entities.plugin import GenericProviderID, TriggerProviderID from core.plugin.entities.plugin_daemon import CredentialType, PluginTriggerProviderEntity from core.plugin.entities.request import ( PluginTriggerDispatchResponse, @@ -16,6 +15,7 @@ from core.plugin.entities.request import ( from core.plugin.impl.base import BasePluginClient from core.plugin.utils.http_parser import deserialize_response, serialize_request from core.trigger.entities.entities import Subscription +from models.provider_ids import GenericProviderID, TriggerProviderID class PluginTriggerManager(BasePluginClient): diff --git a/api/core/trigger/provider.py b/api/core/trigger/provider.py index bcba5868fc..7564f87386 100644 --- a/api/core/trigger/provider.py +++ b/api/core/trigger/provider.py @@ -9,7 +9,6 @@ from typing import Any, Optional from flask import Request from core.entities.provider_entities import BasicProviderConfig -from core.plugin.entities.plugin import TriggerProviderID from core.plugin.entities.plugin_daemon import CredentialType from core.plugin.entities.request import ( TriggerDispatchResponse, @@ -28,6 +27,7 @@ from core.trigger.entities.entities import ( Unsubscription, ) from core.trigger.errors import TriggerProviderCredentialValidationError +from models.provider_ids import TriggerProviderID from services.plugin.plugin_service import PluginService logger = logging.getLogger(__name__) diff --git a/api/core/trigger/trigger_manager.py b/api/core/trigger/trigger_manager.py index 6ce268ef1a..80e71417f6 100644 --- a/api/core/trigger/trigger_manager.py +++ b/api/core/trigger/trigger_manager.py @@ -10,7 +10,6 @@ from typing import Any, Optional from flask import Request import contexts -from core.plugin.entities.plugin import TriggerProviderID from core.plugin.entities.plugin_daemon import CredentialType from core.plugin.entities.request import Event, TriggerInvokeResponse from core.plugin.impl.exc import PluginInvokeError @@ -22,6 +21,7 @@ from core.trigger.entities.entities import ( Unsubscription, ) from core.trigger.provider import PluginTriggerProviderController +from models.provider_ids import TriggerProviderID logger = logging.getLogger(__name__) diff --git a/api/core/workflow/enums.py b/api/core/workflow/enums.py index d6dacd7c6c..fdd4f3626f 100644 --- a/api/core/workflow/enums.py +++ b/api/core/workflow/enums.py @@ -62,6 +62,16 @@ class NodeType(StrEnum): TRIGGER_SCHEDULE = "trigger-schedule" TRIGGER_PLUGIN = "trigger-plugin" + @property + def is_start_node(self) -> bool: + """Check if this node type can serve as a workflow entry point.""" + return self in [ + NodeType.START, + NodeType.TRIGGER_WEBHOOK, + NodeType.TRIGGER_SCHEDULE, + NodeType.TRIGGER_PLUGIN, + ] + class NodeExecutionType(StrEnum): """Node execution type classification.""" diff --git a/api/core/workflow/nodes/trigger_plugin/entities.py b/api/core/workflow/nodes/trigger_plugin/entities.py index afe37eb83f..ed5e07baa3 100644 --- a/api/core/workflow/nodes/trigger_plugin/entities.py +++ b/api/core/workflow/nodes/trigger_plugin/entities.py @@ -2,8 +2,8 @@ from typing import Any, Optional from pydantic import Field +from core.workflow.enums import ErrorStrategy from core.workflow.nodes.base.entities import BaseNodeData, RetryConfig -from core.workflow.nodes.enums import ErrorStrategy class PluginTriggerData(BaseNodeData): diff --git a/api/core/workflow/nodes/trigger_plugin/trigger_plugin_node.py b/api/core/workflow/nodes/trigger_plugin/trigger_plugin_node.py index 6d5b2ec670..f130a699f0 100644 --- a/api/core/workflow/nodes/trigger_plugin/trigger_plugin_node.py +++ b/api/core/workflow/nodes/trigger_plugin/trigger_plugin_node.py @@ -1,16 +1,16 @@ from collections.abc import Mapping from typing import Any, Optional -from core.workflow.entities.node_entities import NodeRunResult from core.workflow.entities.workflow_node_execution import WorkflowNodeExecutionMetadataKey, WorkflowNodeExecutionStatus -from core.workflow.nodes.base import BaseNode +from core.workflow.enums import ErrorStrategy, NodeType +from core.workflow.node_events import NodeRunResult from core.workflow.nodes.base.entities import BaseNodeData, RetryConfig -from core.workflow.nodes.enums import ErrorStrategy, NodeType +from core.workflow.nodes.base.node import Node from .entities import PluginTriggerData -class TriggerPluginNode(BaseNode): +class TriggerPluginNode(Node): _node_type = NodeType.TRIGGER_PLUGIN _node_data: PluginTriggerData diff --git a/api/core/workflow/nodes/trigger_schedule/trigger_schedule_node.py b/api/core/workflow/nodes/trigger_schedule/trigger_schedule_node.py index 7c8bb4fa97..72169fdc54 100644 --- a/api/core/workflow/nodes/trigger_schedule/trigger_schedule_node.py +++ b/api/core/workflow/nodes/trigger_schedule/trigger_schedule_node.py @@ -2,15 +2,15 @@ from collections.abc import Mapping from datetime import UTC, datetime from typing import Any, Optional -from core.workflow.entities.node_entities import NodeRunResult from core.workflow.entities.workflow_node_execution import WorkflowNodeExecutionStatus -from core.workflow.nodes.base import BaseNode +from core.workflow.enums import ErrorStrategy, NodeType +from core.workflow.node_events import NodeRunResult from core.workflow.nodes.base.entities import BaseNodeData, RetryConfig -from core.workflow.nodes.enums import ErrorStrategy, NodeType +from core.workflow.nodes.base.node import Node from core.workflow.nodes.trigger_schedule.entities import TriggerScheduleNodeData -class TriggerScheduleNode(BaseNode): +class TriggerScheduleNode(Node): _node_type = NodeType.TRIGGER_SCHEDULE _node_data: TriggerScheduleNodeData diff --git a/api/core/workflow/nodes/trigger_webhook/node.py b/api/core/workflow/nodes/trigger_webhook/node.py index 4d4cb01ecc..36838a7441 100644 --- a/api/core/workflow/nodes/trigger_webhook/node.py +++ b/api/core/workflow/nodes/trigger_webhook/node.py @@ -1,16 +1,16 @@ from collections.abc import Mapping from typing import Any, Optional -from core.workflow.entities.node_entities import NodeRunResult from core.workflow.entities.workflow_node_execution import WorkflowNodeExecutionStatus -from core.workflow.nodes.base import BaseNode +from core.workflow.enums import ErrorStrategy, NodeType +from core.workflow.node_events import NodeRunResult from core.workflow.nodes.base.entities import BaseNodeData, RetryConfig -from core.workflow.nodes.enums import ErrorStrategy, NodeType +from core.workflow.nodes.base.node import Node from .entities import ContentType, WebhookData -class TriggerWebhookNode(BaseNode): +class TriggerWebhookNode(Node): _node_type = NodeType.TRIGGER_WEBHOOK _node_data: WebhookData diff --git a/api/models/provider_ids.py b/api/models/provider_ids.py index 98dc67f2f3..a4171fd65a 100644 --- a/api/models/provider_ids.py +++ b/api/models/provider_ids.py @@ -57,3 +57,8 @@ class ToolProviderID(GenericProviderID): class DatasourceProviderID(GenericProviderID): def __init__(self, value: str, is_hardcoded: bool = False) -> None: super().__init__(value, is_hardcoded) + + +class TriggerProviderID(GenericProviderID): + def __init__(self, value: str, is_hardcoded: bool = False) -> None: + super().__init__(value, is_hardcoded) \ No newline at end of file diff --git a/api/services/datasource_provider_service.py b/api/services/datasource_provider_service.py index 89a5d89f61..ffa60b9055 100644 --- a/api/services/datasource_provider_service.py +++ b/api/services/datasource_provider_service.py @@ -12,9 +12,9 @@ from core.helper import encrypter from core.helper.name_generator import generate_incremental_name from core.helper.provider_cache import NoOpProviderCredentialCache from core.model_runtime.entities.provider_entities import FormType +from core.plugin.entities.plugin_daemon import CredentialType from core.plugin.impl.datasource import PluginDatasourceManager from core.plugin.impl.oauth import OAuthHandler -from core.tools.entities.tool_entities import CredentialType from core.tools.utils.encryption import ProviderConfigCache, ProviderConfigEncrypter, create_provider_encrypter from extensions.ext_database import db from extensions.ext_redis import redis_client diff --git a/api/services/plugin/plugin_parameter_service.py b/api/services/plugin/plugin_parameter_service.py index cc81ccc158..17fda44150 100644 --- a/api/services/plugin/plugin_parameter_service.py +++ b/api/services/plugin/plugin_parameter_service.py @@ -4,7 +4,6 @@ from typing import Any, Literal from sqlalchemy.orm import Session from core.plugin.entities.parameters import PluginParameterOption -from core.plugin.entities.plugin import TriggerProviderID from core.plugin.entities.plugin_daemon import CredentialType from core.plugin.impl.dynamic_select import DynamicSelectClient from core.tools.tool_manager import ToolManager @@ -13,6 +12,7 @@ from core.trigger.entities.api_entities import TriggerProviderSubscriptionApiEnt from core.trigger.entities.entities import SubscriptionBuilder from core.trigger.trigger_manager import TriggerManager from extensions.ext_database import db +from models.provider_ids import TriggerProviderID from models.tools import BuiltinToolProvider from services.trigger.trigger_provider_service import TriggerProviderService from services.trigger.trigger_subscription_builder_service import TriggerSubscriptionBuilderService diff --git a/api/services/tools/builtin_tools_manage_service.py b/api/services/tools/builtin_tools_manage_service.py index 8ec4f14581..193a3f16c1 100644 --- a/api/services/tools/builtin_tools_manage_service.py +++ b/api/services/tools/builtin_tools_manage_service.py @@ -12,8 +12,6 @@ from constants import HIDDEN_VALUE, UNKNOWN_VALUE from core.helper.name_generator import generate_incremental_name from core.helper.position_helper import is_filtered from core.helper.provider_cache import NoOpProviderCredentialCache, ToolProviderCredentialsCache - -# from core.plugin.entities.plugin import ToolProviderID from core.plugin.entities.plugin_daemon import CredentialType from core.tools.builtin_tool.provider import BuiltinToolProviderController from core.tools.builtin_tool.providers._positions import BuiltinToolProviderSort diff --git a/api/services/tools/tools_transform_service.py b/api/services/tools/tools_transform_service.py index b9cdbed137..b7c7c2417e 100644 --- a/api/services/tools/tools_transform_service.py +++ b/api/services/tools/tools_transform_service.py @@ -89,7 +89,7 @@ class ToolTransformService: elif isinstance(provider, PluginDatasourceProviderEntity): if provider.plugin_id: if isinstance(provider.declaration.identity.icon, str): - provider.declaration.identity.icon = ToolTransformService.get_plugin_icon_url( + provider.declaration.identity.icon = PluginService.get_plugin_icon_url( tenant_id=tenant_id, filename=provider.declaration.identity.icon ) diff --git a/api/services/trigger/trigger_provider_service.py b/api/services/trigger/trigger_provider_service.py index 65e38f2ed7..fb7fdf81d1 100644 --- a/api/services/trigger/trigger_provider_service.py +++ b/api/services/trigger/trigger_provider_service.py @@ -11,7 +11,6 @@ from configs import dify_config from constants import HIDDEN_VALUE, UNKNOWN_VALUE from core.helper.provider_cache import NoOpProviderCredentialCache from core.helper.provider_encryption import create_provider_encrypter -from core.plugin.entities.plugin import TriggerProviderID from core.plugin.entities.plugin_daemon import CredentialType from core.plugin.impl.oauth import OAuthHandler from core.tools.utils.system_oauth_encryption import decrypt_system_oauth_params @@ -27,6 +26,7 @@ from core.trigger.utils.encryption import ( ) from extensions.ext_database import db from extensions.ext_redis import redis_client +from models.provider_ids import TriggerProviderID from models.trigger import TriggerOAuthSystemClient, TriggerOAuthTenantClient, TriggerSubscription from models.workflow import WorkflowPluginTrigger from services.plugin.plugin_service import PluginService diff --git a/api/services/trigger/trigger_subscription_builder_service.py b/api/services/trigger/trigger_subscription_builder_service.py index 824a2cdbdf..3e32c7a6c7 100644 --- a/api/services/trigger/trigger_subscription_builder_service.py +++ b/api/services/trigger/trigger_subscription_builder_service.py @@ -7,7 +7,6 @@ from typing import Any from flask import Request, Response -from core.plugin.entities.plugin import TriggerProviderID from core.plugin.entities.plugin_daemon import CredentialType from core.tools.errors import ToolProviderCredentialValidationError from core.trigger.entities.api_entities import SubscriptionBuilderApiEntity @@ -21,6 +20,7 @@ from core.trigger.trigger_manager import TriggerManager from core.trigger.utils.encryption import masked_credentials from core.trigger.utils.endpoint import parse_endpoint_id from extensions.ext_redis import redis_client +from models.provider_ids import TriggerProviderID from services.trigger.trigger_provider_service import TriggerProviderService logger = logging.getLogger(__name__) diff --git a/api/services/trigger_service.py b/api/services/trigger_service.py index d0329ec20c..c42a6791f5 100644 --- a/api/services/trigger_service.py +++ b/api/services/trigger_service.py @@ -7,17 +7,17 @@ from flask import Request, Response from sqlalchemy import func, select from sqlalchemy.orm import Session -from core.plugin.entities.plugin import TriggerProviderID from core.plugin.entities.plugin_daemon import CredentialType from core.plugin.utils.http_parser import deserialize_request, serialize_request from core.trigger.entities.entities import TriggerEntity from core.trigger.trigger_manager import TriggerManager -from core.workflow.nodes.enums import NodeType +from core.workflow.enums import NodeType from core.workflow.nodes.trigger_schedule.exc import TenantOwnerNotFoundError from extensions.ext_database import db from extensions.ext_storage import storage from models.account import Account, TenantAccountJoin, TenantAccountRole from models.enums import WorkflowRunTriggeredFrom +from models.provider_ids import TriggerProviderID from models.trigger import TriggerSubscription from models.workflow import Workflow, WorkflowPluginTrigger from services.async_workflow_service import AsyncWorkflowService diff --git a/api/services/webhook_service.py b/api/services/webhook_service.py index 6faf3f632e..bf699c58ac 100644 --- a/api/services/webhook_service.py +++ b/api/services/webhook_service.py @@ -15,7 +15,7 @@ from configs import dify_config from core.file.models import FileTransferMethod from core.tools.tool_file_manager import ToolFileManager from core.variables.types import SegmentType -from core.workflow.nodes.enums import NodeType +from core.workflow.enums import NodeType from extensions.ext_database import db from extensions.ext_redis import redis_client from factories import file_factory diff --git a/api/services/workflow_plugin_trigger_service.py b/api/services/workflow_plugin_trigger_service.py index 3303bda817..e1b1b0a291 100644 --- a/api/services/workflow_plugin_trigger_service.py +++ b/api/services/workflow_plugin_trigger_service.py @@ -5,7 +5,7 @@ from sqlalchemy import select from sqlalchemy.orm import Session from werkzeug.exceptions import NotFound -from core.workflow.nodes.enums import NodeType +from core.workflow.enums import NodeType from extensions.ext_database import db from extensions.ext_redis import redis_client from models.model import App diff --git a/api/tasks/trigger_processing_tasks.py b/api/tasks/trigger_processing_tasks.py index 87bcb838f0..7548db37bd 100644 --- a/api/tasks/trigger_processing_tasks.py +++ b/api/tasks/trigger_processing_tasks.py @@ -10,10 +10,10 @@ import logging from celery import shared_task from sqlalchemy.orm import Session -from core.plugin.entities.plugin import TriggerProviderID from core.trigger.trigger_manager import TriggerManager from extensions.ext_database import db from extensions.ext_storage import storage +from models.provider_ids import TriggerProviderID from models.trigger import TriggerSubscription from services.trigger_debug_service import TriggerDebugService from services.trigger_service import TriggerService diff --git a/api/tests/test_containers_integration_tests/services/tools/test_tools_transform_service.py b/api/tests/test_containers_integration_tests/services/tools/test_tools_transform_service.py index 827f9c010e..a71a69b473 100644 --- a/api/tests/test_containers_integration_tests/services/tools/test_tools_transform_service.py +++ b/api/tests/test_containers_integration_tests/services/tools/test_tools_transform_service.py @@ -7,6 +7,7 @@ from core.tools.entities.api_entities import ToolProviderApiEntity from core.tools.entities.common_entities import I18nObject from core.tools.entities.tool_entities import ToolProviderType from models.tools import ApiToolProvider, BuiltinToolProvider, MCPToolProvider, WorkflowToolProvider +from services.plugin.plugin_service import PluginService from services.tools.tools_transform_service import ToolTransformService @@ -111,13 +112,13 @@ class TestToolTransformService: filename = "test_icon.png" # Act: Execute the method under test - result = ToolTransformService.get_plugin_icon_url(tenant_id, filename) + result = PluginService.get_plugin_icon_url(str(tenant_id), filename) # Assert: Verify the expected outcomes assert result is not None assert isinstance(result, str) assert "console/api/workspaces/current/plugin/icon" in result - assert tenant_id in result + assert str(tenant_id) in result assert filename in result assert result.startswith("https://console.example.com") @@ -142,13 +143,13 @@ class TestToolTransformService: filename = "test_icon.png" # Act: Execute the method under test - result = ToolTransformService.get_plugin_icon_url(tenant_id, filename) + result = PluginService.get_plugin_icon_url(str(tenant_id), filename) # Assert: Verify the expected outcomes assert result is not None assert isinstance(result, str) assert result.startswith("/console/api/workspaces/current/plugin/icon") - assert tenant_id in result + assert str(tenant_id) in result assert filename in result # Verify URL structure @@ -332,7 +333,7 @@ class TestToolTransformService: provider = {"type": ToolProviderType.BUILT_IN.value, "name": fake.company(), "icon": "🔧"} # Act: Execute the method under test - ToolTransformService.repack_provider(tenant_id, provider) + ToolTransformService.repack_provider(str(tenant_id), provider) # Assert: Verify the expected outcomes assert "icon" in provider @@ -356,7 +357,7 @@ class TestToolTransformService: # Create provider entity with plugin_id provider = ToolProviderApiEntity( - id=fake.uuid4(), + id=str(fake.uuid4()), author=fake.name(), name=fake.company(), description=I18nObject(en_US=fake.text(max_nb_chars=100)), @@ -378,14 +379,14 @@ class TestToolTransformService: assert provider.icon is not None assert isinstance(provider.icon, str) assert "console/api/workspaces/current/plugin/icon" in provider.icon - assert tenant_id in provider.icon + assert str(tenant_id) in provider.icon assert "test_icon.png" in provider.icon # Verify dark icon handling assert provider.icon_dark is not None assert isinstance(provider.icon_dark, str) assert "console/api/workspaces/current/plugin/icon" in provider.icon_dark - assert tenant_id in provider.icon_dark + assert str(tenant_id) in provider.icon_dark assert "test_icon_dark.png" in provider.icon_dark def test_repack_provider_entity_no_plugin_success( @@ -421,7 +422,7 @@ class TestToolTransformService: ) # Act: Execute the method under test - ToolTransformService.repack_provider(tenant_id, provider) + ToolTransformService.repack_provider(str(tenant_id), provider) # Assert: Verify the expected outcomes assert provider.icon is not None