diff --git a/internal/domain/workflow_output.go b/internal/domain/workflow_output.go index 81e1ae19..d0c5665c 100644 --- a/internal/domain/workflow_output.go +++ b/internal/domain/workflow_output.go @@ -4,9 +4,9 @@ const WorkflowOutputCertificate = "certificate" type WorkflowOutput struct { Meta - WorkflowId string `json:"workflowId" db:"workflowId"` + WorkflowId string `json:"workflowId" db:"workflow"` NodeId string `json:"nodeId" db:"nodeId"` Node *WorkflowNode `json:"node" db:"node"` Outputs []WorkflowNodeIO `json:"outputs" db:"outputs"` - Succeeded bool `json:"succeeded"db:"succeeded"` + Succeeded bool `json:"succeeded" db:"succeeded"` } diff --git a/internal/domain/workflow_run.go b/internal/domain/workflow_run.go new file mode 100644 index 00000000..6ea2222a --- /dev/null +++ b/internal/domain/workflow_run.go @@ -0,0 +1,40 @@ +package domain + +import "time" + +type WorkflowRun struct { + Meta + WorkflowId string `json:"workflowId" db:"workflowId"` + Trigger string `json:"trigger" db:"trigger"` + StartedAt time.Time `json:"startedAt" db:"startedAt"` + CompletedAt time.Time `json:"completedAt" db:"completedAt"` + Logs []WorkflowRunLog `json:"logs" db:"logs"` + Succeeded bool `json:"succeeded" db:"succeeded"` + Error string `json:"error" db:"error"` +} + +type WorkflowRunLog struct { + NodeId string `json:"nodeId"` + NodeName string `json:"nodeName"` + Error string `json:"error"` + Outputs []WorkflowRunLogOutput `json:"outputs"` +} + +type WorkflowRunLogOutput struct { + Time string `json:"time"` + Title string `json:"title"` + Content string `json:"content"` + Error string `json:"error"` +} + +type WorkflowRunLogs []WorkflowRunLog + +func (r WorkflowRunLogs) FirstError() string { + for _, log := range r { + if log.Error != "" { + return log.Error + } + } + + return "" +} diff --git a/internal/domain/workflow_run_log.go b/internal/domain/workflow_run_log.go deleted file mode 100644 index 057010a0..00000000 --- a/internal/domain/workflow_run_log.go +++ /dev/null @@ -1,34 +0,0 @@ -package domain - -type WorkflowRunLog struct { - Meta - WorkflowId string `json:"workflowId" db:"workflowId"` - Logs []RunLog `json:"logs" db:"logs"` - Succeeded bool `json:"succeeded" db:"succeeded"` - Error string `json:"error" db:"error"` -} - -type RunLogOutput struct { - Time string `json:"time"` - Title string `json:"title"` - Content string `json:"content"` - Error string `json:"error"` -} - -type RunLog struct { - NodeId string `json:"nodeId"` - NodeName string `json:"nodeName"` - Error string `json:"error"` - Outputs []RunLogOutput `json:"outputs"` -} - -type RunLogs []RunLog - -func (r RunLogs) Error() string { - for _, log := range r { - if log.Error != "" { - return log.Error - } - } - return "" -} diff --git a/internal/repository/workflow.go b/internal/repository/workflow.go index cebae222..69cab149 100644 --- a/internal/repository/workflow.go +++ b/internal/repository/workflow.go @@ -37,14 +37,17 @@ func (w *WorkflowRepository) ListEnabledAuto(ctx context.Context) ([]domain.Work return rs, nil } -func (w *WorkflowRepository) SaveRunLog(ctx context.Context, log *domain.WorkflowRunLog) error { - collection, err := app.GetApp().Dao().FindCollectionByNameOrId("workflow_run_log") +func (w *WorkflowRepository) SaveRunLog(ctx context.Context, log *domain.WorkflowRun) error { + collection, err := app.GetApp().Dao().FindCollectionByNameOrId("workflow_run") if err != nil { return err } record := models.NewRecord(collection) record.Set("workflowId", log.WorkflowId) + record.Set("trigger", log.Trigger) + record.Set("startedAt", log.StartedAt) + record.Set("completedAt", log.CompletedAt) record.Set("logs", log.Logs) record.Set("succeeded", log.Succeeded) record.Set("error", log.Error) diff --git a/internal/workflow/node-processor/processor.go b/internal/workflow/node-processor/processor.go index 828a5d19..fca0ee0a 100644 --- a/internal/workflow/node-processor/processor.go +++ b/internal/workflow/node-processor/processor.go @@ -10,30 +10,30 @@ import ( type NodeProcessor interface { Run(ctx context.Context) error - Log(ctx context.Context) *domain.RunLog + Log(ctx context.Context) *domain.WorkflowRunLog AddOutput(ctx context.Context, title, content string, err ...string) } type Logger struct { - log *domain.RunLog + log *domain.WorkflowRunLog } func NewLogger(node *domain.WorkflowNode) *Logger { return &Logger{ - log: &domain.RunLog{ + log: &domain.WorkflowRunLog{ NodeId: node.Id, NodeName: node.Name, - Outputs: make([]domain.RunLogOutput, 0), + Outputs: make([]domain.WorkflowRunLogOutput, 0), }, } } -func (l *Logger) Log(ctx context.Context) *domain.RunLog { +func (l *Logger) Log(ctx context.Context) *domain.WorkflowRunLog { return l.log } func (l *Logger) AddOutput(ctx context.Context, title, content string, err ...string) { - output := domain.RunLogOutput{ + output := domain.WorkflowRunLogOutput{ Time: time.Now().UTC().Format(time.RFC3339), Title: title, Content: content, diff --git a/internal/workflow/node-processor/workflow_processor.go b/internal/workflow/node-processor/workflow_processor.go index 4602254f..20a53315 100644 --- a/internal/workflow/node-processor/workflow_processor.go +++ b/internal/workflow/node-processor/workflow_processor.go @@ -8,17 +8,17 @@ import ( type workflowProcessor struct { workflow *domain.Workflow - logs []domain.RunLog + logs []domain.WorkflowRunLog } func NewWorkflowProcessor(workflow *domain.Workflow) *workflowProcessor { return &workflowProcessor{ workflow: workflow, - logs: make([]domain.RunLog, 0), + logs: make([]domain.WorkflowRunLog, 0), } } -func (w *workflowProcessor) Log(ctx context.Context) []domain.RunLog { +func (w *workflowProcessor) Log(ctx context.Context) []domain.WorkflowRunLog { return w.logs } diff --git a/internal/workflow/service.go b/internal/workflow/service.go index 3b604326..f8e9da1a 100644 --- a/internal/workflow/service.go +++ b/internal/workflow/service.go @@ -11,7 +11,7 @@ import ( type WorkflowRepository interface { Get(ctx context.Context, id string) (*domain.Workflow, error) - SaveRunLog(ctx context.Context, log *domain.WorkflowRunLog) error + SaveRunLog(ctx context.Context, log *domain.WorkflowRun) error ListEnabledAuto(ctx context.Context) ([]domain.Workflow, error) } @@ -68,7 +68,7 @@ func (s *WorkflowService) Run(ctx context.Context, req *domain.WorkflowRunReq) e processor := nodeprocessor.NewWorkflowProcessor(workflow) if err := processor.Run(ctx); err != nil { - log := &domain.WorkflowRunLog{ + log := &domain.WorkflowRun{ WorkflowId: workflow.Id, Logs: processor.Log(ctx), Succeeded: false, @@ -82,13 +82,13 @@ func (s *WorkflowService) Run(ctx context.Context, req *domain.WorkflowRunReq) e // 保存执行日志 logs := processor.Log(ctx) - runLogs := domain.RunLogs(logs) - runErr := runLogs.Error() + runLogs := domain.WorkflowRunLogs(logs) + runErr := runLogs.FirstError() succeed := true if runErr != "" { succeed = false } - log := &domain.WorkflowRunLog{ + log := &domain.WorkflowRun{ WorkflowId: workflow.Id, Logs: processor.Log(ctx), Error: runErr, diff --git a/migrations/1735980691_updated_workflow_run_log.go b/migrations/1735980691_updated_workflow_run_log.go new file mode 100644 index 00000000..03117dc8 --- /dev/null +++ b/migrations/1735980691_updated_workflow_run_log.go @@ -0,0 +1,105 @@ +package migrations + +import ( + "encoding/json" + + "github.com/pocketbase/dbx" + "github.com/pocketbase/pocketbase/daos" + m "github.com/pocketbase/pocketbase/migrations" + "github.com/pocketbase/pocketbase/models/schema" +) + +func init() { + m.Register(func(db dbx.Builder) error { + dao := daos.New(db); + + collection, err := dao.FindCollectionByNameOrId("qjp8lygssgwyqyz") + if err != nil { + return err + } + + collection.Name = "workflow_run" + + // add + new_trigger := &schema.SchemaField{} + if err := json.Unmarshal([]byte(`{ + "system": false, + "id": "jlroa3fk", + "name": "trigger", + "type": "select", + "required": false, + "presentable": false, + "unique": false, + "options": { + "maxSelect": 1, + "values": [ + "auto", + "manual" + ] + } + }`), new_trigger); err != nil { + return err + } + collection.Schema.AddField(new_trigger) + + // add + new_startedAt := &schema.SchemaField{} + if err := json.Unmarshal([]byte(`{ + "system": false, + "id": "k9xvtf89", + "name": "startedAt", + "type": "date", + "required": false, + "presentable": false, + "unique": false, + "options": { + "min": "", + "max": "" + } + }`), new_startedAt); err != nil { + return err + } + collection.Schema.AddField(new_startedAt) + + // add + new_endedAt := &schema.SchemaField{} + if err := json.Unmarshal([]byte(`{ + "system": false, + "id": "3ikum7mk", + "name": "endedAt", + "type": "date", + "required": false, + "presentable": false, + "unique": false, + "options": { + "min": "", + "max": "" + } + }`), new_endedAt); err != nil { + return err + } + collection.Schema.AddField(new_endedAt) + + return dao.SaveCollection(collection) + }, func(db dbx.Builder) error { + dao := daos.New(db); + + collection, err := dao.FindCollectionByNameOrId("qjp8lygssgwyqyz") + if err != nil { + return err + } + + collection.Name = "workflow_run_log" + + // remove + collection.Schema.RemoveField("jlroa3fk") + + // remove + collection.Schema.RemoveField("k9xvtf89") + + // remove + collection.Schema.RemoveField("3ikum7mk") + + return dao.SaveCollection(collection) + }) +} diff --git a/ui/src/repository/workflowRun.ts b/ui/src/repository/workflowRun.ts index 4d5794b5..7dac78a6 100644 --- a/ui/src/repository/workflowRun.ts +++ b/ui/src/repository/workflowRun.ts @@ -2,7 +2,7 @@ import { getPocketBase } from "./pocketbase"; -const COLLECTION_NAME = "workflow_run_log"; +const COLLECTION_NAME = "workflow_run"; export type ListWorkflowRunsRequest = { workflowId: string;