This is an automated email from the ASF dual-hosted git repository.

mikexue pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-eventmesh.git


The following commit(s) were added to refs/heads/master by this push:
     new 77cfdedb5 add workflow controller module
     new ce3201991 Merge pull request #2874 from 
walterlife/feature/workflow-controller
77cfdedb5 is described below

commit 77cfdedb563111582ee9536afb5dcf3a9d2b5958
Author: walterlife <[email protected]>
AuthorDate: Tue Jan 10 09:28:54 2023 +0800

    add workflow controller module
---
 eventmesh-workflow-go/cmd/controller/main.go       | 125 ++++++++++++
 eventmesh-workflow-go/cmd/controller/request.go    |  38 ++++
 eventmesh-workflow-go/cmd/controller/response.go   |  35 ++++
 eventmesh-workflow-go/cmd/controller/workflow.go   | 177 +++++++++++++++++
 .../{server.go => cmd/engine/main.go}              |  37 +++-
 eventmesh-workflow-go/cmd/main.go                  |  91 ---------
 eventmesh-workflow-go/config/config.go             |   4 +-
 .../{cmd/build.sh => configs/controller.yaml}      |  22 ++-
 .../configs/{workflow.yaml => engine.yaml}         |   0
 .../distribution/mysql-schema.sql                  |  18 +-
 eventmesh-workflow-go/go.mod                       |  19 +-
 eventmesh-workflow-go/go.sum                       | 146 +++++++++++++-
 .../internal/constants/constants.go                |   7 +-
 .../internal/dal/model/workflow.go                 |  28 ++-
 .../internal/dal/model/workflow_task.go            |   2 +-
 eventmesh-workflow-go/internal/dal/workflow.go     | 219 +++++++++++++++++----
 eventmesh-workflow-go/main.go                      |  41 ----
 17 files changed, 798 insertions(+), 211 deletions(-)

