mirror of
https://github.com/oarkflow/mq.git
synced 2025-10-05 16:06:55 +08:00
update
This commit is contained in:
538
workflow/types.go
Normal file
538
workflow/types.go
Normal file
@@ -0,0 +1,538 @@
|
||||
package workflow
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
)
|
||||
|
||||
// Core types
|
||||
type (
|
||||
WorkflowStatus string
|
||||
ExecutionStatus string
|
||||
NodeType string
|
||||
Priority string
|
||||
UserRole string
|
||||
PermissionAction string
|
||||
MiddlewareType string
|
||||
)
|
||||
|
||||
// User and security types
|
||||
type User struct {
|
||||
ID string `json:"id"`
|
||||
Username string `json:"username"`
|
||||
Email string `json:"email"`
|
||||
Role UserRole `json:"role"`
|
||||
Permissions []string `json:"permissions"`
|
||||
Metadata map[string]string `json:"metadata"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
type AuthContext struct {
|
||||
User *User `json:"user"`
|
||||
SessionID string `json:"session_id"`
|
||||
Token string `json:"token"`
|
||||
Permissions []string `json:"permissions"`
|
||||
Metadata map[string]string `json:"metadata"`
|
||||
}
|
||||
|
||||
type Permission struct {
|
||||
ID string `json:"id"`
|
||||
Resource string `json:"resource"`
|
||||
Action PermissionAction `json:"action"`
|
||||
Scope string `json:"scope"`
|
||||
}
|
||||
|
||||
// Middleware types
|
||||
type Middleware struct {
|
||||
ID string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Type MiddlewareType `json:"type"`
|
||||
Priority int `json:"priority"`
|
||||
Config map[string]interface{} `json:"config"`
|
||||
Enabled bool `json:"enabled"`
|
||||
}
|
||||
|
||||
type MiddlewareResult struct {
|
||||
Continue bool `json:"continue"`
|
||||
Error error `json:"error"`
|
||||
Data map[string]interface{} `json:"data"`
|
||||
Headers map[string]string `json:"headers"`
|
||||
}
|
||||
|
||||
// Webhook and callback types
|
||||
type WebhookConfig struct {
|
||||
URL string `json:"url"`
|
||||
Method string `json:"method"`
|
||||
Headers map[string]string `json:"headers"`
|
||||
Secret string `json:"secret"`
|
||||
Timeout time.Duration `json:"timeout"`
|
||||
RetryPolicy *RetryPolicy `json:"retry_policy"`
|
||||
}
|
||||
|
||||
type WebhookReceiver struct {
|
||||
ID string `json:"id"`
|
||||
Path string `json:"path"`
|
||||
Method string `json:"method"`
|
||||
Secret string `json:"secret"`
|
||||
Handler string `json:"handler"`
|
||||
Config map[string]interface{} `json:"config"`
|
||||
Middlewares []string `json:"middlewares"`
|
||||
}
|
||||
|
||||
type CallbackData struct {
|
||||
ID string `json:"id"`
|
||||
WorkflowID string `json:"workflow_id"`
|
||||
ExecutionID string `json:"execution_id"`
|
||||
NodeID string `json:"node_id"`
|
||||
Data map[string]interface{} `json:"data"`
|
||||
Headers map[string]string `json:"headers"`
|
||||
Timestamp time.Time `json:"timestamp"`
|
||||
}
|
||||
|
||||
const (
|
||||
// Workflow statuses
|
||||
WorkflowStatusDraft WorkflowStatus = "draft"
|
||||
WorkflowStatusActive WorkflowStatus = "active"
|
||||
WorkflowStatusInactive WorkflowStatus = "inactive"
|
||||
WorkflowStatusDeprecated WorkflowStatus = "deprecated"
|
||||
|
||||
// Execution statuses
|
||||
ExecutionStatusPending ExecutionStatus = "pending"
|
||||
ExecutionStatusRunning ExecutionStatus = "running"
|
||||
ExecutionStatusCompleted ExecutionStatus = "completed"
|
||||
ExecutionStatusFailed ExecutionStatus = "failed"
|
||||
ExecutionStatusCancelled ExecutionStatus = "cancelled"
|
||||
ExecutionStatusSuspended ExecutionStatus = "suspended"
|
||||
|
||||
// Node types
|
||||
NodeTypeTask NodeType = "task"
|
||||
NodeTypeAPI NodeType = "api"
|
||||
NodeTypeTransform NodeType = "transform"
|
||||
NodeTypeDecision NodeType = "decision"
|
||||
NodeTypeHumanTask NodeType = "human_task"
|
||||
NodeTypeTimer NodeType = "timer"
|
||||
NodeTypeLoop NodeType = "loop"
|
||||
NodeTypeParallel NodeType = "parallel"
|
||||
NodeTypeDatabase NodeType = "database"
|
||||
NodeTypeEmail NodeType = "email"
|
||||
NodeTypeWebhook NodeType = "webhook"
|
||||
NodeTypeSubDAG NodeType = "sub_dag"
|
||||
NodeTypeHTML NodeType = "html"
|
||||
NodeTypeSMS NodeType = "sms"
|
||||
NodeTypeAuth NodeType = "auth"
|
||||
NodeTypeValidator NodeType = "validator"
|
||||
NodeTypeRouter NodeType = "router"
|
||||
NodeTypeNotify NodeType = "notify"
|
||||
NodeTypeStorage NodeType = "storage"
|
||||
NodeTypeWebhookRx NodeType = "webhook_receiver"
|
||||
|
||||
// Priorities
|
||||
PriorityLow Priority = "low"
|
||||
PriorityMedium Priority = "medium"
|
||||
PriorityHigh Priority = "high"
|
||||
PriorityCritical Priority = "critical"
|
||||
|
||||
// User roles
|
||||
UserRoleAdmin UserRole = "admin"
|
||||
UserRoleManager UserRole = "manager"
|
||||
UserRoleOperator UserRole = "operator"
|
||||
UserRoleViewer UserRole = "viewer"
|
||||
UserRoleGuest UserRole = "guest"
|
||||
|
||||
// Permission actions
|
||||
PermissionRead PermissionAction = "read"
|
||||
PermissionWrite PermissionAction = "write"
|
||||
PermissionExecute PermissionAction = "execute"
|
||||
PermissionDelete PermissionAction = "delete"
|
||||
PermissionAdmin PermissionAction = "admin"
|
||||
|
||||
// Middleware types
|
||||
MiddlewareAuth MiddlewareType = "auth"
|
||||
MiddlewareLogging MiddlewareType = "logging"
|
||||
MiddlewareRateLimit MiddlewareType = "rate_limit"
|
||||
MiddlewareValidate MiddlewareType = "validate"
|
||||
MiddlewareTransform MiddlewareType = "transform"
|
||||
MiddlewareCustom MiddlewareType = "custom"
|
||||
)
|
||||
|
||||
// WorkflowDefinition represents a complete workflow
|
||||
type WorkflowDefinition struct {
|
||||
ID string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Description string `json:"description"`
|
||||
Version string `json:"version"`
|
||||
Status WorkflowStatus `json:"status"`
|
||||
Tags []string `json:"tags"`
|
||||
Category string `json:"category"`
|
||||
Owner string `json:"owner"`
|
||||
Nodes []WorkflowNode `json:"nodes"`
|
||||
Edges []WorkflowEdge `json:"edges"`
|
||||
Variables map[string]Variable `json:"variables"`
|
||||
Config WorkflowConfig `json:"config"`
|
||||
Metadata map[string]interface{} `json:"metadata"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
CreatedBy string `json:"created_by"`
|
||||
UpdatedBy string `json:"updated_by"`
|
||||
}
|
||||
|
||||
// WorkflowNode represents a single node in the workflow
|
||||
type WorkflowNode struct {
|
||||
ID string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Type NodeType `json:"type"`
|
||||
Description string `json:"description"`
|
||||
Config NodeConfig `json:"config"`
|
||||
Position Position `json:"position"`
|
||||
Timeout *time.Duration `json:"timeout,omitempty"`
|
||||
RetryPolicy *RetryPolicy `json:"retry_policy,omitempty"`
|
||||
Metadata map[string]interface{} `json:"metadata,omitempty"`
|
||||
}
|
||||
|
||||
// NodeConfig holds configuration for different node types
|
||||
type NodeConfig struct {
|
||||
// Common fields
|
||||
Script string `json:"script,omitempty"`
|
||||
Command string `json:"command,omitempty"`
|
||||
Variables map[string]string `json:"variables,omitempty"`
|
||||
|
||||
// API node fields
|
||||
URL string `json:"url,omitempty"`
|
||||
Method string `json:"method,omitempty"`
|
||||
Headers map[string]string `json:"headers,omitempty"`
|
||||
|
||||
// Transform node fields
|
||||
TransformType string `json:"transform_type,omitempty"`
|
||||
Expression string `json:"expression,omitempty"`
|
||||
|
||||
// Decision node fields
|
||||
Condition string `json:"condition,omitempty"`
|
||||
DecisionRules []Rule `json:"decision_rules,omitempty"`
|
||||
|
||||
// Timer node fields
|
||||
Duration time.Duration `json:"duration,omitempty"`
|
||||
Schedule string `json:"schedule,omitempty"`
|
||||
|
||||
// Database node fields
|
||||
Query string `json:"query,omitempty"`
|
||||
Connection string `json:"connection,omitempty"`
|
||||
|
||||
// Email node fields
|
||||
EmailTo []string `json:"email_to,omitempty"`
|
||||
Subject string `json:"subject,omitempty"`
|
||||
Body string `json:"body,omitempty"`
|
||||
|
||||
// Sub-DAG node fields
|
||||
SubWorkflowID string `json:"sub_workflow_id,omitempty"`
|
||||
InputMapping map[string]string `json:"input_mapping,omitempty"`
|
||||
OutputMapping map[string]string `json:"output_mapping,omitempty"`
|
||||
|
||||
// HTML node fields
|
||||
Template string `json:"template,omitempty"`
|
||||
TemplateData map[string]string `json:"template_data,omitempty"`
|
||||
OutputPath string `json:"output_path,omitempty"`
|
||||
|
||||
// SMS node fields
|
||||
Provider string `json:"provider,omitempty"`
|
||||
From string `json:"from,omitempty"`
|
||||
SMSTo []string `json:"sms_to,omitempty"`
|
||||
Message string `json:"message,omitempty"`
|
||||
MessageType string `json:"message_type,omitempty"`
|
||||
|
||||
// Auth node fields
|
||||
AuthType string `json:"auth_type,omitempty"`
|
||||
Credentials map[string]string `json:"credentials,omitempty"`
|
||||
TokenExpiry time.Duration `json:"token_expiry,omitempty"`
|
||||
|
||||
// Validator node fields
|
||||
ValidationType string `json:"validation_type,omitempty"`
|
||||
ValidationRules []ValidationRule `json:"validation_rules,omitempty"`
|
||||
|
||||
// Router node fields
|
||||
RoutingRules []RoutingRule `json:"routing_rules,omitempty"`
|
||||
DefaultRoute string `json:"default_route,omitempty"`
|
||||
|
||||
// Storage node fields
|
||||
StorageType string `json:"storage_type,omitempty"`
|
||||
StorageOperation string `json:"storage_operation,omitempty"`
|
||||
StorageKey string `json:"storage_key,omitempty"`
|
||||
StoragePath string `json:"storage_path,omitempty"`
|
||||
StorageConfig map[string]string `json:"storage_config,omitempty"`
|
||||
|
||||
// Notification node fields
|
||||
NotifyType string `json:"notify_type,omitempty"`
|
||||
NotificationType string `json:"notification_type,omitempty"`
|
||||
NotificationRecipients []string `json:"notification_recipients,omitempty"`
|
||||
NotificationMessage string `json:"notification_message,omitempty"`
|
||||
Recipients []string `json:"recipients,omitempty"`
|
||||
Channel string `json:"channel,omitempty"`
|
||||
|
||||
// Webhook receiver fields
|
||||
ListenPath string `json:"listen_path,omitempty"`
|
||||
Secret string `json:"secret,omitempty"`
|
||||
WebhookSecret string `json:"webhook_secret,omitempty"`
|
||||
WebhookSignature string `json:"webhook_signature,omitempty"`
|
||||
WebhookTransforms map[string]interface{} `json:"webhook_transforms,omitempty"`
|
||||
Timeout time.Duration `json:"timeout,omitempty"`
|
||||
|
||||
// Custom configuration
|
||||
Custom map[string]interface{} `json:"custom,omitempty"`
|
||||
}
|
||||
|
||||
// ValidationRule for validator nodes
|
||||
type ValidationRule struct {
|
||||
Field string `json:"field"`
|
||||
Type string `json:"type"` // "string", "number", "email", "regex", "required"
|
||||
Required bool `json:"required"`
|
||||
MinLength int `json:"min_length,omitempty"`
|
||||
MaxLength int `json:"max_length,omitempty"`
|
||||
Min *float64 `json:"min,omitempty"`
|
||||
Max *float64 `json:"max,omitempty"`
|
||||
Pattern string `json:"pattern,omitempty"`
|
||||
Value interface{} `json:"value,omitempty"`
|
||||
Message string `json:"message,omitempty"`
|
||||
}
|
||||
|
||||
// RoutingRule for router nodes
|
||||
type RoutingRule struct {
|
||||
Condition string `json:"condition"`
|
||||
Destination string `json:"destination"`
|
||||
Priority int `json:"priority"`
|
||||
Weight int `json:"weight"`
|
||||
IsDefault bool `json:"is_default"`
|
||||
}
|
||||
|
||||
// Rule for decision nodes
|
||||
type Rule struct {
|
||||
Condition string `json:"condition"`
|
||||
Output interface{} `json:"output"`
|
||||
NextNode string `json:"next_node,omitempty"`
|
||||
}
|
||||
|
||||
// WorkflowEdge represents a connection between nodes
|
||||
type WorkflowEdge struct {
|
||||
ID string `json:"id"`
|
||||
FromNode string `json:"from_node"`
|
||||
ToNode string `json:"to_node"`
|
||||
Condition string `json:"condition,omitempty"`
|
||||
Priority int `json:"priority"`
|
||||
Label string `json:"label,omitempty"`
|
||||
Metadata map[string]interface{} `json:"metadata,omitempty"`
|
||||
}
|
||||
|
||||
// Variable definition for workflow
|
||||
type Variable struct {
|
||||
Name string `json:"name"`
|
||||
Type string `json:"type"`
|
||||
DefaultValue interface{} `json:"default_value"`
|
||||
Required bool `json:"required"`
|
||||
Description string `json:"description"`
|
||||
}
|
||||
|
||||
// WorkflowConfig holds configuration for the entire workflow
|
||||
type WorkflowConfig struct {
|
||||
Timeout *time.Duration `json:"timeout,omitempty"`
|
||||
MaxRetries int `json:"max_retries"`
|
||||
Priority Priority `json:"priority"`
|
||||
Concurrency int `json:"concurrency"`
|
||||
EnableAudit bool `json:"enable_audit"`
|
||||
EnableMetrics bool `json:"enable_metrics"`
|
||||
Notifications []string `json:"notifications"`
|
||||
ErrorHandling ErrorHandling `json:"error_handling"`
|
||||
}
|
||||
|
||||
// ErrorHandling configuration
|
||||
type ErrorHandling struct {
|
||||
OnFailure string `json:"on_failure"` // "stop", "continue", "retry"
|
||||
MaxErrors int `json:"max_errors"`
|
||||
Rollback bool `json:"rollback"`
|
||||
}
|
||||
|
||||
// Execution represents a workflow execution instance
|
||||
type Execution struct {
|
||||
ID string `json:"id"`
|
||||
WorkflowID string `json:"workflow_id"`
|
||||
WorkflowVersion string `json:"workflow_version"`
|
||||
Status ExecutionStatus `json:"status"`
|
||||
Input map[string]interface{} `json:"input"`
|
||||
Output map[string]interface{} `json:"output"`
|
||||
Context ExecutionContext `json:"context"`
|
||||
CurrentNode string `json:"current_node"`
|
||||
ExecutedNodes []ExecutedNode `json:"executed_nodes"`
|
||||
Error string `json:"error,omitempty"`
|
||||
StartedAt time.Time `json:"started_at"`
|
||||
CompletedAt *time.Time `json:"completed_at,omitempty"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
Priority Priority `json:"priority"`
|
||||
Owner string `json:"owner"`
|
||||
TriggeredBy string `json:"triggered_by"`
|
||||
ParentExecution string `json:"parent_execution,omitempty"`
|
||||
}
|
||||
|
||||
// ExecutionContext holds runtime context
|
||||
type ExecutionContext struct {
|
||||
Variables map[string]interface{} `json:"variables"`
|
||||
Secrets map[string]string `json:"secrets,omitempty"`
|
||||
Metadata map[string]interface{} `json:"metadata"`
|
||||
Trace []TraceEntry `json:"trace"`
|
||||
Checkpoints []Checkpoint `json:"checkpoints"`
|
||||
}
|
||||
|
||||
// TraceEntry for execution tracing
|
||||
type TraceEntry struct {
|
||||
Timestamp time.Time `json:"timestamp"`
|
||||
NodeID string `json:"node_id"`
|
||||
Event string `json:"event"`
|
||||
Data interface{} `json:"data,omitempty"`
|
||||
}
|
||||
|
||||
// Checkpoint for execution recovery
|
||||
type Checkpoint struct {
|
||||
ID string `json:"id"`
|
||||
NodeID string `json:"node_id"`
|
||||
Timestamp time.Time `json:"timestamp"`
|
||||
State map[string]interface{} `json:"state"`
|
||||
}
|
||||
|
||||
// ExecutedNode tracks execution of individual nodes
|
||||
type ExecutedNode struct {
|
||||
NodeID string `json:"node_id"`
|
||||
Status ExecutionStatus `json:"status"`
|
||||
Input map[string]interface{} `json:"input"`
|
||||
Output map[string]interface{} `json:"output"`
|
||||
Error string `json:"error,omitempty"`
|
||||
StartedAt time.Time `json:"started_at"`
|
||||
CompletedAt *time.Time `json:"completed_at,omitempty"`
|
||||
Duration time.Duration `json:"duration"`
|
||||
RetryCount int `json:"retry_count"`
|
||||
Logs []LogEntry `json:"logs"`
|
||||
}
|
||||
|
||||
// LogEntry for node execution logs
|
||||
type LogEntry struct {
|
||||
Timestamp time.Time `json:"timestamp"`
|
||||
Level string `json:"level"`
|
||||
Message string `json:"message"`
|
||||
Data interface{} `json:"data,omitempty"`
|
||||
}
|
||||
|
||||
// Supporting types
|
||||
type Position struct {
|
||||
X float64 `json:"x"`
|
||||
Y float64 `json:"y"`
|
||||
}
|
||||
|
||||
type RetryPolicy struct {
|
||||
MaxAttempts int `json:"max_attempts"`
|
||||
Delay time.Duration `json:"delay"`
|
||||
Backoff string `json:"backoff"` // "linear", "exponential", "fixed"
|
||||
MaxDelay time.Duration `json:"max_delay,omitempty"`
|
||||
}
|
||||
|
||||
// Filter types
|
||||
type WorkflowFilter struct {
|
||||
Status []WorkflowStatus `json:"status"`
|
||||
Category []string `json:"category"`
|
||||
Owner []string `json:"owner"`
|
||||
Tags []string `json:"tags"`
|
||||
CreatedFrom *time.Time `json:"created_from"`
|
||||
CreatedTo *time.Time `json:"created_to"`
|
||||
Search string `json:"search"`
|
||||
Limit int `json:"limit"`
|
||||
Offset int `json:"offset"`
|
||||
SortBy string `json:"sort_by"`
|
||||
SortOrder string `json:"sort_order"`
|
||||
}
|
||||
|
||||
type ExecutionFilter struct {
|
||||
WorkflowID []string `json:"workflow_id"`
|
||||
Status []ExecutionStatus `json:"status"`
|
||||
Owner []string `json:"owner"`
|
||||
Priority []Priority `json:"priority"`
|
||||
StartedFrom *time.Time `json:"started_from"`
|
||||
StartedTo *time.Time `json:"started_to"`
|
||||
Limit int `json:"limit"`
|
||||
Offset int `json:"offset"`
|
||||
SortBy string `json:"sort_by"`
|
||||
SortOrder string `json:"sort_order"`
|
||||
}
|
||||
|
||||
type ProcessingContext struct {
|
||||
Node *WorkflowNode
|
||||
Data map[string]interface{}
|
||||
Variables map[string]interface{}
|
||||
User *User
|
||||
Middleware *MiddlewareManager
|
||||
}
|
||||
|
||||
type ProcessingResult struct {
|
||||
Success bool `json:"success"`
|
||||
Data map[string]interface{} `json:"data,omitempty"`
|
||||
Error string `json:"error,omitempty"`
|
||||
Message string `json:"message,omitempty"`
|
||||
}
|
||||
|
||||
// Core interfaces
|
||||
type Processor interface {
|
||||
Process(ctx context.Context, input ProcessingContext) (*ProcessingResult, error)
|
||||
}
|
||||
|
||||
type WorkflowRegistry interface {
|
||||
Store(ctx context.Context, definition *WorkflowDefinition) error
|
||||
Get(ctx context.Context, id string, version string) (*WorkflowDefinition, error)
|
||||
List(ctx context.Context, filter *WorkflowFilter) ([]*WorkflowDefinition, error)
|
||||
Delete(ctx context.Context, id string) error
|
||||
GetVersions(ctx context.Context, id string) ([]string, error)
|
||||
}
|
||||
|
||||
type StateManager interface {
|
||||
CreateExecution(ctx context.Context, execution *Execution) error
|
||||
UpdateExecution(ctx context.Context, execution *Execution) error
|
||||
GetExecution(ctx context.Context, executionID string) (*Execution, error)
|
||||
ListExecutions(ctx context.Context, filter *ExecutionFilter) ([]*Execution, error)
|
||||
DeleteExecution(ctx context.Context, executionID string) error
|
||||
SaveCheckpoint(ctx context.Context, executionID string, checkpoint *Checkpoint) error
|
||||
GetCheckpoints(ctx context.Context, executionID string) ([]*Checkpoint, error)
|
||||
}
|
||||
|
||||
type WorkflowExecutor interface {
|
||||
Start(ctx context.Context) error
|
||||
Stop(ctx context.Context)
|
||||
Execute(ctx context.Context, definition *WorkflowDefinition, execution *Execution) error
|
||||
Cancel(ctx context.Context, executionID string) error
|
||||
Suspend(ctx context.Context, executionID string) error
|
||||
Resume(ctx context.Context, executionID string) error
|
||||
}
|
||||
|
||||
type WorkflowScheduler interface {
|
||||
Start(ctx context.Context) error
|
||||
Stop(ctx context.Context)
|
||||
ScheduleExecution(ctx context.Context, execution *Execution, delay time.Duration) error
|
||||
CancelScheduledExecution(ctx context.Context, executionID string) error
|
||||
}
|
||||
|
||||
// Config for the workflow engine
|
||||
type Config struct {
|
||||
MaxWorkers int `json:"max_workers"`
|
||||
ExecutionTimeout time.Duration `json:"execution_timeout"`
|
||||
EnableMetrics bool `json:"enable_metrics"`
|
||||
EnableAudit bool `json:"enable_audit"`
|
||||
EnableTracing bool `json:"enable_tracing"`
|
||||
LogLevel string `json:"log_level"`
|
||||
Storage StorageConfig `json:"storage"`
|
||||
Security SecurityConfig `json:"security"`
|
||||
}
|
||||
|
||||
type StorageConfig struct {
|
||||
Type string `json:"type"` // "memory", "database"
|
||||
ConnectionURL string `json:"connection_url,omitempty"`
|
||||
MaxConnections int `json:"max_connections"`
|
||||
}
|
||||
|
||||
type SecurityConfig struct {
|
||||
EnableAuth bool `json:"enable_auth"`
|
||||
AllowedOrigins []string `json:"allowed_origins"`
|
||||
JWTSecret string `json:"jwt_secret,omitempty"`
|
||||
RequiredScopes []string `json:"required_scopes"`
|
||||
}
|
Reference in New Issue
Block a user