feat: publish immutable workflow definitions with typed SDK

This commit is contained in:
2026-09-18 00:28:00 +08:00
parent a664ec9370
commit 520e98d9d1
33 changed files with 2603 additions and 11 deletions

View File

@@ -0,0 +1,55 @@
package orbit
import (
"context"
"errors"
)
// WorkflowRef 构造输入或已完成步骤的字段引用;合法作用域及类型在发布时由服务端校验。
func WorkflowRef(source string, path ...string) WorkflowValue {
return WorkflowValue{Kind: "REFERENCE", Reference: &WorkflowReference{Source: source, Path: append([]string(nil), path...)}}
}
// CreateWorkflowDefinition 幂等创建稳定定义身份,不自动发布或启动流程。
func (c *Client) CreateWorkflowDefinition(ctx context.Context, key string, in CreateWorkflowDefinitionRequest) (WorkflowDefinitionResult, error) {
var out WorkflowDefinitionResult
err := c.call(ctx, "POST", "/v1/workflow-definitions", key, in, &out)
return out, err
}
func (c *Client) GetWorkflowDefinition(ctx context.Context, id string) (WorkflowDefinition, error) {
var out WorkflowDefinition
if !validID(id) {
return out, errors.New("invalid definition id")
}
err := c.call(ctx, "GET", "/v1/workflow-definitions/"+id, "", nil, &out)
return out, err
}
// PublishWorkflowVersion 冻结规则;网络结果不明时保留原定义ID、版本、内容、原因和幂等键重报。
func (c *Client) PublishWorkflowVersion(ctx context.Context, id, key string, in PublishWorkflowVersionRequest) (WorkflowVersionResult, error) {
var out WorkflowVersionResult
if !validID(id) {
return out, errors.New("invalid definition id")
}
err := c.call(ctx, "POST", "/v1/workflow-definitions/"+id+"/versions", key, in, &out)
return out, err
}
func (c *Client) GetWorkflowVersion(ctx context.Context, id, version string) (WorkflowVersion, error) {
var out WorkflowVersion
if !validID(id) || !workflowVersionName(version) {
return out, errors.New("invalid definition id or version")
}
err := c.call(ctx, "GET", "/v1/workflow-definitions/"+id+"/versions/"+version, "", nil, &out)
return out, err
}
func workflowVersionName(s string) bool {
if len(s) == 0 || len(s) > 64 {
return false
}
for i, r := range s {
if !(r >= 'a' && r <= 'z' || r >= 'A' && r <= 'Z' || r >= '0' && r <= '9' || i > 0 && (r == '_' || r == '.' || r == '-')) {
return false
}
}
return true
}