diff --git a/eventmesh-workflow-go/cmd/controller/main.go 
b/eventmesh-workflow-go/cmd/controller/main.go
new file mode 100644
index 000000000..cd7bbe0f9
--- /dev/null
+++ b/eventmesh-workflow-go/cmd/controller/main.go
@@ -0,0 +1,125 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package main
+
+import (
+       "fmt"
+       "github.com/apache/incubator-eventmesh/eventmesh-server-go/config"
+       _ 
"github.com/apache/incubator-eventmesh/eventmesh-workflow-go/cmd/controller/docs"
+       pconfig 
"github.com/apache/incubator-eventmesh/eventmesh-workflow-go/config"
+       
"github.com/apache/incubator-eventmesh/eventmesh-workflow-go/internal/dal"
+       
"github.com/apache/incubator-eventmesh/eventmesh-workflow-go/internal/util"
+       "github.com/gin-gonic/gin"
+       swaggerFiles "github.com/swaggo/files"
+       ginSwagger "github.com/swaggo/gin-swagger"
+       "log"
+       "net/http"
+)
+
+type Server struct {
+       server   *gin.Engine
+       workflow *WorkflowController
+}
+
+// @title           Workflow API
+// @version         1.0
+// @description     This is a workflow server.
+
+// @license.name  Apache 2.0
+// @license.url   http://www.apache.org/licenses/LICENSE-2.0.html
+func main() {
+       s, err := initServer()
+       if err != nil {
+               log.Fatal("flow new server fail: " + err.Error())
+       }
+       s.router()
+       if err := s.run(); err != nil {
+               log.Fatal("run server fail: " + err.Error())
+       }
+}
+
+func initServer() (*Server, error) {
+       var s Server
+       if err := s.setupConfig(); err != nil {
+               return nil, err
+       }
+       if err := dal.Open(); err != nil {
+               return nil, err
+       }
+       r := gin.New()
+       r.Use(cors()).Use(gin.Recovery())
+       swagger(r)
+       s.server = r
+       s.workflow = NewWorkflowController()
+       return &s, nil
+}
+
+func swagger(r *gin.Engine) {
+       r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
+}
+
+func cors() gin.HandlerFunc {
+       return func(c *gin.Context) {
+               method := c.Request.Method
+               origin := c.Request.Header.Get("Origin")
+               if origin != "" {
+                       c.Header("Access-Control-Allow-Origin", "*")
+                       c.Header("Access-Control-Allow-Methods", "POST, GET, 
OPTIONS, PUT, DELETE, UPDATE")
+                       c.Header("Access-Control-Allow-Headers", "Origin, 
X-Requested-With, Content-Type, Accept, "+
+                               "Authorization")
+                       c.Header("Access-Control-Expose-Headers", 
"Content-Length, Access-Control-Allow-Origin, "+
+                               "Access-Control-Allow-Headers, Cache-Control, 
Content-Language, Content-Type")
+                       c.Header("Access-Control-Allow-Credentials", "true")
+               }
+               if method == "OPTIONS" {
+                       c.AbortWithStatus(http.StatusNoContent)
+               }
+               c.Next()
+       }
+}
+
+func (s *Server) router() {
+       s.server.POST("/workflow", s.workflow.Save)
+       s.server.GET("/workflow", s.workflow.QueryList)
+       s.server.GET("/workflow/:workflowId", s.workflow.QueryDetail)
+       s.server.DELETE("/workflow/:workflowId", s.workflow.Delete)
+       s.server.GET("/workflow/instances", s.workflow.QueryInstances)
+}
+
+func (s *Server) setupConfig() error {
+       config.ServerConfigPath = "./configs/controller.yaml"
+       // compatible local environment
+       if !util.Exists(config.ServerConfigPath) {
+               config.ServerConfigPath = "../configs/controller.yaml"
+       }
+       // compatible deploy environment
+       if !util.Exists(config.ServerConfigPath) {
+               config.ServerConfigPath = "../conf/controller.yaml"
+       }
+       cfg, err := config.LoadConfig(config.ServerConfigPath)
+       if err != nil {
+               return err
+       }
+       config.SetGlobalConfig(cfg)
+       if err := config.Setup(cfg); err != nil {
+               return err
+       }
+       return pconfig.Setup(config.ServerConfigPath)
+}
+
+func (s *Server) run() error {
+       return s.server.Run(fmt.Sprintf(":%d", 
config.GlobalConfig().Server.Port))
+}
diff --git a/eventmesh-workflow-go/cmd/controller/request.go 
b/eventmesh-workflow-go/cmd/controller/request.go
new file mode 100644
index 000000000..6b062038a
--- /dev/null
+++ b/eventmesh-workflow-go/cmd/controller/request.go
@@ -0,0 +1,38 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package main
+
+import 
"github.com/apache/incubator-eventmesh/eventmesh-workflow-go/internal/dal/model"
+
+// SaveWorkflowRequest save workflow request body
+type SaveWorkflowRequest struct {
+       Workflow model.Workflow `json:"workflow"`
+}
+
+// QueryWorkflowsRequest query workflow list request body
+type QueryWorkflowsRequest struct {
+       WorkflowID string `form:"workflow_id" json:"workflow_id"`
+       Status     int    `form:"status" json:"status"`
+       Page       int    `form:"page" json:"page"` // page num
+       Size       int    `form:"size" json:"size"` // page size
+}
+
+// QueryWorkflowInstancesRequest query workflow instances request body
+type QueryWorkflowInstancesRequest struct {
+       WorkflowID string `form:"workflow_id" json:"workflow_id"`
+       Page       int    `form:"page" json:"page"` // page num
+       Size       int    `form:"size" json:"size"` // page size
+}
diff --git a/eventmesh-workflow-go/cmd/controller/response.go 
b/eventmesh-workflow-go/cmd/controller/response.go
new file mode 100644
index 000000000..4ae5c0f54
--- /dev/null
+++ b/eventmesh-workflow-go/cmd/controller/response.go
@@ -0,0 +1,35 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package main
+
+import 
"github.com/apache/incubator-eventmesh/eventmesh-workflow-go/internal/dal/model"
+
+// QueryWorkflowsResponse query workflow list response data
+type QueryWorkflowsResponse struct {
+       Workflows []model.Workflow `json:"workflows"`
+       Total     int              `json:"total"` // total count
+}
+
+// QueryWorkflowResponse query workflow detail response data
+type QueryWorkflowResponse struct {
+       Workflow model.Workflow
+}
+
+// QueryWorkflowInstancesResponse query workflow instances response data
+type QueryWorkflowInstancesResponse struct {
+       WorkflowInstances []model.WorkflowInstance `json:"workflow_instances"`
+       Total             int                      `json:"total"` // total count
+}
diff --git a/eventmesh-workflow-go/cmd/controller/workflow.go 
b/eventmesh-workflow-go/cmd/controller/workflow.go
new file mode 100644
index 000000000..91b12037c
--- /dev/null
+++ b/eventmesh-workflow-go/cmd/controller/workflow.go
@@ -0,0 +1,177 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package main
+
+import (
+       
"github.com/apache/incubator-eventmesh/eventmesh-workflow-go/internal/dal"
+       
"github.com/apache/incubator-eventmesh/eventmesh-workflow-go/internal/dal/model"
+       "github.com/gin-gonic/gin"
+       "net/http"
+)
+
+const (
+       workflowIDParam = "workflowId"
+)
+
+// WorkflowController workflow controller operations
+type WorkflowController struct {
+       workflowDAL dal.WorkflowDAL
+}
+
+func NewWorkflowController() *WorkflowController {
+       c := WorkflowController{}
+       c.workflowDAL = dal.NewWorkflowDAL()
+       return &c
+}
+
+// Save save a workflow
+// @Summary     save a workflow
+// @Description  save a workflow
+// @Tags         workflow
+// @Accept       json
+// @Produce      json
+// @Param               request body SaveWorkflowRequest true "workflow data"
+// @Success      200
+// @Failure      400
+// @Failure      404
+// @Failure      500
+// @Router       /workflow [post]
+func (c *WorkflowController) Save(ctx *gin.Context) {
+       request := SaveWorkflowRequest{}
+       if err := ctx.ShouldBind(&request); err != nil {
+               ctx.JSON(http.StatusBadRequest, err.Error())
+               return
+       }
+       if err := c.workflowDAL.Save(ctx, &request.Workflow); err != nil {
+               ctx.JSON(http.StatusInternalServerError, err.Error())
+               return
+       }
+       ctx.JSON(http.StatusOK, nil)
+}
+
+// QueryList query workflow list
+// @Summary     query workflow list
+// @Description  query workflow list
+// @Tags         workflow
+// @Accept       json
+// @Produce      json
+// @Param               workflow_id query string false "workflow id"
+// @Param               status query string false "workflow status"
+// @Param        page query string false "query page"
+// @Param        size query string false "query size"
+// @Success      200  {object} QueryWorkflowsResponse
+// @Failure      400
+// @Failure      404
+// @Failure      500
+// @Router       /workflow [get]
+func (c *WorkflowController) QueryList(ctx *gin.Context) {
+       request := QueryWorkflowsRequest{}
+       if err := ctx.ShouldBind(&request); err != nil {
+               ctx.JSON(http.StatusBadRequest, err.Error())
+               return
+       }
+       res, total, err := c.workflowDAL.SelectList(ctx, &model.QueryParam{
+               WorkflowID: request.WorkflowID,
+               Status:     request.Status,
+               Page:       request.Page,
+               Size:       request.Size,
+       })
+       if err != nil {
+               ctx.JSON(http.StatusInternalServerError, err.Error())
+               return
+       }
+       ctx.JSON(http.StatusOK, &QueryWorkflowsResponse{Total: total, 
Workflows: res})
+}
+
+// QueryDetail query workflow detail info
+// @Summary     query workflow detail info
+// @Description  query workflow detail info
+// @Tags         workflow
+// @Accept       json
+// @Produce      json
+// @Param               workflowId path string true "workflow id"
+// @Success      200  {object} QueryWorkflowResponse
+// @Failure      400
+// @Failure      404
+// @Failure      500
+// @Router       /workflow/{workflowId} [get]
+func (c *WorkflowController) QueryDetail(ctx *gin.Context) {
+       workflowID := ctx.Param(workflowIDParam)
+       res, err := c.workflowDAL.Select(ctx, workflowID)
+       if err != nil {
+               ctx.JSON(http.StatusInternalServerError, err.Error())
+               return
+       }
+       if res == nil {
+               ctx.JSON(http.StatusOK, nil)
+               return
+       }
+       ctx.JSON(http.StatusOK, &QueryWorkflowResponse{Workflow: *res})
+       return
+}
+
+// Delete delete a workflow
+// @Summary    delete a workflow
+// @Description  delete a workflow
+// @Tags         workflow
+// @Accept       json
+// @Produce      json
+// @Param               workflowId path string true "workflow id"
+// @Success      200  {object} QueryWorkflowsResponse
+// @Failure      400
+// @Failure      404
+// @Failure      500
+// @Router       /workflow/{workflowId} [delete]
+func (c *WorkflowController) Delete(ctx *gin.Context) {
+       workflowID := ctx.Param(workflowIDParam)
+       if err := c.workflowDAL.Delete(ctx, workflowID); err != nil {
+               ctx.JSON(http.StatusInternalServerError, err.Error())
+               return
+       }
+       ctx.JSON(http.StatusOK, nil)
+}
+
+// QueryInstances query workflow instances
+// @Summary    query workflow instances
+// @Description  query workflow instances
+// @Tags         workflow
+// @Accept       json
+// @Produce      json
+// @Param               workflow_id query string false "workflow id"
+// @Param        page query string false "query page"
+// @Param        size query string false "query size"
+// @Success      200  {object} QueryWorkflowInstancesResponse
+// @Failure      400
+// @Failure      404
+// @Failure      500
+// @Router       /workflow/instances [get]
+func (c *WorkflowController) QueryInstances(ctx *gin.Context) {
+       request := QueryWorkflowInstancesRequest{}
+       if err := ctx.ShouldBind(&request); err != nil {
+               ctx.JSON(http.StatusBadRequest, err.Error())
+               return
+       }
+       res, total, err := c.workflowDAL.SelectInstances(ctx, &model.QueryParam{
+               WorkflowID: request.WorkflowID,
+               Page:       request.Page,
+               Size:       request.Size,
+       })
+       if err != nil {
+               ctx.JSON(http.StatusInternalServerError, err.Error())
+               return
+       }
+       ctx.JSON(http.StatusOK, &QueryWorkflowInstancesResponse{Total: total, 
WorkflowInstances: res})
+}
diff --git a/eventmesh-workflow-go/server.go 
b/eventmesh-workflow-go/cmd/engine/main.go
similarity index 74%
rename from eventmesh-workflow-go/server.go
rename to eventmesh-workflow-go/cmd/engine/main.go
index 749f1f67f..3d2e1060d 100644
--- a/eventmesh-workflow-go/server.go
+++ b/eventmesh-workflow-go/cmd/engine/main.go
@@ -22,10 +22,16 @@ import (
        "github.com/apache/incubator-eventmesh/eventmesh-server-go/log"
        
"github.com/apache/incubator-eventmesh/eventmesh-server-go/pkg/naming/registry"
        "github.com/apache/incubator-eventmesh/eventmesh-server-go/plugin"
+       _ 
"github.com/apache/incubator-eventmesh/eventmesh-server-go/plugin/database/mysql"
+       _ 
"github.com/apache/incubator-eventmesh/eventmesh-server-go/plugin/naming/nacos/registry"
+       _ 
"github.com/apache/incubator-eventmesh/eventmesh-server-go/plugin/naming/nacos/selector"
+       "github.com/apache/incubator-eventmesh/eventmesh-workflow-go/api"
+       "github.com/apache/incubator-eventmesh/eventmesh-workflow-go/api/proto"
        pconfig 
"github.com/apache/incubator-eventmesh/eventmesh-workflow-go/config"
        
"github.com/apache/incubator-eventmesh/eventmesh-workflow-go/internal/constants"
        
"github.com/apache/incubator-eventmesh/eventmesh-workflow-go/internal/dal"
        
"github.com/apache/incubator-eventmesh/eventmesh-workflow-go/internal/queue"
+       _ 
"github.com/apache/incubator-eventmesh/eventmesh-workflow-go/internal/queue"
        
"github.com/apache/incubator-eventmesh/eventmesh-workflow-go/internal/schedule"
        
"github.com/apache/incubator-eventmesh/eventmesh-workflow-go/internal/util"
        "google.golang.org/grpc"
@@ -33,17 +39,32 @@ import (
 )
 
 type Server struct {
-       Server   *grpc.Server
+       server   *grpc.Server
        schedule schedule.Scheduler
        queue    queue.ObserveQueue
 }
 
-func NewServer() (*Server, error) {
+func main() {
+       s, err := initServer()
+       if err != nil {
+               log.Fatal("flow new server fail: " + err.Error())
+       }
+       router(s)
+       if err = s.run(); err != nil {
+               log.Fatal("run server fail: " + err.Error())
+       }
+}
+
+func router(s *Server) {
+       proto.RegisterWorkflowServer(s.server, api.NewWorkflowService())
+}
+
+func initServer() (*Server, error) {
        plugin.Register(constants.LogSchedule, log.DefaultLogFactory)
        plugin.Register(constants.LogQueue, log.DefaultLogFactory)
 
        var s Server
-       if err := s.SetupConfig(); err != nil {
+       if err := s.setupConfig(); err != nil {
                return nil, err
        }
        reg := registry.Get(config.GlobalConfig().Server.Name)
@@ -63,11 +84,11 @@ func NewServer() (*Server, error) {
        }
        s.queue = queue.GetQueue(config.GlobalConfig().Flow.Queue.Store)
 
-       s.Server = grpc.NewServer()
+       s.server = grpc.NewServer()
        return &s, nil
 }
 
-func (s *Server) Run() error {
+func (s *Server) run() error {
        s.queue.Observe()
        s.schedule.Run()
 
@@ -75,14 +96,16 @@ func (s *Server) Run() error {
        if err != nil {
                return err
        }
-       return s.Server.Serve(l)
+       return s.server.Serve(l)
 }
 
-func (s *Server) SetupConfig() error {
+func (s *Server) setupConfig() error {
        config.ServerConfigPath = "./configs/workflow.yaml"
+       // compatible local environment
        if !util.Exists(config.ServerConfigPath) {
                config.ServerConfigPath = "../configs/workflow.yaml"
        }
+       // compatible deploy environment
        if !util.Exists(config.ServerConfigPath) {
                config.ServerConfigPath = "../conf/workflow.yaml"
        }
diff --git a/eventmesh-workflow-go/cmd/main.go 
b/eventmesh-workflow-go/cmd/main.go
deleted file mode 100644
index 2a6bfd117..000000000
--- a/eventmesh-workflow-go/cmd/main.go
+++ /dev/null
@@ -1,91 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package main
-
-import (
-       "context"
-       
"github.com/apache/incubator-eventmesh/eventmesh-server-go/plugin/database/mysql"
-       
"github.com/apache/incubator-eventmesh/eventmesh-workflow-go/internal/dal"
-       
"github.com/apache/incubator-eventmesh/eventmesh-workflow-go/internal/dal/model"
-       "github.com/spf13/cobra"
-       "io/ioutil"
-       "log"
-       "os"
-)
-
-var (
-       rootCmd = &cobra.Command{
-               Use:               "workflow",
-               Short:             "CLI for workflow",
-               Long:              `CLI for eventmesh workflow`,
-               PersistentPreRunE: cmdPreRunE,
-       }
-
-       createCmd = &cobra.Command{
-               Use:   "create",
-               Short: "create workflow",
-               Long:  "create workflow with serverless workflow yaml file",
-               RunE:  createWorkflow,
-       }
-       workflowFileName string
-       workflowDSN      string
-)
-
-func init() {
-       rootCmd.AddCommand(createCmd)
-       rootCmd.SetOut(os.Stdout)
-       rootCmd.SetErr(os.Stderr)
-
-       createCmd.Flags().StringVarP(&workflowFileName, "file", "",
-               "", "workflow file name")
-       createCmd.Flags().StringVarP(&workflowDSN, "dsn", "",
-               "", "workflow store mysql dsn")
-}
-
-func main() {
-       if err := rootCmd.Execute(); err != nil {
-               log.Fatalf("cmd execute error: %v", err)
-       }
-}
-
-func cmdPreRunE(cmd *cobra.Command, args []string) error {
-       setupConfig()
-       if err := dal.Open(); err != nil {
-               return err
-       }
-       return nil
-}
-
-func setupConfig() {
-       //plugin.Register(constants.LogSchedule, log.DefaultLogFactory)
-       //plugin.Register(constants.LogQueue, log.DefaultLogFactory)
-       mysql.PluginConfig.DSN = workflowDSN
-}
-
-func createWorkflow(cmd *cobra.Command, args []string) error {
-       cmd.Println("----begin create workflow----")
-       buf, err := ioutil.ReadFile(workflowFileName)
-       if err != nil {
-               return err
-       }
-       var wf = model.Workflow{}
-       wf.Definition = string(buf)
-       if err = dal.NewWorkflowDAL().Insert(context.Background(), &wf); err != 
nil {
-               return err
-       }
-       cmd.Println("----finish----")
-       return nil
-}
diff --git a/eventmesh-workflow-go/config/config.go 
b/eventmesh-workflow-go/config/config.go
index f5fea7a3c..3aba45b75 100644
--- a/eventmesh-workflow-go/config/config.go
+++ b/eventmesh-workflow-go/config/config.go
@@ -17,7 +17,7 @@ package config
 
 import (
        "gopkg.in/yaml.v3"
-       "io/ioutil"
+       "os"
 )
 
 var (
@@ -75,7 +75,7 @@ func Get() *Config {
 }
 
 func parseConfigFromFile(configPath string) (*Config, error) {
-       buf, err := ioutil.ReadFile(configPath)
+       buf, err := os.ReadFile(configPath)
        if err != nil {
                return nil, err
        }
diff --git a/eventmesh-workflow-go/cmd/build.sh 
b/eventmesh-workflow-go/configs/controller.yaml
similarity index 64%
rename from eventmesh-workflow-go/cmd/build.sh
rename to eventmesh-workflow-go/configs/controller.yaml
index a597850d2..02fb5e4a4 100644
--- a/eventmesh-workflow-go/cmd/build.sh
+++ b/eventmesh-workflow-go/configs/controller.yaml
@@ -14,6 +14,22 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-go build -o workflow-cli
-
-# eg ./workflow-cli create --file ../configs/testcreateworkflow.yaml --dsn 
"root:123456@(127.0.0.1:3306)/db_workflow?charset=utf8&parseTime=True&loc=Local"
\ No newline at end of file
+server:
+  port: 11022
+plugins:
+  database:
+    mysql:
+      dsn: 
"root:123456@(127.0.0.1:3306)/db_workflow?charset=utf8&parseTime=True&loc=Local"
+      max_idle: 50
+      max_open: 100
+      max_lifetime: 180000
+  log:
+    default:
+      - writer: file
+        level: info
+        writer_config:
+          filename: ./workflow.log
+          max_size: 10
+          max_backups: 10
+          max_age: 7
+          compress:  false
\ No newline at end of file
diff --git a/eventmesh-workflow-go/configs/workflow.yaml 
b/eventmesh-workflow-go/configs/engine.yaml
similarity index 100%
rename from eventmesh-workflow-go/configs/workflow.yaml
rename to eventmesh-workflow-go/configs/engine.yaml
diff --git a/eventmesh-workflow-go/distribution/mysql-schema.sql 
b/eventmesh-workflow-go/distribution/mysql-schema.sql
index 621af74d1..0eb4345a1 100644
--- a/eventmesh-workflow-go/distribution/mysql-schema.sql
+++ b/eventmesh-workflow-go/distribution/mysql-schema.sql
@@ -29,7 +29,7 @@ create table if not exists t_workflow
     version       varchar(64)                        not null,
     create_time   datetime default CURRENT_TIMESTAMP not null,
     update_time   datetime default CURRENT_TIMESTAMP not null,
-    unique (workflow_id)
+    index `index_workflow_id` (workflow_id)
     ) collate = utf8mb3_bin;
 
 create table if not exists t_workflow_instance
@@ -40,7 +40,8 @@ create table if not exists t_workflow_instance
     workflow_instance_id varchar(1024)                      not null,
     workflow_status      int                                not null,
     create_time          datetime default CURRENT_TIMESTAMP not null,
-    update_time          datetime default CURRENT_TIMESTAMP not null
+    update_time          datetime default CURRENT_TIMESTAMP not null,
+    index `index_workflow_id` (workflow_id)
     )
     collate = utf8mb3_bin;
 
@@ -55,7 +56,8 @@ create table if not exists t_workflow_task
     task_input_filter varchar(1024)                      not null default '',
     status            int                                not null,
     create_time datetime default CURRENT_TIMESTAMP not null,
-    update_time datetime default CURRENT_TIMESTAMP not null
+    update_time datetime default CURRENT_TIMESTAMP not null,
+    index `index_workflow_id` (workflow_id)
     )
     collate = utf8mb3_bin;
 
@@ -69,7 +71,8 @@ create table if not exists t_workflow_task_action
     operation_type varchar(1024)                      not null,
     status         int                                not null,
     create_time    datetime default CURRENT_TIMESTAMP not null,
-    update_time    datetime default CURRENT_TIMESTAMP not null
+    update_time    datetime default CURRENT_TIMESTAMP not null,
+    index `index_workflow_id` (workflow_id)
     )
     collate = utf8mb3_bin;
 
@@ -85,7 +88,8 @@ create table if not exists t_workflow_task_instance
     input                text                               not null,
     retry_times          int                                not null,
     create_time          datetime default CURRENT_TIMESTAMP not null,
-    update_time          datetime default CURRENT_TIMESTAMP not null
+    update_time          datetime default CURRENT_TIMESTAMP not null,
+    index `index_workflow_id` (workflow_id)
     )
     collate = utf8mb3_bin;
 
@@ -99,7 +103,9 @@ create table if not exists t_workflow_task_relation
     `condition`  varchar(2048)                      not null,
     status       int                                not null,
     create_time  datetime default CURRENT_TIMESTAMP not null,
-    update_time  datetime default CURRENT_TIMESTAMP not null
+    update_time  datetime default CURRENT_TIMESTAMP not null,
+    index `index_from_task_id` (from_task_id)
+    index `index_workflow_id` (workflow_id)
     )
     collate = utf8mb3_bin;
 
diff --git a/eventmesh-workflow-go/go.mod b/eventmesh-workflow-go/go.mod
index 32c0b8e49..57a992f0b 100644
--- a/eventmesh-workflow-go/go.mod
+++ b/eventmesh-workflow-go/go.mod
@@ -23,15 +23,28 @@ require (
        github.com/apache/incubator-eventmesh/eventmesh-server-go 
v0.0.0-20220812021948-0945ab92daea
        github.com/avast/retry-go/v4 v4.0.1
        github.com/fsnotify/fsnotify v1.5.4 // indirect
+       github.com/gin-gonic/gin v1.8.2
+       github.com/go-openapi/jsonreference v0.20.1 // indirect
+       github.com/go-openapi/spec v0.20.7 // indirect
+       github.com/go-openapi/swag v0.22.3 // indirect
+       github.com/goccy/go-json v0.10.0 // indirect
        github.com/gogf/gf v1.16.9
        github.com/google/uuid v1.3.0
        github.com/itchyny/gojq v0.12.8
+       github.com/mattn/go-isatty v0.0.17 // indirect
+       github.com/prometheus/client_golang v1.12.2
        github.com/reactivex/rxgo/v2 v2.5.0
        github.com/serverlessworkflow/sdk-go/v2 v2.1.1
-       github.com/spf13/cobra v1.5.0
-       github.com/stretchr/testify v1.8.0
+       github.com/stretchr/testify v1.8.1
+       github.com/swaggo/files v1.0.0
+       github.com/swaggo/gin-swagger v1.5.3
+       github.com/swaggo/swag v1.8.9 // indirect
+       github.com/ugorji/go/codec v1.2.8 // indirect
+       github.com/urfave/cli/v2 v2.23.7 // indirect
+       golang.org/x/crypto v0.4.0 // indirect
+       golang.org/x/tools v0.5.0 // indirect
        google.golang.org/grpc v1.48.0
-       google.golang.org/protobuf v1.28.0
+       google.golang.org/protobuf v1.28.1
        gopkg.in/yaml.v3 v3.0.1
        gorm.io/driver/mysql v1.3.5
        gorm.io/gorm v1.23.8
diff --git a/eventmesh-workflow-go/go.sum b/eventmesh-workflow-go/go.sum
index 2add178de..e125195c3 100644
--- a/eventmesh-workflow-go/go.sum
+++ b/eventmesh-workflow-go/go.sum
@@ -34,11 +34,16 @@ dmitri.shuralyov.com/gpu/mtl 
v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7
 github.com/BurntSushi/toml v0.3.1/go.mod 
h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/BurntSushi/toml v1.2.0 
h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0=
 github.com/BurntSushi/toml v1.2.0/go.mod 
h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/BurntSushi/toml v1.2.1 
h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=
+github.com/BurntSushi/toml v1.2.1/go.mod 
h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod 
h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/KyleBanks/depth v1.2.1 
h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
+github.com/KyleBanks/depth v1.2.1/go.mod 
h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
 github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod 
h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
 github.com/OneOfOne/xxhash v1.2.2/go.mod 
h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
 github.com/PuerkitoBio/purell v1.1.1/go.mod 
h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod 
h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
+github.com/agiledragon/gomonkey/v2 v2.3.1/go.mod 
h1:ap1AmDzcVOAz1YpeJ3TCzIgstoaWLA6jbbgxfB4w2iY=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod 
h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod 
h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod 
h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
@@ -90,6 +95,8 @@ github.com/cncf/xds/go 
v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH
 github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod 
h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod 
h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod 
h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod 
h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/cpuguy83/go-md2man/v2 v2.0.2 
h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
 github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod 
h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
 github.com/creack/pty v1.1.9/go.mod 
h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/davecgh/go-spew v1.1.0/go.mod 
h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -116,7 +123,15 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod 
h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo
 github.com/fsnotify/fsnotify v1.4.9/go.mod 
h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 github.com/fsnotify/fsnotify v1.5.4 
h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
 github.com/fsnotify/fsnotify v1.5.4/go.mod 
h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
+github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
 github.com/ghodss/yaml v1.0.0/go.mod 
h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/gin-contrib/gzip v0.0.6 
h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4=
+github.com/gin-contrib/gzip v0.0.6/go.mod 
h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk=
+github.com/gin-contrib/sse v0.1.0 
h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
+github.com/gin-contrib/sse v0.1.0/go.mod 
h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
+github.com/gin-gonic/gin v1.8.1/go.mod 
h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk=
+github.com/gin-gonic/gin v1.8.2 h1:UzKToD9/PoFj/V4rvlKqTRKnQYyz8Sc1MJlv4JHPtvY=
+github.com/gin-gonic/gin v1.8.2/go.mod 
h1:qw5AYuDrzRTnhvusDsrov+fDIxp9Dleuu12h8nfB398=
 github.com/go-errors/errors v1.0.1/go.mod 
h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
 github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod 
h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod 
h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
@@ -132,15 +147,43 @@ github.com/go-logr/logr v0.4.0 
h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc=
 github.com/go-logr/logr v0.4.0/go.mod 
h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
 github.com/go-openapi/jsonpointer v0.19.2/go.mod 
h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
 github.com/go-openapi/jsonpointer v0.19.3/go.mod 
h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
+github.com/go-openapi/jsonpointer v0.19.5 
h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
+github.com/go-openapi/jsonpointer v0.19.5/go.mod 
h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
+github.com/go-openapi/jsonpointer v0.19.6 
h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
+github.com/go-openapi/jsonpointer v0.19.6/go.mod 
h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
 github.com/go-openapi/jsonreference v0.19.2/go.mod 
h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
 github.com/go-openapi/jsonreference v0.19.3/go.mod 
h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
+github.com/go-openapi/jsonreference v0.19.6/go.mod 
h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns=
+github.com/go-openapi/jsonreference v0.20.0 
h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA=
+github.com/go-openapi/jsonreference v0.20.0/go.mod 
h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo=
+github.com/go-openapi/jsonreference v0.20.1 
h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8=
+github.com/go-openapi/jsonreference v0.20.1/go.mod 
h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
 github.com/go-openapi/spec v0.19.3/go.mod 
h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
+github.com/go-openapi/spec v0.20.4/go.mod 
h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I=
+github.com/go-openapi/spec v0.20.7 
h1:1Rlu/ZrOCCob0n+JKKJAWhNWMPW8bOZRg8FJaY+0SKI=
+github.com/go-openapi/spec v0.20.7/go.mod 
h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA=
 github.com/go-openapi/swag v0.19.2/go.mod 
h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 github.com/go-openapi/swag v0.19.5/go.mod 
h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
+github.com/go-openapi/swag v0.19.15/go.mod 
h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
+github.com/go-openapi/swag v0.22.3 
h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g=
+github.com/go-openapi/swag v0.22.3/go.mod 
h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
+github.com/go-playground/assert/v2 v2.0.1 
h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
+github.com/go-playground/assert/v2 v2.0.1/go.mod 
h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
+github.com/go-playground/locales v0.14.0 
h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU=
+github.com/go-playground/locales v0.14.0/go.mod 
h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
+github.com/go-playground/universal-translator v0.18.0 
h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho=
+github.com/go-playground/universal-translator v0.18.0/go.mod 
h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
+github.com/go-playground/validator/v10 v10.10.0/go.mod 
h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
+github.com/go-playground/validator/v10 v10.11.1 
h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ=
+github.com/go-playground/validator/v10 v10.11.1/go.mod 
h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU=
 github.com/go-sql-driver/mysql v1.6.0 
h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
 github.com/go-sql-driver/mysql v1.6.0/go.mod 
h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 github.com/go-stack/stack v1.8.0/go.mod 
h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod 
h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
+github.com/goccy/go-json v0.9.7/go.mod 
h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/goccy/go-json v0.9.11/go.mod 
h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/goccy/go-json v0.10.0 
h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA=
+github.com/goccy/go-json v0.10.0/go.mod 
h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
 github.com/gogf/gf v1.16.9 h1:Q803UmmRo59+Ws08sMVFOcd8oNpkSWL9vS33hlo/Cyk=
 github.com/gogf/gf v1.16.9/go.mod 
h1:8Q/kw05nlVRp+4vv7XASBsMe9L1tsVKiGoeP2AHnlkk=
 github.com/gogo/protobuf v1.1.1/go.mod 
h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
@@ -243,6 +286,8 @@ github.com/jinzhu/now v1.1.5 
h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
 github.com/jinzhu/now v1.1.5/go.mod 
h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
 github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af 
h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM=
 github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod 
h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
+github.com/josharian/intern v1.0.0 
h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
+github.com/josharian/intern v1.0.0/go.mod 
h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
 github.com/jpillora/backoff v1.0.0/go.mod 
h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
 github.com/json-iterator/go v1.1.5/go.mod 
h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.6/go.mod 
h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
@@ -262,24 +307,32 @@ github.com/konsorten/go-windows-terminal-sequences 
v1.0.3/go.mod h1:T0+1ngSBFLxv
 github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod 
h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 github.com/kr/pretty v0.1.0/go.mod 
h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pretty v0.2.0/go.mod 
h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
-github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
 github.com/kr/pretty v0.2.1/go.mod 
h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
+github.com/kr/pretty v0.3.0/go.mod 
h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
 github.com/kr/text v0.1.0/go.mod 
h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod 
h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/leodido/go-urn v1.2.1 
h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
+github.com/leodido/go-urn v1.2.1/go.mod 
h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
 github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc 
h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8=
 github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod 
h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is=
 github.com/lestrrat-go/strftime v1.0.6 
h1:CFGsDEt1pOpFNU+TJB0nhz9jl+K0hZSLE205AhTIGQQ=
 github.com/lestrrat-go/strftime v1.0.6/go.mod 
h1:f7jQKgV5nnJpYgdEasS+/y7EsTb8ykN2z68n3TtcTaw=
 github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod 
h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod 
h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/mailru/easyjson v0.7.6/go.mod 
h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mailru/easyjson v0.7.7 
h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod 
h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 github.com/mattn/go-colorable v0.1.8 
h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8=
 github.com/mattn/go-colorable v0.1.8/go.mod 
h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 github.com/mattn/go-isatty v0.0.12/go.mod 
h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
-github.com/mattn/go-isatty v0.0.14 
h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
 github.com/mattn/go-isatty v0.0.14/go.mod 
h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
+github.com/mattn/go-isatty v0.0.16/go.mod 
h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
+github.com/mattn/go-isatty v0.0.17 
h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
+github.com/mattn/go-isatty v0.0.17/go.mod 
h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
 github.com/mattn/go-runewidth v0.0.9/go.mod 
h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 github.com/mattn/go-runewidth v0.0.13 
h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
 github.com/mattn/go-runewidth v0.0.13/go.mod 
h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
@@ -322,9 +375,18 @@ github.com/onsi/gomega v1.10.1/go.mod 
h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y
 github.com/onsi/gomega v1.17.0/go.mod 
h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
 github.com/onsi/gomega v1.19.0/go.mod 
h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
 github.com/onsi/gomega v1.20.0/go.mod 
h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo=
+github.com/otiai10/copy v1.7.0/go.mod 
h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U=
+github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod 
h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=
+github.com/otiai10/curr v1.0.0/go.mod 
h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs=
+github.com/otiai10/mint v1.3.0/go.mod 
h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
+github.com/otiai10/mint v1.3.3/go.mod 
h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc=
 github.com/panjf2000/ants v1.3.0 
h1:8pQ+8leaLc9lys2viEEr8md0U4RN6uOSUCE9bOYjQ9M=
 github.com/panjf2000/ants v1.3.0/go.mod 
h1:AaACblRPzq35m1g3enqYcxspbbiOJJYaxU2wMpm1cXY=
+github.com/pelletier/go-toml/v2 v2.0.1/go.mod 
h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
+github.com/pelletier/go-toml/v2 v2.0.6 
h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU=
+github.com/pelletier/go-toml/v2 v2.0.6/go.mod 
h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek=
 github.com/pierrre/gotestcover v0.0.0-20160517101806-924dca7d15f0/go.mod 
h1:4xpMLz7RBWyB+ElzHu8Llua96TRCB3YwX+l5EP1wmHk=
+github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod 
h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
 github.com/pkg/errors v0.8.0/go.mod 
h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.8.1/go.mod 
h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -360,14 +422,21 @@ github.com/rivo/uniseg v0.2.0/go.mod 
h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ
 github.com/robertkrimen/godocdown v0.0.0-20130622164427-0bfa04905481/go.mod 
h1:C9WhFzY47SzYBIvzFqSvHIR6ROgDo4TtdTuRaOMjF/s=
 github.com/rogpeppe/fastuuid v1.2.0/go.mod 
h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
 github.com/rogpeppe/go-internal v1.3.0/go.mod 
h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rogpeppe/go-internal v1.6.1/go.mod 
h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
+github.com/rogpeppe/go-internal v1.8.0 
h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
+github.com/rogpeppe/go-internal v1.8.0/go.mod 
h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod 
h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/russross/blackfriday/v2 v2.1.0 
h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
 github.com/russross/blackfriday/v2 v2.1.0/go.mod 
h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 github.com/serverlessworkflow/sdk-go/v2 v2.1.1 
h1:jY0iUI8uKiegfe//Y+GEWgearQf16zH7p7WPogfsCK8=
 github.com/serverlessworkflow/sdk-go/v2 v2.1.1/go.mod 
h1:7RETLv7jC7cmzo9lz/tadIfrqSrbhN3NEeIB3ppVQWk=
+github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod 
h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
 github.com/sirupsen/logrus v1.2.0/go.mod 
h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 github.com/sirupsen/logrus v1.4.2/go.mod 
h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 github.com/sirupsen/logrus v1.6.0/go.mod 
h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
 github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod 
h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
 github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod 
h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/smartystreets/goconvey v1.6.4/go.mod 
h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 github.com/sony/sonyflake v1.0.0 
h1:MpU6Ro7tfXwgn2l5eluf9xQvQJDROTBImNCfRXn/YeM=
 github.com/sony/sonyflake v1.0.0/go.mod 
h1:Jv3cfhf/UFtolOTTRd3q4Nl6ENqM+KfyZ5PseKfZGF4=
 github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod 
h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
@@ -379,8 +448,9 @@ github.com/spf13/pflag v1.0.5/go.mod 
h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An
 github.com/stretchr/objx v0.1.0/go.mod 
h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod 
h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.2.0/go.mod 
h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
-github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4=
 github.com/stretchr/objx v0.4.0/go.mod 
h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
+github.com/stretchr/objx v0.5.0/go.mod 
h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
 github.com/stretchr/testify v1.2.2/go.mod 
h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod 
h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.4.0/go.mod 
h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
@@ -388,15 +458,34 @@ github.com/stretchr/testify v1.5.1/go.mod 
h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
 github.com/stretchr/testify v1.6.1/go.mod 
h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.0/go.mod 
h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.1/go.mod 
h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.8.0 
h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
 github.com/stretchr/testify v1.8.0/go.mod 
h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1 
h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
+github.com/stretchr/testify v1.8.1/go.mod 
h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a/go.mod 
h1:lKJPbtWzJ9JhsTN1k1gZgleJWY/cqq0psdoMmaThG3w=
+github.com/swaggo/files v1.0.0 h1:1gGXVIeUFCS/dta17rnP0iOpr6CXFwKD7EO5ID233e4=
+github.com/swaggo/files v1.0.0/go.mod 
h1:N59U6URJLyU1PQgFqPM7wXLMhJx7QAolnvfQkqO13kc=
+github.com/swaggo/gin-swagger v1.5.3 
h1:8mWmHLolIbrhJJTflsaFoZzRBYVmEE7JZGIq08EiC0Q=
+github.com/swaggo/gin-swagger v1.5.3/go.mod 
h1:3XJKSfHjDMB5dBo/0rrTXidPmgLeqsX89Yp4uA50HpI=
+github.com/swaggo/swag v1.8.1/go.mod 
h1:ugemnJsPZm/kRwFUnzBlbHRd0JY9zE1M4F+uy2pAaPQ=
+github.com/swaggo/swag v1.8.9 h1:kHtaBe/Ob9AZzAANfcn5c6RyCke9gG9QpH0jky0I/sA=
+github.com/swaggo/swag v1.8.9/go.mod 
h1:ezQVUUhly8dludpVk+/PuwJWvLLanB13ygV5Pr9enSk=
 github.com/teivah/onecontext v0.0.0-20200513185103-40f981bfd775 
h1:BLNsFR8l/hj/oGjnJXkd4Vi3s4kQD3/3x8HSAE4bzN0=
 github.com/teivah/onecontext v0.0.0-20200513185103-40f981bfd775/go.mod 
h1:XUZ4x3oGhWfiOnUvTslnKKs39AWUct3g3yJvXTQSJOQ=
+github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo=
+github.com/ugorji/go v1.2.7/go.mod 
h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M=
+github.com/ugorji/go/codec v1.2.7/go.mod 
h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
+github.com/ugorji/go/codec v1.2.8 
h1:sgBJS6COt0b/P40VouWKdseidkDgHxYGm0SAglUHfP0=
+github.com/ugorji/go/codec v1.2.8/go.mod 
h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
+github.com/urfave/cli/v2 v2.3.0/go.mod 
h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
+github.com/urfave/cli/v2 v2.23.7 
h1:YHDQ46s3VghFHFf1DdF+Sh7H4RqhcM+t0TmZRJx4oJY=
+github.com/urfave/cli/v2 v2.23.7/go.mod 
h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc=
 github.com/valyala/bytebufferpool v1.0.0/go.mod 
h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
 github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod 
h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
 github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b/go.mod 
h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
 github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod 
h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
 github.com/xeipuuv/gojsonschema v1.2.0/go.mod 
h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
+github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 
h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
+github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod 
h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
 github.com/yuin/goldmark v1.1.25/go.mod 
h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.27/go.mod 
h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.32/go.mod 
h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -404,6 +493,7 @@ github.com/yuin/goldmark v1.2.1/go.mod 
h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec
 github.com/yuin/goldmark v1.3.5/go.mod 
h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 github.com/yuin/goldmark v1.4.0/go.mod 
h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 github.com/yuin/goldmark v1.4.1/go.mod 
h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+github.com/yuin/goldmark v1.4.13/go.mod 
h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
 go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
 go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
@@ -438,7 +528,11 @@ golang.org/x/crypto 
v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod 
h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod 
h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod 
h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod 
h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod 
h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod 
h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8=
+golang.org/x/crypto v0.4.0/go.mod 
h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod 
h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod 
h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod 
h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -471,6 +565,9 @@ golang.org/x/mod v0.2.0/go.mod 
h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod 
h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod 
h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA=
+golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -506,14 +603,22 @@ golang.org/x/net 
v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY
 golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod 
h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod 
h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod 
h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
+golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod 
h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
 golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod 
h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
 golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod 
h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod 
h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod 
h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod 
h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod 
h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod 
h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 
h1:HVyaeDAYux4pnY+D/SiwmLOR36ewZ4iGQIIrtnuCjFA=
 golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod 
h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod 
h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
+golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
+golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU=
+golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
+golang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw=
+golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod 
h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod 
h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod 
h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -531,8 +636,9 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod 
h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 
h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw=
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -577,11 +683,13 @@ golang.org/x/sys 
v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211107104306-e0b2ad06fe42/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -590,10 +698,19 @@ golang.org/x/sys 
v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a 
h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k=
 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ=
+golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=
+golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod 
h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod 
h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
+golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
+golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod 
h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod 
h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -601,8 +718,12 @@ golang.org/x/text v0.3.2/go.mod 
h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM=
+golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k=
+golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod 
h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod 
h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod 
h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -660,6 +781,11 @@ golang.org/x/tools v0.1.1/go.mod 
h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.5/go.mod 
h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.7/go.mod 
h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
 golang.org/x/tools v0.1.10/go.mod 
h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
+golang.org/x/tools v0.1.12/go.mod 
h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/tools v0.4.0 h1:7mTAgkunk3fr4GAloyyCasadO6h9zSsQZbwvcaIciV4=
+golang.org/x/tools v0.4.0/go.mod 
h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ=
+golang.org/x/tools v0.5.0 h1:+bSpV5HIeWkuvgaMfI3UmKRThoTA5ODJTUd8T17NO+4=
+golang.org/x/tools v0.5.0/go.mod 
h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -748,8 +874,9 @@ google.golang.org/protobuf v1.25.0/go.mod 
h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba
 google.golang.org/protobuf v1.26.0-rc.1/go.mod 
h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
 google.golang.org/protobuf v1.26.0/go.mod 
h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 google.golang.org/protobuf v1.27.1/go.mod 
h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.28.0 
h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
 google.golang.org/protobuf v1.28.0/go.mod 
h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+google.golang.org/protobuf v1.28.1 
h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
+google.golang.org/protobuf v1.28.1/go.mod 
h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod 
h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -781,6 +908,7 @@ gopkg.in/yaml.v2 v2.4.0 
h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20190709130402-674ba3eaed22/go.mod 
h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod 
h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod 
h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod 
h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/eventmesh-workflow-go/internal/constants/constants.go 
b/eventmesh-workflow-go/internal/constants/constants.go
index 2c1318e5c..d08f584ef 100644
--- a/eventmesh-workflow-go/internal/constants/constants.go
+++ b/eventmesh-workflow-go/internal/constants/constants.go
@@ -26,9 +26,10 @@ const (
 )
 
 const (
-       TaskStartID  = "START"
-       TaskEndID    = "END"
-       NormalStatus = 1
+       TaskStartID   = "START"
+       TaskEndID     = "END"
+       NormalStatus  = 1
+       InvalidStatus = -1
 )
 
 // task instance status
diff --git a/eventmesh-workflow-go/internal/dal/model/workflow.go 
b/eventmesh-workflow-go/internal/dal/model/workflow.go
index 3f7efc428..ecb7f099a 100644
--- a/eventmesh-workflow-go/internal/dal/model/workflow.go
+++ b/eventmesh-workflow-go/internal/dal/model/workflow.go
@@ -17,17 +17,22 @@ package model
 
 import "time"
 
+// Workflow workflow model definition
 type Workflow struct {
-       ID           int       `json:"id" 
gorm:"column:id;type:int;primaryKey;autoIncrement"`
-       WorkflowID   string    `json:"workflow_id" 
gorm:"column:workflow_id;type:varchar;size:1024"`
-       WorkflowName string    `json:"workflow_name" 
gorm:"column:workflow_name;type:varchar;size:1024"`
-       Definition   string    `json:"definition" 
gorm:"column:definition;type:text;"`
-       Status       int       `json:"status" gorm:"column:status;type:int"`
-       Version      string    `json:"version" 
gorm:"column:version;type:varchar;size:64"`
-       CreateTime   time.Time `json:"create_time"`
-       UpdateTime   time.Time `json:"update_time"`
+       ID                    int       `json:"id" 
gorm:"column:id;type:int;primaryKey;autoIncrement"`
+       WorkflowID            string    `json:"workflow_id" 
gorm:"column:workflow_id;type:varchar;size:1024"`
+       WorkflowName          string    `json:"workflow_name" 
gorm:"column:workflow_name;type:varchar;size:1024"`
+       Definition            string    `json:"definition" 
gorm:"column:definition;type:text;"`
+       Status                int       `json:"status" 
gorm:"column:status;type:int"`
+       Version               string    `json:"version" 
gorm:"column:version;type:varchar;size:64"`
+       CreateTime            time.Time `json:"create_time"`
+       UpdateTime            time.Time `json:"update_time"`
+       TotalInstances        int       `json:"total_instances" gorm:"-"`
+       TotalRunningInstances int       `json:"total_running_instances" 
gorm:"-"`
+       TotalFailedInstances  int       `json:"total_failed_instances" gorm:"-"`
 }
 
+// TableName workflow table name define
 func (w Workflow) TableName() string {
        return "t_workflow"
 }
@@ -44,3 +49,10 @@ type WorkflowInstance struct {
 func (w WorkflowInstance) TableName() string {
        return "t_workflow_instance"
 }
+
+type QueryParam struct {
+       WorkflowID string `json:"workflow_id"`
+       Status     int    `json:"status"`
+       Page       int    `json:"page"` // page num
+       Size       int    `json:"size"` // page size
+}
diff --git a/eventmesh-workflow-go/internal/dal/model/workflow_task.go 
b/eventmesh-workflow-go/internal/dal/model/workflow_task.go
index 501d132b0..ab369f306 100644
--- a/eventmesh-workflow-go/internal/dal/model/workflow_task.go
+++ b/eventmesh-workflow-go/internal/dal/model/workflow_task.go
@@ -29,7 +29,7 @@ type WorkflowTask struct {
        UpdateTime         time.Time               `json:"update_time"`
        Actions            []*WorkflowTaskAction   `json:"-" gorm:"-"`
        TaskIDs            []string                `json:"-" gorm:"-"`
-       WorkflowInstanceID string                  `json:"-" gorm:"-"`
+       WorkflowInstanceID string                  `json:"workflow_instance_id" 
gorm:"-"`
        ChildTasks         []*WorkflowTaskRelation `json:"-" gorm:"-"`
 }
 
diff --git a/eventmesh-workflow-go/internal/dal/workflow.go 
b/eventmesh-workflow-go/internal/dal/workflow.go
index f03cecc60..56e843150 100644
--- a/eventmesh-workflow-go/internal/dal/workflow.go
+++ b/eventmesh-workflow-go/internal/dal/workflow.go
@@ -17,6 +17,8 @@ package dal
 
 import (
        "context"
+       "errors"
+       "fmt"
        
"github.com/apache/incubator-eventmesh/eventmesh-workflow-go/internal/util"
        "time"
 
@@ -30,12 +32,17 @@ import (
        "gorm.io/gorm"
 )
 
+const maxSize = 100
+
 type WorkflowDAL interface {
        Select(ctx context.Context, workflowID string) (*model.Workflow, error)
+       SelectList(ctx context.Context, param *model.QueryParam) 
([]model.Workflow, int, error)
+       Save(ctx context.Context, record *model.Workflow) error
+       Delete(ctx context.Context, workflowID string) error
+       SelectInstances(ctx context.Context, param *model.QueryParam) 
([]model.WorkflowInstance, int, error)
        SelectStartTask(ctx context.Context, condition model.WorkflowTask) 
(*model.WorkflowTask, error)
        SelectTransitionTask(ctx context.Context, condition 
model.WorkflowTaskInstance) (*model.WorkflowTaskInstance, error)
        SelectTaskInstance(ctx context.Context, condition 
model.WorkflowTaskInstance) (*model.WorkflowTaskInstance, error)
-       Insert(ctx context.Context, record *model.Workflow) error
        InsertInstance(ctx context.Context, record *model.WorkflowInstance) 
error
        InsertTaskInstance(ctx context.Context, record 
*model.WorkflowTaskInstance) error
        UpdateInstance(ctx context.Context, record *model.WorkflowInstance) 
error
@@ -51,7 +58,7 @@ type workflowDALImpl struct {
 }
 
 func (w *workflowDALImpl) Select(ctx context.Context, workflowID string) 
(*model.Workflow, error) {
-       var condition = model.Workflow{WorkflowID: workflowID}
+       var condition = model.Workflow{WorkflowID: workflowID, Status: 
constants.NormalStatus}
        var r model.Workflow
        if err := 
workflowDB.WithContext(ctx).Where(&condition).First(&r).Error; err != nil {
                if err == gorm.ErrRecordNotFound {
@@ -62,6 +69,64 @@ func (w *workflowDALImpl) Select(ctx context.Context, 
workflowID string) (*model
        return &r, nil
 }
 
+func (w *workflowDALImpl) SelectList(ctx context.Context, param 
*model.QueryParam) ([]model.Workflow, int, error) {
+       var res []model.Workflow
+       var condition = model.Workflow{WorkflowID: param.WorkflowID, Status: 
param.Status}
+       db := workflowDB.WithContext(ctx).Where("1=1")
+       if len(condition.WorkflowID) > 0 {
+               // Suitable for small amount of data
+               // when the amount of data is too large, you need to use search 
engines for optimization
+               db = db.Where("workflow_id LIKE ?", fmt.Sprintf("%%%s%%", 
condition.WorkflowID))
+       }
+       if condition.Status == 0 {
+               condition.Status = constants.NormalStatus
+       }
+       db = db.Where("status = ?", condition.Status)
+       if param.Size > maxSize {
+               param.Size = maxSize
+       }
+       if param.Page == 0 {
+               param.Page = 1
+       }
+       var count int64
+       db = db.Limit(param.Size).Offset(param.Size * (param.Page - 
1)).Order("update_time DESC")
+       if err := db.Find(&res).Count(&count).Error; err != nil {
+               if err == gorm.ErrRecordNotFound {
+                       return nil, 0, nil
+               }
+               return nil, 0, err
+       }
+       if count == 0 {
+               return res, int(count), nil
+       }
+       if err := w.fillInstanceCount(res); err != nil {
+               return res, int(count), err
+       }
+       return res, int(count), nil
+}
+
+func (w *workflowDALImpl) SelectInstances(ctx context.Context, param 
*model.QueryParam) ([]model.WorkflowInstance,
+       int, error) {
+       var r []model.WorkflowInstance
+       db := workflowDB.WithContext(ctx).Where("workflow_status != ?", 
constants.InvalidStatus).
+               Where("workflow_id = ?", param.WorkflowID)
+       if param.Size > maxSize {
+               param.Size = maxSize
+       }
+       if param.Page == 0 {
+               param.Page = 1
+       }
+       var count int64
+       db = db.Limit(param.Size).Offset(param.Size * (param.Page - 
1)).Order("update_time DESC")
+       if err := db.Find(&r).Count(&count).Error; err != nil {
+               if err == gorm.ErrRecordNotFound {
+                       return nil, 0, nil
+               }
+               return nil, 0, err
+       }
+       return r, int(count), nil
+}
+
 func (w *workflowDALImpl) SelectStartTask(ctx context.Context, condition 
model.WorkflowTask) (*model.WorkflowTask,
        error) {
        var c = model.WorkflowTaskRelation{FromTaskID: constants.TaskStartID, 
WorkflowID: condition.WorkflowID,
@@ -99,11 +164,11 @@ func (w *workflowDALImpl) SelectTaskInstance(ctx 
context.Context, condition mode
                }
                return nil, err
        }
-       var handlers []func() error
        var err error
        var tasks []*model.WorkflowTask
        var childTasks []*model.WorkflowTaskRelation
        var taskActions []*model.WorkflowTaskAction
+       var handlers []func() error
        handlers = append(handlers, func() error {
                tasks, err = w.selectTask(context.Background(), r.WorkflowID, 
[]string{r.TaskID})
                return err
@@ -125,43 +190,20 @@ func (w *workflowDALImpl) SelectTaskInstance(ctx 
context.Context, condition mode
        return w.completeTaskInstance(r, tasks, childTasks, taskActions)
 }
 
-func (w *workflowDALImpl) Insert(ctx context.Context, record *model.Workflow) 
error {
+// Delete delete workflow and relate info
+func (w *workflowDALImpl) Delete(ctx context.Context, workflowID string) error 
{
+       return w.delete(workflowDB, workflowID)
+}
+
+func (w *workflowDALImpl) Save(ctx context.Context, record *model.Workflow) 
error {
        return workflowDB.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
-               wf, err := swf.Parse(record.Definition)
-               if err != nil {
-                       return err
-               }
-               record.WorkflowID = wf.ID
-               record.WorkflowName = wf.Name
-               record.Version = wf.Version
-               record.Status = constants.NormalStatus
-               record.CreateTime = time.Now()
-               record.UpdateTime = time.Now()
-               var handlers []func() error
-               handlers = append(handlers, func() error {
-                       return tx.Create(record).Error
-               })
-               tasks := w.buildTask(wf)
-               for _, task := range tasks {
-                       task := task
-                       handlers = append(handlers, func() error {
-                               return tx.Create(task).Error
-                       })
-                       for _, action := range task.Actions {
-                               action := action
-                               handlers = append(handlers, func() error {
-                                       return tx.Create(action).Error
-                               })
+               // first delete and insert
+               if len(record.WorkflowID) > 0 {
+                       if err := w.delete(tx, record.WorkflowID); err != nil {
+                               return err
                        }
                }
-               taskRelations := w.buildTaskRelation(wf, tasks)
-               for _, relation := range taskRelations {
-                       relation := relation
-                       handlers = append(handlers, func() error {
-                               return tx.Create(relation).Error
-                       })
-               }
-               return util.GoAndWait(handlers...)
+               return w.create(ctx, tx, record)
        })
 }
 
@@ -190,6 +232,82 @@ func (w *workflowDALImpl) UpdateTaskInstance(tx *gorm.DB, 
record *model.Workflow
        return tx.Where(&condition).Updates(&record).Error
 }
 
+func (w *workflowDALImpl) delete(tx *gorm.DB, workflowID string) error {
+       var handlers []func() error
+       handlers = append(handlers, func() error {
+               record := model.Workflow{Status: constants.InvalidStatus, 
UpdateTime: time.Now()}
+               return tx.Where("workflow_id = ?", 
workflowID).Updates(&record).Error
+       }, func() error {
+               record := model.WorkflowTask{Status: constants.InvalidStatus, 
UpdateTime: time.Now()}
+               return tx.Where("workflow_id = ?", 
workflowID).Updates(&record).Error
+       }, func() error {
+               record := model.WorkflowTaskRelation{Status: 
constants.InvalidStatus,
+                       UpdateTime: time.Now()}
+               return tx.Where("workflow_id = ?", 
workflowID).Updates(&record).Error
+       }, func() error {
+               record := model.WorkflowTaskAction{Status: 
constants.InvalidStatus,
+                       UpdateTime: time.Now()}
+               return tx.Where("workflow_id = ?", 
workflowID).Updates(&record).Error
+       }, func() error {
+               record := model.WorkflowInstance{WorkflowStatus: 
constants.InvalidStatus,
+                       UpdateTime: time.Now()}
+               return tx.Where("workflow_id = ?", 
workflowID).Updates(&record).Error
+       }, func() error {
+               record := model.WorkflowTaskInstance{Status: 
constants.InvalidStatus,
+                       UpdateTime: time.Now()}
+               return tx.Where("workflow_id = ?", 
workflowID).Updates(&record).Error
+       })
+       return util.GoAndWait(handlers...)
+}
+
+func (w *workflowDALImpl) create(ctx context.Context, tx *gorm.DB, record 
*model.Workflow) error {
+       wf, err := swf.Parse(record.Definition)
+       if err != nil {
+               return err
+       }
+       if wf == nil {
+               return errors.New("workflow text invalid")
+       }
+       r, err := w.Select(ctx, wf.ID)
+       if err != nil {
+               return err
+       }
+       if r != nil {
+               return errors.New("workflow id already exists")
+       }
+       record.WorkflowID = wf.ID
+       record.WorkflowName = wf.Name
+       record.Version = wf.Version
+       record.Status = constants.NormalStatus
+       record.CreateTime = time.Now()
+       record.UpdateTime = time.Now()
+       var handlers []func() error
+       handlers = append(handlers, func() error {
+               return tx.Create(record).Error
+       })
+       tasks := w.buildTask(wf)
+       for _, task := range tasks {
+               task := task
+               handlers = append(handlers, func() error {
+                       return tx.Create(task).Error
+               })
+               for _, action := range task.Actions {
+                       action := action
+                       handlers = append(handlers, func() error {
+                               return tx.Create(action).Error
+                       })
+               }
+       }
+       taskRelations := w.buildTaskRelation(wf, tasks)
+       for _, relation := range taskRelations {
+               relation := relation
+               handlers = append(handlers, func() error {
+                       return tx.Create(relation).Error
+               })
+       }
+       return util.GoAndWait(handlers...)
+}
+
 func (w *workflowDALImpl) buildTask(workflow *pmodel.Workflow) 
[]*model.WorkflowTask {
        if workflow == nil || len(workflow.States) == 0 {
                return nil
@@ -431,3 +549,30 @@ func (w *workflowDALImpl) completeTaskInstance(instance 
model.WorkflowTaskInstan
        r.Task.Actions = taskActions
        return &r, nil
 }
+
+func (w *workflowDALImpl) fillInstanceCount(workflows []model.Workflow) error {
+       var handlers []func() error
+       for idx := range workflows {
+               idx := idx
+               handlers = append(handlers, func() error {
+                       var instances []model.WorkflowInstance
+                       if err := workflowDB.Where("workflow_id = ?", 
workflows[idx].WorkflowID).
+                               Where("workflow_status != ?", 
constants.InvalidStatus).Find(&instances).Error; err != nil {
+                               return err
+                       }
+                       if len(instances) == 0 {
+                               return nil
+                       }
+                       workflows[idx].TotalInstances = len(instances)
+                       for _, instance := range instances {
+                               if instance.WorkflowStatus == 
constants.TaskInstanceFailStatus {
+                                       workflows[idx].TotalFailedInstances++
+                               } else {
+                                       workflows[idx].TotalRunningInstances++
+                               }
+                       }
+                       return nil
+               })
+       }
+       return util.GoAndWait(handlers...)
+}
diff --git a/eventmesh-workflow-go/main.go b/eventmesh-workflow-go/main.go
deleted file mode 100644
index be50f5f4e..000000000
--- a/eventmesh-workflow-go/main.go
+++ /dev/null
@@ -1,41 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package main
-
-import (
-       "github.com/apache/incubator-eventmesh/eventmesh-server-go/log"
-       _ 
"github.com/apache/incubator-eventmesh/eventmesh-server-go/pkg/naming/registry"
-       _ 
"github.com/apache/incubator-eventmesh/eventmesh-server-go/plugin/database/mysql"
-       _ 
"github.com/apache/incubator-eventmesh/eventmesh-server-go/plugin/naming/nacos/selector"
-       "github.com/apache/incubator-eventmesh/eventmesh-workflow-go/api"
-       "github.com/apache/incubator-eventmesh/eventmesh-workflow-go/api/proto"
-       _ 
"github.com/apache/incubator-eventmesh/eventmesh-workflow-go/internal/queue"
-)
-
-func main() {
-       s, err := NewServer()
-       if err != nil {
-               log.Fatal("flow new server fail: " + err.Error())
-       }
-       router(s)
-       if err = s.Run(); err != nil {
-               log.Fatal("run server fail: " + err.Error())
-       }
-}
-
-func router(s *Server) {
-       proto.RegisterWorkflowServer(s.Server, api.NewWorkflowService())
-}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to