feat: rename workflow_run_log to workflow_run

This commit is contained in:
Fu Diwei 2025-01-04 16:53:58 +08:00
parent 01ede08a79
commit b686579acc
9 changed files with 167 additions and 53 deletions

View File

@ -4,9 +4,9 @@ const WorkflowOutputCertificate = "certificate"
type WorkflowOutput struct { type WorkflowOutput struct {
Meta Meta
WorkflowId string `json:"workflowId" db:"workflowId"` WorkflowId string `json:"workflowId" db:"workflow"`
NodeId string `json:"nodeId" db:"nodeId"` NodeId string `json:"nodeId" db:"nodeId"`
Node *WorkflowNode `json:"node" db:"node"` Node *WorkflowNode `json:"node" db:"node"`
Outputs []WorkflowNodeIO `json:"outputs" db:"outputs"` Outputs []WorkflowNodeIO `json:"outputs" db:"outputs"`
Succeeded bool `json:"succeeded"db:"succeeded"` Succeeded bool `json:"succeeded" db:"succeeded"`
} }

View File

@ -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 ""
}

View File

@ -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 ""
}

View File

@ -37,14 +37,17 @@ func (w *WorkflowRepository) ListEnabledAuto(ctx context.Context) ([]domain.Work
return rs, nil return rs, nil
} }
func (w *WorkflowRepository) SaveRunLog(ctx context.Context, log *domain.WorkflowRunLog) error { func (w *WorkflowRepository) SaveRunLog(ctx context.Context, log *domain.WorkflowRun) error {
collection, err := app.GetApp().Dao().FindCollectionByNameOrId("workflow_run_log") collection, err := app.GetApp().Dao().FindCollectionByNameOrId("workflow_run")
if err != nil { if err != nil {
return err return err
} }
record := models.NewRecord(collection) record := models.NewRecord(collection)
record.Set("workflowId", log.WorkflowId) 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("logs", log.Logs)
record.Set("succeeded", log.Succeeded) record.Set("succeeded", log.Succeeded)
record.Set("error", log.Error) record.Set("error", log.Error)

View File

@ -10,30 +10,30 @@ import (
type NodeProcessor interface { type NodeProcessor interface {
Run(ctx context.Context) error 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) AddOutput(ctx context.Context, title, content string, err ...string)
} }
type Logger struct { type Logger struct {
log *domain.RunLog log *domain.WorkflowRunLog
} }
func NewLogger(node *domain.WorkflowNode) *Logger { func NewLogger(node *domain.WorkflowNode) *Logger {
return &Logger{ return &Logger{
log: &domain.RunLog{ log: &domain.WorkflowRunLog{
NodeId: node.Id, NodeId: node.Id,
NodeName: node.Name, 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 return l.log
} }
func (l *Logger) AddOutput(ctx context.Context, title, content string, err ...string) { 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), Time: time.Now().UTC().Format(time.RFC3339),
Title: title, Title: title,
Content: content, Content: content,

View File

@ -8,17 +8,17 @@ import (
type workflowProcessor struct { type workflowProcessor struct {
workflow *domain.Workflow workflow *domain.Workflow
logs []domain.RunLog logs []domain.WorkflowRunLog
} }
func NewWorkflowProcessor(workflow *domain.Workflow) *workflowProcessor { func NewWorkflowProcessor(workflow *domain.Workflow) *workflowProcessor {
return &workflowProcessor{ return &workflowProcessor{
workflow: workflow, 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 return w.logs
} }

View File

@ -11,7 +11,7 @@ import (
type WorkflowRepository interface { type WorkflowRepository interface {
Get(ctx context.Context, id string) (*domain.Workflow, error) 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) 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) processor := nodeprocessor.NewWorkflowProcessor(workflow)
if err := processor.Run(ctx); err != nil { if err := processor.Run(ctx); err != nil {
log := &domain.WorkflowRunLog{ log := &domain.WorkflowRun{
WorkflowId: workflow.Id, WorkflowId: workflow.Id,
Logs: processor.Log(ctx), Logs: processor.Log(ctx),
Succeeded: false, Succeeded: false,
@ -82,13 +82,13 @@ func (s *WorkflowService) Run(ctx context.Context, req *domain.WorkflowRunReq) e
// 保存执行日志 // 保存执行日志
logs := processor.Log(ctx) logs := processor.Log(ctx)
runLogs := domain.RunLogs(logs) runLogs := domain.WorkflowRunLogs(logs)
runErr := runLogs.Error() runErr := runLogs.FirstError()
succeed := true succeed := true
if runErr != "" { if runErr != "" {
succeed = false succeed = false
} }
log := &domain.WorkflowRunLog{ log := &domain.WorkflowRun{
WorkflowId: workflow.Id, WorkflowId: workflow.Id,
Logs: processor.Log(ctx), Logs: processor.Log(ctx),
Error: runErr, Error: runErr,

View File

@ -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)
})
}

View File

@ -2,7 +2,7 @@
import { getPocketBase } from "./pocketbase"; import { getPocketBase } from "./pocketbase";
const COLLECTION_NAME = "workflow_run_log"; const COLLECTION_NAME = "workflow_run";
export type ListWorkflowRunsRequest = { export type ListWorkflowRunsRequest = {
workflowId: string; workflowId: string;