diff --git a/server/internal/models/workflow.go b/server/internal/models/workflow.go new file mode 100644 index 0000000..6b8e2ad --- /dev/null +++ b/server/internal/models/workflow.go @@ -0,0 +1,86 @@ +package models + +import "time" + +type WorkflowStep struct { + ID string `bson:"_id,omitempty" json:"-"` + StepID string `bson:"step_id" json:"step_id"` + Name string `bson:"name" json:"name"` + Description string `bson:"description" json:"description"` + Interpreter string `bson:"interpreter" json:"interpreter"` // "bash" | "powershell" + Script string `bson:"script" json:"script"` + DeclaredOutputs []string `bson:"declared_outputs" json:"declared_outputs"` + SecretRefs []string `bson:"secret_refs" json:"secret_refs"` + CreatedAt time.Time `bson:"created_at" json:"created_at"` + UpdatedAt time.Time `bson:"updated_at" json:"updated_at"` +} + +type WorkflowStepRef struct { + StepID string `bson:"step_id" json:"step_id"` + Order int `bson:"order" json:"order"` + OnFailure string `bson:"on_failure" json:"on_failure"` // "stop" | "continue" | "retry" + MaxRetries int `bson:"max_retries" json:"max_retries"` + Overrides *StepOverride `bson:"overrides,omitempty" json:"overrides,omitempty"` +} + +type StepOverride struct { + Script *string `bson:"script,omitempty" json:"script,omitempty"` + SecretRefs []string `bson:"secret_refs,omitempty" json:"secret_refs,omitempty"` +} + +type Workflow struct { + ID string `bson:"_id,omitempty" json:"-"` + WorkflowID string `bson:"workflow_id" json:"workflow_id"` + Name string `bson:"name" json:"name"` + TargetServerIDs []string `bson:"target_server_ids" json:"target_server_ids"` + Steps []WorkflowStepRef `bson:"steps" json:"steps"` + CreatedAt time.Time `bson:"created_at" json:"created_at"` + UpdatedAt time.Time `bson:"updated_at" json:"updated_at"` +} + +// ResolvedStep is a step frozen into a run snapshot (library step + overrides applied). +type ResolvedStep struct { + Order int `bson:"order" json:"order"` + Name string `bson:"name" json:"name"` + Interpreter string `bson:"interpreter" json:"interpreter"` + Script string `bson:"script" json:"script"` + SecretRefs []string `bson:"secret_refs" json:"secret_refs"` + OnFailure string `bson:"on_failure" json:"on_failure"` + MaxRetries int `bson:"max_retries" json:"max_retries"` +} + +type StepRun struct { + Order int `bson:"order" json:"order"` + Name string `bson:"name" json:"name"` + Status string `bson:"status" json:"status"` // queued|running|success|failed|skipped + Attempts int `bson:"attempts" json:"attempts"` + ExitCode int `bson:"exit_code" json:"exit_code"` + Stdout string `bson:"stdout" json:"stdout"` + Stderr string `bson:"stderr" json:"stderr"` + OutputEnv map[string]string `bson:"output_env" json:"output_env"` + StartedAt *time.Time `bson:"started_at,omitempty" json:"started_at,omitempty"` + FinishedAt *time.Time `bson:"finished_at,omitempty" json:"finished_at,omitempty"` +} + +type ServerRun struct { + ServerID string `bson:"server_id" json:"server_id"` + Hostname string `bson:"hostname" json:"hostname"` + Status string `bson:"status" json:"status"` // queued|running|success|failed|skipped + StartedAt *time.Time `bson:"started_at,omitempty" json:"started_at,omitempty"` + FinishedAt *time.Time `bson:"finished_at,omitempty" json:"finished_at,omitempty"` + RunEnv map[string]string `bson:"run_env" json:"run_env"` + Steps []StepRun `bson:"steps" json:"steps"` +} + +type WorkflowRun struct { + ID string `bson:"_id,omitempty" json:"-"` + RunID string `bson:"run_id" json:"run_id"` + WorkflowID string `bson:"workflow_id" json:"workflow_id"` + Name string `bson:"name" json:"name"` + Steps []ResolvedStep `bson:"steps_snapshot" json:"steps_snapshot"` + Status string `bson:"status" json:"status"` // running|success|failed|cancelled + TriggeredBy string `bson:"triggered_by" json:"triggered_by"` + StartedAt time.Time `bson:"started_at" json:"started_at"` + FinishedAt *time.Time `bson:"finished_at,omitempty" json:"finished_at,omitempty"` + ServerRuns []ServerRun `bson:"server_runs" json:"server_runs"` +}