refactor: clean code

This commit is contained in:
Fu Diwei 2025-01-18 22:18:47 +08:00
parent 3e1ecd60a1
commit ce4c590b1c
20 changed files with 108 additions and 93 deletions

View File

@ -5,6 +5,8 @@ import (
"time" "time"
) )
const CollectionNameAccess = "access"
type Access struct { type Access struct {
Meta Meta
Name string `json:"name" db:"name"` Name string `json:"name" db:"name"`

View File

@ -4,6 +4,8 @@ import (
"github.com/go-acme/lego/v4/registration" "github.com/go-acme/lego/v4/registration"
) )
const CollectionNameAcmeAccount = "acme_accounts"
type AcmeAccount struct { type AcmeAccount struct {
Meta Meta
CA string `json:"ca" db:"ca"` CA string `json:"ca" db:"ca"`

View File

@ -2,12 +2,7 @@ package domain
import "time" import "time"
type CertificateSourceType string const CollectionNameCertificate = "certificate"
const (
CertificateSourceTypeWorkflow = CertificateSourceType("workflow")
CertificateSourceTypeUpload = CertificateSourceType("upload")
)
type Certificate struct { type Certificate struct {
Meta Meta
@ -26,6 +21,13 @@ type Certificate struct {
DeletedAt *time.Time `json:"deleted" db:"deleted"` DeletedAt *time.Time `json:"deleted" db:"deleted"`
} }
type CertificateSourceType string
const (
CertificateSourceTypeWorkflow = CertificateSourceType("workflow")
CertificateSourceTypeUpload = CertificateSourceType("upload")
)
type CertificateArchiveFileReq struct { type CertificateArchiveFileReq struct {
CertificateId string `json:"-"` CertificateId string `json:"-"`
Format string `json:"format"` Format string `json:"format"`

View File

@ -5,6 +5,8 @@ import (
"fmt" "fmt"
) )
const CollectionNameSettings = "settings"
type Settings struct { type Settings struct {
Meta Meta
Name string `json:"name" db:"name"` Name string `json:"name" db:"name"`

View File

@ -6,6 +6,23 @@ import (
"github.com/usual2970/certimate/internal/pkg/utils/maps" "github.com/usual2970/certimate/internal/pkg/utils/maps"
) )
const CollectionNameWorkflow = "workflow"
type Workflow struct {
Meta
Name string `json:"name" db:"name"`
Description string `json:"description" db:"description"`
Trigger WorkflowTriggerType `json:"trigger" db:"trigger"`
TriggerCron string `json:"triggerCron" db:"triggerCron"`
Enabled bool `json:"enabled" db:"enabled"`
Content *WorkflowNode `json:"content" db:"content"`
Draft *WorkflowNode `json:"draft" db:"draft"`
HasDraft bool `json:"hasDraft" db:"hasDraft"`
LastRunId string `json:"lastRunId" db:"lastRunId"`
LastRunStatus WorkflowRunStatusType `json:"lastRunStatus" db:"lastRunStatus"`
LastRunTime time.Time `json:"lastRunTime" db:"lastRunTime"`
}
type WorkflowNodeType string type WorkflowNodeType string
const ( const (
@ -25,25 +42,6 @@ const (
WorkflowTriggerTypeManual = WorkflowTriggerType("manual") WorkflowTriggerTypeManual = WorkflowTriggerType("manual")
) )
type Workflow struct {
Meta
Name string `json:"name" db:"name"`
Description string `json:"description" db:"description"`
Trigger WorkflowTriggerType `json:"trigger" db:"trigger"`
TriggerCron string `json:"triggerCron" db:"triggerCron"`
Enabled bool `json:"enabled" db:"enabled"`
Content *WorkflowNode `json:"content" db:"content"`
Draft *WorkflowNode `json:"draft" db:"draft"`
HasDraft bool `json:"hasDraft" db:"hasDraft"`
LastRunId string `json:"lastRunId" db:"lastRunId"`
LastRunStatus WorkflowRunStatusType `json:"lastRunStatus" db:"lastRunStatus"`
LastRunTime time.Time `json:"lastRunTime" db:"lastRunTime"`
}
func (w *Workflow) Table() string {
return "workflow"
}
type WorkflowNode struct { type WorkflowNode struct {
Id string `json:"id"` Id string `json:"id"`
Type WorkflowNodeType `json:"type"` Type WorkflowNodeType `json:"type"`
@ -151,6 +149,12 @@ type WorkflowNodeIOValueSelector struct {
Name string `json:"name"` Name string `json:"name"`
} }
type WorkflowNodeIONameType = string
const (
WorkflowNodeIONameCertificate WorkflowNodeIONameType = "certificate"
)
type WorkflowRunReq struct { type WorkflowRunReq struct {
WorkflowId string `json:"-"` WorkflowId string `json:"-"`
Trigger WorkflowTriggerType `json:"trigger"` Trigger WorkflowTriggerType `json:"trigger"`

View File

@ -1,5 +1,7 @@
package domain package domain
const CollectionNameWorkflowOutput = "workflow_output"
type WorkflowOutput struct { type WorkflowOutput struct {
Meta Meta
WorkflowId string `json:"workflowId" db:"workflow"` WorkflowId string `json:"workflowId" db:"workflow"`
@ -8,5 +10,3 @@ type WorkflowOutput struct {
Outputs []WorkflowNodeIO `json:"outputs" db:"outputs"` Outputs []WorkflowNodeIO `json:"outputs" db:"outputs"`
Succeeded bool `json:"succeeded" db:"succeeded"` Succeeded bool `json:"succeeded" db:"succeeded"`
} }
const WORKFLOW_OUTPUT_CERTIFICATE = "certificate"

View File

@ -2,14 +2,7 @@ package domain
import "time" import "time"
type WorkflowRunStatusType string const CollectionNameWorkflowRun = "workflow_run"
const (
WorkflowRunStatusTypePending WorkflowRunStatusType = "pending"
WorkflowRunStatusTypeRunning WorkflowRunStatusType = "running"
WorkflowRunStatusTypeSucceeded WorkflowRunStatusType = "succeeded"
WorkflowRunStatusTypeFailed WorkflowRunStatusType = "failed"
)
type WorkflowRun struct { type WorkflowRun struct {
Meta Meta
@ -22,6 +15,15 @@ type WorkflowRun struct {
Error string `json:"error" db:"error"` Error string `json:"error" db:"error"`
} }
type WorkflowRunStatusType string
const (
WorkflowRunStatusTypePending WorkflowRunStatusType = "pending"
WorkflowRunStatusTypeRunning WorkflowRunStatusType = "running"
WorkflowRunStatusTypeSucceeded WorkflowRunStatusType = "succeeded"
WorkflowRunStatusTypeFailed WorkflowRunStatusType = "failed"
)
type WorkflowRunLog struct { type WorkflowRunLog struct {
NodeId string `json:"nodeId"` NodeId string `json:"nodeId"`
NodeName string `json:"nodeName"` NodeName string `json:"nodeName"`

View File

@ -19,7 +19,7 @@ func NewAccessRepository() *AccessRepository {
} }
func (r *AccessRepository) GetById(ctx context.Context, id string) (*domain.Access, error) { func (r *AccessRepository) GetById(ctx context.Context, id string) (*domain.Access, error) {
record, err := app.GetApp().FindRecordById("access", id) record, err := app.GetApp().FindRecordById(domain.CollectionNameAccess, id)
if err != nil { if err != nil {
if errors.Is(err, sql.ErrNoRows) { if errors.Is(err, sql.ErrNoRows) {
return nil, domain.ErrRecordNotFound return nil, domain.ErrRecordNotFound

View File

@ -23,7 +23,7 @@ var g singleflight.Group
func (r *AcmeAccountRepository) GetByCAAndEmail(ca, email string) (*domain.AcmeAccount, error) { func (r *AcmeAccountRepository) GetByCAAndEmail(ca, email string) (*domain.AcmeAccount, error) {
resp, err, _ := g.Do(fmt.Sprintf("acme_account_%s_%s", ca, email), func() (interface{}, error) { resp, err, _ := g.Do(fmt.Sprintf("acme_account_%s_%s", ca, email), func() (interface{}, error) {
resp, err := app.GetApp().FindFirstRecordByFilter( resp, err := app.GetApp().FindFirstRecordByFilter(
"acme_accounts", domain.CollectionNameAcmeAccount,
"ca={:ca} && email={:email}", "ca={:ca} && email={:email}",
dbx.Params{"ca": ca, "email": email}, dbx.Params{"ca": ca, "email": email},
) )
@ -49,7 +49,7 @@ func (r *AcmeAccountRepository) GetByCAAndEmail(ca, email string) (*domain.AcmeA
} }
func (r *AcmeAccountRepository) Save(ca, email, key string, resource *registration.Resource) error { func (r *AcmeAccountRepository) Save(ca, email, key string, resource *registration.Resource) error {
collection, err := app.GetApp().FindCollectionByNameOrId("acme_accounts") collection, err := app.GetApp().FindCollectionByNameOrId(domain.CollectionNameAcmeAccount)
if err != nil { if err != nil {
return err return err
} }

View File

@ -20,7 +20,7 @@ func NewCertificateRepository() *CertificateRepository {
func (r *CertificateRepository) ListExpireSoon(ctx context.Context) ([]*domain.Certificate, error) { func (r *CertificateRepository) ListExpireSoon(ctx context.Context) ([]*domain.Certificate, error) {
records, err := app.GetApp().FindRecordsByFilter( records, err := app.GetApp().FindRecordsByFilter(
"certificate", domain.CollectionNameCertificate,
"expireAt>DATETIME('now') && expireAt<DATETIME('now', '+20 days') && deleted=null", "expireAt>DATETIME('now') && expireAt<DATETIME('now', '+20 days') && deleted=null",
"-created", "-created",
0, 0, 0, 0,
@ -43,7 +43,7 @@ func (r *CertificateRepository) ListExpireSoon(ctx context.Context) ([]*domain.C
} }
func (r *CertificateRepository) GetById(ctx context.Context, id string) (*domain.Certificate, error) { func (r *CertificateRepository) GetById(ctx context.Context, id string) (*domain.Certificate, error) {
record, err := app.GetApp().FindRecordById("certificate", id) record, err := app.GetApp().FindRecordById(domain.CollectionNameCertificate, id)
if err != nil { if err != nil {
if errors.Is(err, sql.ErrNoRows) { if errors.Is(err, sql.ErrNoRows) {
return nil, domain.ErrRecordNotFound return nil, domain.ErrRecordNotFound
@ -60,7 +60,7 @@ func (r *CertificateRepository) GetById(ctx context.Context, id string) (*domain
func (r *CertificateRepository) GetByWorkflowNodeId(ctx context.Context, workflowNodeId string) (*domain.Certificate, error) { func (r *CertificateRepository) GetByWorkflowNodeId(ctx context.Context, workflowNodeId string) (*domain.Certificate, error) {
records, err := app.GetApp().FindRecordsByFilter( records, err := app.GetApp().FindRecordsByFilter(
"certificate", domain.CollectionNameCertificate,
"workflowNodeId={:workflowNodeId} && deleted=null", "workflowNodeId={:workflowNodeId} && deleted=null",
"-created", 1, 0, "-created", 1, 0,
dbx.Params{"workflowNodeId": workflowNodeId}, dbx.Params{"workflowNodeId": workflowNodeId},

View File

@ -18,7 +18,7 @@ func NewSettingsRepository() *SettingsRepository {
func (r *SettingsRepository) GetByName(ctx context.Context, name string) (*domain.Settings, error) { func (r *SettingsRepository) GetByName(ctx context.Context, name string) (*domain.Settings, error) {
record, err := app.GetApp().FindFirstRecordByFilter( record, err := app.GetApp().FindFirstRecordByFilter(
"settings", domain.CollectionNameSettings,
"name={:name}", "name={:name}",
dbx.Params{"name": name}, dbx.Params{"name": name},
) )

View File

@ -20,7 +20,7 @@ func NewWorkflowRepository() *WorkflowRepository {
func (r *WorkflowRepository) ListEnabledAuto(ctx context.Context) ([]*domain.Workflow, error) { func (r *WorkflowRepository) ListEnabledAuto(ctx context.Context) ([]*domain.Workflow, error) {
records, err := app.GetApp().FindRecordsByFilter( records, err := app.GetApp().FindRecordsByFilter(
"workflow", domain.CollectionNameWorkflow,
"enabled={:enabled} && trigger={:trigger}", "enabled={:enabled} && trigger={:trigger}",
"-created", "-created",
0, 0, 0, 0,
@ -44,7 +44,7 @@ func (r *WorkflowRepository) ListEnabledAuto(ctx context.Context) ([]*domain.Wor
} }
func (r *WorkflowRepository) GetById(ctx context.Context, id string) (*domain.Workflow, error) { func (r *WorkflowRepository) GetById(ctx context.Context, id string) (*domain.Workflow, error) {
record, err := app.GetApp().FindRecordById("workflow", id) record, err := app.GetApp().FindRecordById(domain.CollectionNameWorkflow, id)
if err != nil { if err != nil {
if errors.Is(err, sql.ErrNoRows) { if errors.Is(err, sql.ErrNoRows) {
return nil, domain.ErrRecordNotFound return nil, domain.ErrRecordNotFound
@ -56,7 +56,7 @@ func (r *WorkflowRepository) GetById(ctx context.Context, id string) (*domain.Wo
} }
func (r *WorkflowRepository) Save(ctx context.Context, workflow *domain.Workflow) error { func (r *WorkflowRepository) Save(ctx context.Context, workflow *domain.Workflow) error {
collection, err := app.GetApp().FindCollectionByNameOrId(workflow.Table()) collection, err := app.GetApp().FindCollectionByNameOrId(domain.CollectionNameWorkflow)
if err != nil { if err != nil {
return err return err
} }
@ -65,7 +65,7 @@ func (r *WorkflowRepository) Save(ctx context.Context, workflow *domain.Workflow
if workflow.Id == "" { if workflow.Id == "" {
record = core.NewRecord(collection) record = core.NewRecord(collection)
} else { } else {
record, err = app.GetApp().FindRecordById(workflow.Table(), workflow.Id) record, err = app.GetApp().FindRecordById(domain.CollectionNameWorkflow, workflow.Id)
if err != nil { if err != nil {
if errors.Is(err, sql.ErrNoRows) { if errors.Is(err, sql.ErrNoRows) {
return domain.ErrRecordNotFound return domain.ErrRecordNotFound
@ -90,7 +90,7 @@ func (r *WorkflowRepository) Save(ctx context.Context, workflow *domain.Workflow
} }
func (r *WorkflowRepository) SaveRun(ctx context.Context, workflowRun *domain.WorkflowRun) error { func (r *WorkflowRepository) SaveRun(ctx context.Context, workflowRun *domain.WorkflowRun) error {
collection, err := app.GetApp().FindCollectionByNameOrId("workflow_run") collection, err := app.GetApp().FindCollectionByNameOrId(domain.CollectionNameWorkflowRun)
if err != nil { if err != nil {
return err return err
} }
@ -109,7 +109,7 @@ func (r *WorkflowRepository) SaveRun(ctx context.Context, workflowRun *domain.Wo
return err return err
} }
workflowRecord, err := txApp.FindRecordById("workflow", workflowRun.WorkflowId) workflowRecord, err := txApp.FindRecordById(domain.CollectionNameWorkflow, workflowRun.WorkflowId)
if err != nil { if err != nil {
return err return err
} }

View File

@ -19,7 +19,7 @@ func NewWorkflowOutputRepository() *WorkflowOutputRepository {
func (r *WorkflowOutputRepository) GetByNodeId(ctx context.Context, nodeId string) (*domain.WorkflowOutput, error) { func (r *WorkflowOutputRepository) GetByNodeId(ctx context.Context, nodeId string) (*domain.WorkflowOutput, error) {
records, err := app.GetApp().FindRecordsByFilter( records, err := app.GetApp().FindRecordsByFilter(
"workflow_output", domain.CollectionNameWorkflowOutput,
"nodeId={:nodeId}", "nodeId={:nodeId}",
"-created", "-created",
1, 0, 1, 0,
@ -68,13 +68,13 @@ func (r *WorkflowOutputRepository) Save(ctx context.Context, output *domain.Work
var err error var err error
if output.Id == "" { if output.Id == "" {
collection, err := app.GetApp().FindCollectionByNameOrId("workflow_output") collection, err := app.GetApp().FindCollectionByNameOrId(domain.CollectionNameWorkflowOutput)
if err != nil { if err != nil {
return err return err
} }
record = core.NewRecord(collection) record = core.NewRecord(collection)
} else { } else {
record, err = app.GetApp().FindRecordById("workflow_output", output.Id) record, err = app.GetApp().FindRecordById(domain.CollectionNameWorkflowOutput, output.Id)
if err != nil { if err != nil {
return err return err
} }
@ -94,7 +94,7 @@ func (r *WorkflowOutputRepository) Save(ctx context.Context, output *domain.Work
return err return err
} }
certCollection, err := app.GetApp().FindCollectionByNameOrId("certificate") certCollection, err := app.GetApp().FindCollectionByNameOrId(domain.CollectionNameCertificate)
if err != nil { if err != nil {
return err return err
} }
@ -119,7 +119,7 @@ func (r *WorkflowOutputRepository) Save(ctx context.Context, output *domain.Work
// 更新 certificate // 更新 certificate
for i, item := range output.Outputs { for i, item := range output.Outputs {
if item.Name == domain.WORKFLOW_OUTPUT_CERTIFICATE { if item.Name == string(domain.WorkflowNodeIONameCertificate) {
output.Outputs[i].Value = certRecord.Id output.Outputs[i].Value = certRecord.Id
break break
} }

View File

@ -12,37 +12,35 @@ import (
) )
func Register() { func Register() {
const tableName = "workflow"
app := app.GetApp() app := app.GetApp()
app.OnRecordCreateRequest(tableName).BindFunc(func(e *core.RecordRequestEvent) error { app.OnRecordCreateRequest(domain.CollectionNameWorkflow).BindFunc(func(e *core.RecordRequestEvent) error {
if err := e.Next(); err != nil { if err := e.Next(); err != nil {
return err return err
} }
if err := update(e.Request.Context(), e.Record); err != nil { if err := onWorkflowRecordCreateOrUpdate(e.Request.Context(), e.Record); err != nil {
return err return err
} }
return nil return nil
}) })
app.OnRecordUpdateRequest(tableName).BindFunc(func(e *core.RecordRequestEvent) error { app.OnRecordUpdateRequest(domain.CollectionNameWorkflow).BindFunc(func(e *core.RecordRequestEvent) error {
if err := e.Next(); err != nil { if err := e.Next(); err != nil {
return err return err
} }
if err := update(e.Request.Context(), e.Record); err != nil { if err := onWorkflowRecordCreateOrUpdate(e.Request.Context(), e.Record); err != nil {
return err return err
} }
return nil return nil
}) })
app.OnRecordDeleteRequest(tableName).BindFunc(func(e *core.RecordRequestEvent) error { app.OnRecordDeleteRequest(domain.CollectionNameWorkflow).BindFunc(func(e *core.RecordRequestEvent) error {
if err := e.Next(); err != nil { if err := e.Next(); err != nil {
return err return err
} }
if err := delete(e.Request.Context(), e.Record); err != nil { if err := onWorkflowRecordDelete(e.Request.Context(), e.Record); err != nil {
return err return err
} }
@ -50,7 +48,7 @@ func Register() {
}) })
} }
func update(ctx context.Context, record *core.Record) error { func onWorkflowRecordCreateOrUpdate(ctx context.Context, record *core.Record) error {
scheduler := app.GetScheduler() scheduler := app.GetScheduler()
// 向数据库插入/更新时,同时更新定时任务 // 向数据库插入/更新时,同时更新定时任务
@ -79,7 +77,7 @@ func update(ctx context.Context, record *core.Record) error {
return nil return nil
} }
func delete(_ context.Context, record *core.Record) error { func onWorkflowRecordDelete(_ context.Context, record *core.Record) error {
scheduler := app.GetScheduler() scheduler := app.GetScheduler()
// 从数据库删除时,同时移除定时任务 // 从数据库删除时,同时移除定时任务

View File

@ -77,14 +77,14 @@ func (a *applyNode) Run(ctx context.Context) error {
ACMECertStableUrl: applyResult.ACMECertStableUrl, ACMECertStableUrl: applyResult.ACMECertStableUrl,
EffectAt: certX509.NotBefore, EffectAt: certX509.NotBefore,
ExpireAt: certX509.NotAfter, ExpireAt: certX509.NotAfter,
WorkflowId: GetWorkflowId(ctx), WorkflowId: getContextWorkflowId(ctx),
WorkflowNodeId: a.node.Id, WorkflowNodeId: a.node.Id,
} }
// 保存执行结果 // 保存执行结果
// TODO: 先保持一个节点始终只有一个输出,后续增加版本控制 // TODO: 先保持一个节点始终只有一个输出,后续增加版本控制
currentOutput := &domain.WorkflowOutput{ currentOutput := &domain.WorkflowOutput{
WorkflowId: GetWorkflowId(ctx), WorkflowId: getContextWorkflowId(ctx),
NodeId: a.node.Id, NodeId: a.node.Id,
Node: a.node, Node: a.node,
Succeeded: true, Succeeded: true,

View File

@ -81,7 +81,7 @@ func (d *deployNode) Run(ctx context.Context) error {
// TODO: 先保持一个节点始终只有一个输出,后续增加版本控制 // TODO: 先保持一个节点始终只有一个输出,后续增加版本控制
currentOutput := &domain.WorkflowOutput{ currentOutput := &domain.WorkflowOutput{
Meta: domain.Meta{}, Meta: domain.Meta{},
WorkflowId: GetWorkflowId(ctx), WorkflowId: getContextWorkflowId(ctx),
NodeId: d.node.Id, NodeId: d.node.Id,
Node: d.node, Node: d.node,
Succeeded: true, Succeeded: true,

View File

@ -18,6 +18,19 @@ type nodeLogger struct {
log *domain.WorkflowRunLog log *domain.WorkflowRunLog
} }
type certificateRepository interface {
GetByWorkflowNodeId(ctx context.Context, workflowNodeId string) (*domain.Certificate, error)
}
type workflowOutputRepository interface {
GetByNodeId(ctx context.Context, nodeId string) (*domain.WorkflowOutput, error)
Save(ctx context.Context, output *domain.WorkflowOutput, certificate *domain.Certificate, cb func(id string) error) error
}
type settingsRepository interface {
GetByName(ctx context.Context, name string) (*domain.Settings, error)
}
func NewNodeLogger(node *domain.WorkflowNode) *nodeLogger { func NewNodeLogger(node *domain.WorkflowNode) *nodeLogger {
return &nodeLogger{ return &nodeLogger{
log: &domain.WorkflowRunLog{ log: &domain.WorkflowRunLog{
@ -61,15 +74,6 @@ func GetProcessor(node *domain.WorkflowNode) (nodeProcessor, error) {
return nil, errors.New("not implemented") return nil, errors.New("not implemented")
} }
type certificateRepository interface { func getContextWorkflowId(ctx context.Context) string {
GetByWorkflowNodeId(ctx context.Context, workflowNodeId string) (*domain.Certificate, error) return ctx.Value("workflow_id").(string)
}
type workflowOutputRepository interface {
GetByNodeId(ctx context.Context, nodeId string) (*domain.WorkflowOutput, error)
Save(ctx context.Context, output *domain.WorkflowOutput, certificate *domain.Certificate, cb func(id string) error) error
}
type settingsRepository interface {
GetByName(ctx context.Context, name string) (*domain.Settings, error)
} }

View File

@ -1,9 +1,10 @@
package nodeprocessor package processor
import ( import (
"context" "context"
"github.com/usual2970/certimate/internal/domain" "github.com/usual2970/certimate/internal/domain"
nodes "github.com/usual2970/certimate/internal/workflow/node-processor"
) )
type workflowProcessor struct { type workflowProcessor struct {
@ -23,23 +24,23 @@ func (w *workflowProcessor) Log(ctx context.Context) []domain.WorkflowRunLog {
} }
func (w *workflowProcessor) Run(ctx context.Context) error { func (w *workflowProcessor) Run(ctx context.Context) error {
ctx = WithWorkflowId(ctx, w.workflow.Id) ctx = setContextWorkflowId(ctx, w.workflow.Id)
return w.runNode(ctx, w.workflow.Content) return w.processNode(ctx, w.workflow.Content)
} }
func (w *workflowProcessor) runNode(ctx context.Context, node *domain.WorkflowNode) error { func (w *workflowProcessor) processNode(ctx context.Context, node *domain.WorkflowNode) error {
current := node current := node
for current != nil { for current != nil {
if current.Type == domain.WorkflowNodeTypeBranch { if current.Type == domain.WorkflowNodeTypeBranch {
for _, branch := range current.Branches { for _, branch := range current.Branches {
if err := w.runNode(ctx, &branch); err != nil { if err := w.processNode(ctx, &branch); err != nil {
continue continue
} }
} }
} }
if current.Type != domain.WorkflowNodeTypeBranch { if current.Type != domain.WorkflowNodeTypeBranch {
processor, err := GetProcessor(current) processor, err := nodes.GetProcessor(current)
if err != nil { if err != nil {
return err return err
} }
@ -61,10 +62,6 @@ func (w *workflowProcessor) runNode(ctx context.Context, node *domain.WorkflowNo
return nil return nil
} }
func WithWorkflowId(ctx context.Context, id string) context.Context { func setContextWorkflowId(ctx context.Context, id string) context.Context {
return context.WithValue(ctx, "workflow_id", id) return context.WithValue(ctx, "workflow_id", id)
} }
func GetWorkflowId(ctx context.Context) string {
return ctx.Value("workflow_id").(string)
}

View File

@ -9,7 +9,7 @@ import (
"github.com/usual2970/certimate/internal/app" "github.com/usual2970/certimate/internal/app"
"github.com/usual2970/certimate/internal/domain" "github.com/usual2970/certimate/internal/domain"
nodeprocessor "github.com/usual2970/certimate/internal/workflow/node-processor" processor "github.com/usual2970/certimate/internal/workflow/processor"
) )
const defaultRoutines = 10 const defaultRoutines = 10
@ -129,7 +129,7 @@ func (s *WorkflowService) run(ctx context.Context, runData *workflowRunData) err
StartedAt: time.Now(), StartedAt: time.Now(),
EndedAt: time.Now(), EndedAt: time.Now(),
} }
processor := nodeprocessor.NewWorkflowProcessor(workflow) processor := processor.NewWorkflowProcessor(workflow)
if err := processor.Run(ctx); err != nil { if err := processor.Run(ctx); err != nil {
run.Status = domain.WorkflowRunStatusTypeFailed run.Status = domain.WorkflowRunStatusTypeFailed
run.EndedAt = time.Now() run.EndedAt = time.Now()

View File

@ -3,9 +3,11 @@ import { ClientResponseError } from "pocketbase";
import { type SettingsModel, type SettingsNames } from "@/domain/settings"; import { type SettingsModel, type SettingsNames } from "@/domain/settings";
import { getPocketBase } from "./_pocketbase"; import { getPocketBase } from "./_pocketbase";
const COLLECTION_NAME = "settings";
export const get = async <T extends NonNullable<unknown>>(name: SettingsNames) => { export const get = async <T extends NonNullable<unknown>>(name: SettingsNames) => {
try { try {
const resp = await getPocketBase().collection("settings").getFirstListItem<SettingsModel<T>>(`name='${name}'`, { const resp = await getPocketBase().collection(COLLECTION_NAME).getFirstListItem<SettingsModel<T>>(`name='${name}'`, {
requestKey: null, requestKey: null,
}); });
return resp; return resp;
@ -23,8 +25,8 @@ export const get = async <T extends NonNullable<unknown>>(name: SettingsNames) =
export const save = async <T extends NonNullable<unknown>>(record: MaybeModelRecordWithId<SettingsModel<T>>) => { export const save = async <T extends NonNullable<unknown>>(record: MaybeModelRecordWithId<SettingsModel<T>>) => {
if (record.id) { if (record.id) {
return await getPocketBase().collection("settings").update<SettingsModel<T>>(record.id, record); return await getPocketBase().collection(COLLECTION_NAME).update<SettingsModel<T>>(record.id, record);
} }
return await getPocketBase().collection("settings").create<SettingsModel<T>>(record); return await getPocketBase().collection(COLLECTION_NAME).create<SettingsModel<T>>(record);
}; };