From b5650b579d18b3c754d24b7d21f660f54162d68e Mon Sep 17 00:00:00 2001 From: Asuka Minato Date: Tue, 25 Nov 2025 21:04:27 +0900 Subject: [PATCH] fix [Chore/Refactor] Generate complete API documentation using Flask-RESTX #24421 (#28649) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../console/app/workflow_trigger.py | 35 ++-- .../console/workspace/trigger_providers.py | 163 ++++++++---------- 2 files changed, 93 insertions(+), 105 deletions(-) diff --git a/api/controllers/console/app/workflow_trigger.py b/api/controllers/console/app/workflow_trigger.py index c3ea60ae3a..597ff1f6c5 100644 --- a/api/controllers/console/app/workflow_trigger.py +++ b/api/controllers/console/app/workflow_trigger.py @@ -6,9 +6,6 @@ from sqlalchemy.orm import Session from werkzeug.exceptions import NotFound from configs import dify_config -from controllers.console import console_ns -from controllers.console.app.wraps import get_app_model -from controllers.console.wraps import account_initialization_required, edit_permission_required, setup_required 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 @@ -16,12 +13,21 @@ from models.enums import AppTriggerStatus from models.model import Account, App, AppMode from models.trigger import AppTrigger, WorkflowWebhookTrigger +from .. import console_ns +from ..app.wraps import get_app_model +from ..wraps import account_initialization_required, edit_permission_required, setup_required + logger = logging.getLogger(__name__) +parser = reqparse.RequestParser().add_argument("node_id", type=str, required=True, help="Node ID is required") + + +@console_ns.route("/apps//workflows/triggers/webhook") class WebhookTriggerApi(Resource): """Webhook Trigger API""" + @console_ns.expect(parser) @setup_required @login_required @account_initialization_required @@ -29,7 +35,6 @@ class WebhookTriggerApi(Resource): @marshal_with(webhook_trigger_fields) def get(self, app_model: App): """Get webhook trigger for a node""" - parser = reqparse.RequestParser().add_argument("node_id", type=str, required=True, help="Node ID is required") args = parser.parse_args() node_id = str(args["node_id"]) @@ -51,6 +56,7 @@ class WebhookTriggerApi(Resource): return webhook_trigger +@console_ns.route("/apps//triggers") class AppTriggersApi(Resource): """App Triggers list API""" @@ -90,7 +96,16 @@ class AppTriggersApi(Resource): return {"data": triggers} +parser_enable = ( + reqparse.RequestParser() + .add_argument("trigger_id", type=str, required=True, nullable=False, location="json") + .add_argument("enable_trigger", type=bool, required=True, nullable=False, location="json") +) + + +@console_ns.route("/apps//trigger-enable") class AppTriggerEnableApi(Resource): + @console_ns.expect(parser_enable) @setup_required @login_required @account_initialization_required @@ -99,12 +114,7 @@ class AppTriggerEnableApi(Resource): @marshal_with(trigger_fields) def post(self, app_model: App): """Update app trigger (enable/disable)""" - parser = ( - reqparse.RequestParser() - .add_argument("trigger_id", type=str, required=True, nullable=False, location="json") - .add_argument("enable_trigger", type=bool, required=True, nullable=False, location="json") - ) - args = parser.parse_args() + args = parser_enable.parse_args() assert current_user.current_tenant_id is not None @@ -137,8 +147,3 @@ class AppTriggerEnableApi(Resource): trigger.icon = "" # type: ignore return trigger - - -console_ns.add_resource(WebhookTriggerApi, "/apps//workflows/triggers/webhook") -console_ns.add_resource(AppTriggersApi, "/apps//triggers") -console_ns.add_resource(AppTriggerEnableApi, "/apps//trigger-enable") diff --git a/api/controllers/console/workspace/trigger_providers.py b/api/controllers/console/workspace/trigger_providers.py index 1bcd80c1a5..69281c6214 100644 --- a/api/controllers/console/workspace/trigger_providers.py +++ b/api/controllers/console/workspace/trigger_providers.py @@ -6,8 +6,6 @@ from sqlalchemy.orm import Session from werkzeug.exceptions import BadRequest, Forbidden from configs import dify_config -from controllers.console import console_ns -from controllers.console.wraps import account_initialization_required, is_admin_or_owner_required, setup_required from controllers.web.error import NotFoundError from core.model_runtime.utils.encoders import jsonable_encoder from core.plugin.entities.plugin_daemon import CredentialType @@ -23,9 +21,13 @@ from services.trigger.trigger_provider_service import TriggerProviderService from services.trigger.trigger_subscription_builder_service import TriggerSubscriptionBuilderService from services.trigger.trigger_subscription_operator_service import TriggerSubscriptionOperatorService +from .. import console_ns +from ..wraps import account_initialization_required, is_admin_or_owner_required, setup_required + logger = logging.getLogger(__name__) +@console_ns.route("/workspaces/current/trigger-provider//icon") class TriggerProviderIconApi(Resource): @setup_required @login_required @@ -38,6 +40,7 @@ class TriggerProviderIconApi(Resource): return TriggerManager.get_trigger_plugin_icon(tenant_id=user.current_tenant_id, provider_id=provider) +@console_ns.route("/workspaces/current/triggers") class TriggerProviderListApi(Resource): @setup_required @login_required @@ -50,6 +53,7 @@ class TriggerProviderListApi(Resource): return jsonable_encoder(TriggerProviderService.list_trigger_providers(user.current_tenant_id)) +@console_ns.route("/workspaces/current/trigger-provider//info") class TriggerProviderInfoApi(Resource): @setup_required @login_required @@ -64,6 +68,7 @@ class TriggerProviderInfoApi(Resource): ) +@console_ns.route("/workspaces/current/trigger-provider//subscriptions/list") class TriggerSubscriptionListApi(Resource): @setup_required @login_required @@ -87,7 +92,16 @@ class TriggerSubscriptionListApi(Resource): raise +parser = reqparse.RequestParser().add_argument( + "credential_type", type=str, required=False, nullable=True, location="json" +) + + +@console_ns.route( + "/workspaces/current/trigger-provider//subscriptions/builder/create", +) class TriggerSubscriptionBuilderCreateApi(Resource): + @console_ns.expect(parser) @setup_required @login_required @is_admin_or_owner_required @@ -97,9 +111,6 @@ class TriggerSubscriptionBuilderCreateApi(Resource): user = current_user assert user.current_tenant_id is not None - parser = reqparse.RequestParser().add_argument( - "credential_type", type=str, required=False, nullable=True, location="json" - ) args = parser.parse_args() try: @@ -116,6 +127,9 @@ class TriggerSubscriptionBuilderCreateApi(Resource): raise +@console_ns.route( + "/workspaces/current/trigger-provider//subscriptions/builder/", +) class TriggerSubscriptionBuilderGetApi(Resource): @setup_required @login_required @@ -127,7 +141,18 @@ class TriggerSubscriptionBuilderGetApi(Resource): ) +parser_api = ( + reqparse.RequestParser() + # The credentials of the subscription builder + .add_argument("credentials", type=dict, required=False, nullable=True, location="json") +) + + +@console_ns.route( + "/workspaces/current/trigger-provider//subscriptions/builder/verify/", +) class TriggerSubscriptionBuilderVerifyApi(Resource): + @console_ns.expect(parser_api) @setup_required @login_required @is_admin_or_owner_required @@ -136,12 +161,8 @@ class TriggerSubscriptionBuilderVerifyApi(Resource): """Verify a subscription instance for a trigger provider""" user = current_user assert user.current_tenant_id is not None - parser = ( - reqparse.RequestParser() - # The credentials of the subscription builder - .add_argument("credentials", type=dict, required=False, nullable=True, location="json") - ) - args = parser.parse_args() + + args = parser_api.parse_args() try: # Use atomic update_and_verify to prevent race conditions @@ -159,7 +180,24 @@ class TriggerSubscriptionBuilderVerifyApi(Resource): raise ValueError(str(e)) from e +parser_update_api = ( + reqparse.RequestParser() + # The name of the subscription builder + .add_argument("name", type=str, required=False, nullable=True, location="json") + # The parameters of the subscription builder + .add_argument("parameters", type=dict, required=False, nullable=True, location="json") + # The properties of the subscription builder + .add_argument("properties", type=dict, required=False, nullable=True, location="json") + # The credentials of the subscription builder + .add_argument("credentials", type=dict, required=False, nullable=True, location="json") +) + + +@console_ns.route( + "/workspaces/current/trigger-provider//subscriptions/builder/update/", +) class TriggerSubscriptionBuilderUpdateApi(Resource): + @console_ns.expect(parser_update_api) @setup_required @login_required @account_initialization_required @@ -169,18 +207,7 @@ class TriggerSubscriptionBuilderUpdateApi(Resource): assert isinstance(user, Account) assert user.current_tenant_id is not None - parser = ( - reqparse.RequestParser() - # The name of the subscription builder - .add_argument("name", type=str, required=False, nullable=True, location="json") - # The parameters of the subscription builder - .add_argument("parameters", type=dict, required=False, nullable=True, location="json") - # The properties of the subscription builder - .add_argument("properties", type=dict, required=False, nullable=True, location="json") - # The credentials of the subscription builder - .add_argument("credentials", type=dict, required=False, nullable=True, location="json") - ) - args = parser.parse_args() + args = parser_update_api.parse_args() try: return jsonable_encoder( TriggerSubscriptionBuilderService.update_trigger_subscription_builder( @@ -200,6 +227,9 @@ class TriggerSubscriptionBuilderUpdateApi(Resource): raise +@console_ns.route( + "/workspaces/current/trigger-provider//subscriptions/builder/logs/", +) class TriggerSubscriptionBuilderLogsApi(Resource): @setup_required @login_required @@ -218,7 +248,11 @@ class TriggerSubscriptionBuilderLogsApi(Resource): raise +@console_ns.route( + "/workspaces/current/trigger-provider//subscriptions/builder/build/", +) class TriggerSubscriptionBuilderBuildApi(Resource): + @console_ns.expect(parser_update_api) @setup_required @login_required @is_admin_or_owner_required @@ -227,18 +261,7 @@ class TriggerSubscriptionBuilderBuildApi(Resource): """Build a subscription instance for a trigger provider""" user = current_user assert user.current_tenant_id is not None - parser = ( - reqparse.RequestParser() - # The name of the subscription builder - .add_argument("name", type=str, required=False, nullable=True, location="json") - # The parameters of the subscription builder - .add_argument("parameters", type=dict, required=False, nullable=True, location="json") - # The properties of the subscription builder - .add_argument("properties", type=dict, required=False, nullable=True, location="json") - # The credentials of the subscription builder - .add_argument("credentials", type=dict, required=False, nullable=True, location="json") - ) - args = parser.parse_args() + args = parser_update_api.parse_args() try: # Use atomic update_and_build to prevent race conditions TriggerSubscriptionBuilderService.update_and_build_builder( @@ -258,6 +281,9 @@ class TriggerSubscriptionBuilderBuildApi(Resource): raise ValueError(str(e)) from e +@console_ns.route( + "/workspaces/current/trigger-provider//subscriptions/delete", +) class TriggerSubscriptionDeleteApi(Resource): @setup_required @login_required @@ -291,6 +317,7 @@ class TriggerSubscriptionDeleteApi(Resource): raise +@console_ns.route("/workspaces/current/trigger-provider//subscriptions/oauth/authorize") class TriggerOAuthAuthorizeApi(Resource): @setup_required @login_required @@ -374,6 +401,7 @@ class TriggerOAuthAuthorizeApi(Resource): raise +@console_ns.route("/oauth/plugin//trigger/callback") class TriggerOAuthCallbackApi(Resource): @setup_required def get(self, provider): @@ -438,6 +466,14 @@ class TriggerOAuthCallbackApi(Resource): return redirect(f"{dify_config.CONSOLE_WEB_URL}/oauth-callback") +parser_oauth_client = ( + reqparse.RequestParser() + .add_argument("client_params", type=dict, required=False, nullable=True, location="json") + .add_argument("enabled", type=bool, required=False, nullable=True, location="json") +) + + +@console_ns.route("/workspaces/current/trigger-provider//oauth/client") class TriggerOAuthClientManageApi(Resource): @setup_required @login_required @@ -484,6 +520,7 @@ class TriggerOAuthClientManageApi(Resource): logger.exception("Error getting OAuth client", exc_info=e) raise + @console_ns.expect(parser_oauth_client) @setup_required @login_required @is_admin_or_owner_required @@ -493,12 +530,7 @@ class TriggerOAuthClientManageApi(Resource): user = current_user assert user.current_tenant_id is not None - parser = ( - reqparse.RequestParser() - .add_argument("client_params", type=dict, required=False, nullable=True, location="json") - .add_argument("enabled", type=bool, required=False, nullable=True, location="json") - ) - args = parser.parse_args() + args = parser_oauth_client.parse_args() try: provider_id = TriggerProviderID(provider) @@ -536,52 +568,3 @@ class TriggerOAuthClientManageApi(Resource): except Exception as e: logger.exception("Error removing OAuth client", exc_info=e) raise - - -# Trigger Subscription -console_ns.add_resource(TriggerProviderIconApi, "/workspaces/current/trigger-provider//icon") -console_ns.add_resource(TriggerProviderListApi, "/workspaces/current/triggers") -console_ns.add_resource(TriggerProviderInfoApi, "/workspaces/current/trigger-provider//info") -console_ns.add_resource( - TriggerSubscriptionListApi, "/workspaces/current/trigger-provider//subscriptions/list" -) -console_ns.add_resource( - TriggerSubscriptionDeleteApi, - "/workspaces/current/trigger-provider//subscriptions/delete", -) - -# Trigger Subscription Builder -console_ns.add_resource( - TriggerSubscriptionBuilderCreateApi, - "/workspaces/current/trigger-provider//subscriptions/builder/create", -) -console_ns.add_resource( - TriggerSubscriptionBuilderGetApi, - "/workspaces/current/trigger-provider//subscriptions/builder/", -) -console_ns.add_resource( - TriggerSubscriptionBuilderUpdateApi, - "/workspaces/current/trigger-provider//subscriptions/builder/update/", -) -console_ns.add_resource( - TriggerSubscriptionBuilderVerifyApi, - "/workspaces/current/trigger-provider//subscriptions/builder/verify/", -) -console_ns.add_resource( - TriggerSubscriptionBuilderBuildApi, - "/workspaces/current/trigger-provider//subscriptions/builder/build/", -) -console_ns.add_resource( - TriggerSubscriptionBuilderLogsApi, - "/workspaces/current/trigger-provider//subscriptions/builder/logs/", -) - - -# OAuth -console_ns.add_resource( - TriggerOAuthAuthorizeApi, "/workspaces/current/trigger-provider//subscriptions/oauth/authorize" -) -console_ns.add_resource(TriggerOAuthCallbackApi, "/oauth/plugin//trigger/callback") -console_ns.add_resource( - TriggerOAuthClientManageApi, "/workspaces/current/trigger-provider//oauth/client" -)