From cf7320be8d79d64f86f5c18858109df9700f74fc Mon Sep 17 00:00:00 2001 From: FFXN Date: Fri, 17 Apr 2026 15:07:54 +0800 Subject: [PATCH] query snippet published history --- api/controllers/console/snippets/payloads.py | 7 ++++ .../console/snippets/snippet_workflow.py | 40 ++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/api/controllers/console/snippets/payloads.py b/api/controllers/console/snippets/payloads.py index 980506ccc4..0052acdbcc 100644 --- a/api/controllers/console/snippets/payloads.py +++ b/api/controllers/console/snippets/payloads.py @@ -78,6 +78,13 @@ class SnippetDraftSyncPayload(BaseModel): input_fields: list[dict[str, Any]] | None = None +class SnippetWorkflowListQuery(BaseModel): + """Query parameters for listing snippet published workflows.""" + + page: int = Field(default=1, ge=1, le=99999) + limit: int = Field(default=10, ge=1, le=100) + + class WorkflowRunQuery(BaseModel): """Query parameters for workflow runs.""" diff --git a/api/controllers/console/snippets/snippet_workflow.py b/api/controllers/console/snippets/snippet_workflow.py index 661a207658..d86c60ead5 100644 --- a/api/controllers/console/snippets/snippet_workflow.py +++ b/api/controllers/console/snippets/snippet_workflow.py @@ -4,14 +4,14 @@ from functools import wraps from typing import ParamSpec, TypeVar from flask import request -from flask_restx import Resource, fields, marshal_with +from flask_restx import Resource, fields, marshal, marshal_with from sqlalchemy.orm import Session from werkzeug.exceptions import InternalServerError, NotFound from controllers.common.schema import register_schema_models from controllers.console import console_ns from controllers.console.app.error import DraftWorkflowNotExist, DraftWorkflowNotSync -from controllers.console.app.workflow import workflow_model +from controllers.console.app.workflow import workflow_model, workflow_pagination_model from controllers.console.app.workflow_run import ( workflow_run_detail_model, workflow_run_node_execution_list_model, @@ -25,6 +25,7 @@ from controllers.console.snippets.payloads import ( SnippetDraftSyncPayload, SnippetIterationNodeRunPayload, SnippetLoopNodeRunPayload, + SnippetWorkflowListQuery, WorkflowRunQuery, ) from controllers.console.wraps import ( @@ -58,6 +59,7 @@ register_schema_models( SnippetDraftRunPayload, SnippetIterationNodeRunPayload, SnippetLoopNodeRunPayload, + SnippetWorkflowListQuery, WorkflowRunQuery, PublishWorkflowPayload, ) @@ -250,6 +252,40 @@ class SnippetDefaultBlockConfigsApi(Resource): return snippet_service.get_default_block_configs() +@console_ns.route("/snippets//workflows") +class SnippetPublishedAllWorkflowApi(Resource): + @console_ns.expect(console_ns.models[SnippetWorkflowListQuery.__name__]) + @console_ns.doc("get_all_snippet_published_workflows") + @console_ns.doc(description="Get all published workflows for a snippet") + @console_ns.doc(params={"snippet_id": "Snippet ID"}) + @console_ns.response(200, "Published workflows retrieved successfully", workflow_pagination_model) + @setup_required + @login_required + @account_initialization_required + @get_snippet + @edit_permission_required + def get(self, snippet: CustomizedSnippet): + """Get all published workflow versions for snippet.""" + args = SnippetWorkflowListQuery.model_validate(request.args.to_dict(flat=True)) + + snippet_service = SnippetService() + with Session(db.engine) as session: + workflows, has_more = snippet_service.get_all_published_workflows( + session=session, + snippet=snippet, + page=args.page, + limit=args.limit, + ) + serialized_workflows = marshal(workflows, workflow_model) + + return { + "items": serialized_workflows, + "page": args.page, + "limit": args.limit, + "has_more": has_more, + } + + @console_ns.route("/snippets//workflow-runs") class SnippetWorkflowRunsApi(Resource): @console_ns.doc("list_snippet_workflow_runs")