From 0b3b468f28e7ec067ab2db008015c8170befdc74 Mon Sep 17 00:00:00 2001 From: -LAN- Date: Tue, 4 Mar 2025 17:12:29 +0800 Subject: [PATCH] feat: enhance workflow publishing with marked name and comment support Signed-off-by: -LAN- --- api/controllers/console/app/workflow.py | 28 ++++++++++++++++-- api/models/workflow.py | 31 +++++++++++++------- api/services/workflow_service.py | 38 ++++++++++++------------- 3 files changed, 64 insertions(+), 33 deletions(-) diff --git a/api/controllers/console/app/workflow.py b/api/controllers/console/app/workflow.py index 2474fd4d06..b64aca4c7d 100644 --- a/api/controllers/console/app/workflow.py +++ b/api/controllers/console/app/workflow.py @@ -368,10 +368,32 @@ class PublishedWorkflowApi(Resource): if not isinstance(current_user, Account): raise Forbidden() - workflow_service = WorkflowService() - workflow = workflow_service.publish_workflow(app_model=app_model, account=current_user) + parser = reqparse.RequestParser() + parser.add_argument("marked_name", type=str, required=False, default="", location="json") + parser.add_argument("marked_comment", type=str, required=False, default="", location="json") + args = parser.parse_args() - return {"result": "success", "created_at": TimestampField().format(workflow.created_at)} + workflow_service = WorkflowService() + with Session(db.engine) as session: + workflow = workflow_service.publish_workflow( + session=session, + app_model=app_model, + account=current_user, + marked_name=args.marked_name or "", + marked_comment=args.marked_comment or "", + ) + + app_model.workflow_id = workflow.id + db.session.commit() + + workflow_created_at = TimestampField().format(workflow.created_at) + + session.commit() + + return { + "result": "success", + "created_at": workflow_created_at, + } class DefaultBlockConfigsApi(Resource): diff --git a/api/models/workflow.py b/api/models/workflow.py index 52e8553f69..434e916945 100644 --- a/api/models/workflow.py +++ b/api/models/workflow.py @@ -3,6 +3,7 @@ from collections.abc import Mapping, Sequence from datetime import UTC, datetime from enum import Enum from typing import TYPE_CHECKING, Any, Optional, Union +from uuid import uuid4 if TYPE_CHECKING: from models.model import AppMode @@ -129,8 +130,9 @@ class Workflow(Base): "conversation_variables", db.Text, nullable=False, server_default="{}" ) - def __init__( - self, + @classmethod + def new( + cls, *, tenant_id: str, app_id: str, @@ -141,16 +143,23 @@ class Workflow(Base): created_by: str, environment_variables: Sequence[Variable], conversation_variables: Sequence[Variable], + marked_name: str = "", + marked_comment: str = "", ): - self.tenant_id = tenant_id - self.app_id = app_id - self.type = type - self.version = version - self.graph = graph - self.features = features - self.created_by = created_by - self.environment_variables = environment_variables or [] - self.conversation_variables = conversation_variables or [] + workflow = Workflow() + workflow.id = str(uuid4()) + workflow.tenant_id = tenant_id + workflow.app_id = app_id + workflow.type = type + workflow.version = version + workflow.graph = graph + workflow.features = features + workflow.created_by = created_by + workflow.environment_variables = environment_variables or [] + workflow.conversation_variables = conversation_variables or [] + workflow.marked_name = marked_name + workflow.marked_comment = marked_comment + return workflow @property def created_by_account(self): diff --git a/api/services/workflow_service.py b/api/services/workflow_service.py index fb7872f02b..f98c1674ea 100644 --- a/api/services/workflow_service.py +++ b/api/services/workflow_service.py @@ -175,23 +175,26 @@ class WorkflowService: # return draft workflow return workflow - def publish_workflow(self, app_model: App, account: Account, draft_workflow: Optional[Workflow] = None) -> Workflow: - """ - Publish workflow from draft - - :param app_model: App instance - :param account: Account instance - :param draft_workflow: Workflow instance - """ - if not draft_workflow: - # fetch draft workflow by app_model - draft_workflow = self.get_draft_workflow(app_model=app_model) - + def publish_workflow( + self, + *, + session: Session, + app_model: App, + account: Account, + marked_name: str = "", + marked_comment: str = "", + ) -> Workflow: + draft_workflow_stmt = select(Workflow).where( + Workflow.tenant_id == app_model.tenant_id, + Workflow.app_id == app_model.id, + Workflow.version == "draft", + ) + draft_workflow = session.scalar(draft_workflow_stmt) if not draft_workflow: raise ValueError("No valid workflow found.") # create new workflow - workflow = Workflow( + workflow = Workflow.new( tenant_id=app_model.tenant_id, app_id=app_model.id, type=draft_workflow.type, @@ -201,15 +204,12 @@ class WorkflowService: created_by=account.id, environment_variables=draft_workflow.environment_variables, conversation_variables=draft_workflow.conversation_variables, + marked_name=marked_name, + marked_comment=marked_comment, ) # commit db session changes - db.session.add(workflow) - db.session.flush() - db.session.commit() - - app_model.workflow_id = workflow.id - db.session.commit() + session.add(workflow) # trigger app workflow events app_published_workflow_was_updated.send(app_model, published_workflow=workflow)