mirror of
https://github.com/usual2970/certimate.git
synced 2025-06-08 05:29:51 +00:00
refactor: clean code
This commit is contained in:
parent
3e1ecd60a1
commit
ce4c590b1c
@ -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"`
|
||||||
|
@ -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"`
|
||||||
|
@ -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"`
|
||||||
|
@ -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"`
|
||||||
|
@ -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"`
|
||||||
|
@ -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"
|
|
||||||
|
@ -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"`
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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},
|
||||||
|
@ -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},
|
||||||
)
|
)
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
|
|
||||||
// 从数据库删除时,同时移除定时任务
|
// 从数据库删除时,同时移除定时任务
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -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)
|
|
||||||
}
|
}
|
||||||
|
@ -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)
|
|
||||||
}
|
|
@ -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()
|
||||||
|
@ -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);
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user