From 6ab8e05a5e1dc3fdcb969d949a58c1f8d0ea122e Mon Sep 17 00:00:00 2001 From: hjlarry Date: Sat, 17 Jan 2026 14:47:44 +0800 Subject: [PATCH] fix api --- api/controllers/console/app/workflow.py | 29 +++++++++++++++----- api/controllers/console/workspace/account.py | 16 +++++++---- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/api/controllers/console/app/workflow.py b/api/controllers/console/app/workflow.py index 0e1c3426b2..037ab1007d 100644 --- a/api/controllers/console/app/workflow.py +++ b/api/controllers/console/app/workflow.py @@ -183,6 +183,14 @@ class WorkflowUpdatePayload(BaseModel): marked_comment: str | None = Field(default=None, max_length=100) +class WorkflowFeaturesPayload(BaseModel): + features: dict[str, Any] = Field(..., description="Workflow feature configuration") + + +class WorkflowOnlineUsersQuery(BaseModel): + workflow_ids: str = Field(..., description="Comma-separated workflow IDs") + + class DraftWorkflowTriggerRunPayload(BaseModel): node_id: str @@ -206,6 +214,8 @@ reg(DefaultBlockConfigQuery) reg(ConvertToWorkflowPayload) reg(WorkflowListQuery) reg(WorkflowUpdatePayload) +reg(WorkflowFeaturesPayload) +reg(WorkflowOnlineUsersQuery) reg(DraftWorkflowTriggerRunPayload) reg(DraftWorkflowTriggerRunAllPayload) @@ -817,6 +827,11 @@ class WorkflowConfigApi(Resource): class WorkflowFeaturesApi(Resource): """Update draft workflow features.""" + @console_ns.expect(console_ns.models[WorkflowFeaturesPayload.__name__]) + @console_ns.doc("update_workflow_features") + @console_ns.doc(description="Update draft workflow features") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.response(200, "Workflow features updated successfully") @setup_required @login_required @account_initialization_required @@ -824,10 +839,8 @@ class WorkflowFeaturesApi(Resource): def post(self, app_model: App): current_user, _ = current_account_with_tenant() - parser = reqparse.RequestParser().add_argument("features", type=dict, required=True, location="json") - args = parser.parse_args() - - features = args.get("features") + args = WorkflowFeaturesPayload.model_validate(console_ns.payload or {}) + features = args.features workflow_service = WorkflowService() workflow_service.update_draft_workflow_features(app_model=app_model, features=features, account=current_user) @@ -1214,15 +1227,17 @@ class DraftWorkflowTriggerRunAllApi(Resource): @console_ns.route("/apps/workflows/online-users") class WorkflowOnlineUsersApi(Resource): + @console_ns.expect(console_ns.models[WorkflowOnlineUsersQuery.__name__]) + @console_ns.doc("get_workflow_online_users") + @console_ns.doc(description="Get workflow online users") @setup_required @login_required @account_initialization_required @marshal_with(online_user_list_fields) def get(self): - parser = reqparse.RequestParser().add_argument("workflow_ids", type=str, required=True, location="args") - args = parser.parse_args() + args = WorkflowOnlineUsersQuery.model_validate(request.args.to_dict(flat=True)) # type: ignore - workflow_ids = [workflow_id.strip() for workflow_id in args["workflow_ids"].split(",")] + workflow_ids = [workflow_id.strip() for workflow_id in args.workflow_ids.split(",") if workflow_id.strip()] results = [] for workflow_id in workflow_ids: diff --git a/api/controllers/console/workspace/account.py b/api/controllers/console/workspace/account.py index 3884d10f41..857d72ee9f 100644 --- a/api/controllers/console/workspace/account.py +++ b/api/controllers/console/workspace/account.py @@ -74,6 +74,10 @@ class AccountAvatarPayload(BaseModel): avatar: str +class AccountAvatarQuery(BaseModel): + avatar: str = Field(..., description="Avatar file ID") + + class AccountInterfaceLanguagePayload(BaseModel): interface_language: str @@ -159,6 +163,7 @@ def reg(cls: type[BaseModel]): reg(AccountInitPayload) reg(AccountNamePayload) reg(AccountAvatarPayload) +reg(AccountAvatarQuery) reg(AccountInterfaceLanguagePayload) reg(AccountInterfaceThemePayload) reg(AccountTimezonePayload) @@ -249,18 +254,19 @@ class AccountNameApi(Resource): @console_ns.route("/account/avatar") class AccountAvatarApi(Resource): - @console_ns.expect(console_ns.models[AccountAvatarPayload.__name__]) + @console_ns.expect(console_ns.models[AccountAvatarQuery.__name__]) + @console_ns.doc("get_account_avatar") + @console_ns.doc(description="Get account avatar url") @setup_required @login_required @account_initialization_required def get(self): - parser = reqparse.RequestParser() - parser.add_argument("avatar", type=str, required=True, location="args") - args = parser.parse_args() + args = AccountAvatarQuery.model_validate(request.args.to_dict(flat=True)) # type: ignore - avatar_url = file_helpers.get_signed_file_url(args["avatar"]) + avatar_url = file_helpers.get_signed_file_url(args.avatar) return {"avatar_url": avatar_url} + @console_ns.expect(console_ns.models[AccountAvatarPayload.__name__]) @setup_required @login_required @account_initialization_required