mirror of
https://github.com/hanzo-fi/stack.git
synced 2026-10-30 20:34:43 +00:00
101 lines
2.6 KiB
Go
101 lines
2.6 KiB
Go
package workflow
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/formancehq/orchestration/internal/temporalworker"
|
|
|
|
"go.temporal.io/api/enums/v1"
|
|
"go.temporal.io/sdk/workflow"
|
|
)
|
|
|
|
const SearchAttributeWorkflowID = "OrchestrationWorkflowID"
|
|
|
|
type Workflows struct {
|
|
includeSearchAttributes bool
|
|
}
|
|
|
|
func (w Workflows) Initiate(ctx workflow.Context, input Input) (*Instance, error) {
|
|
instance := &Instance{}
|
|
err := workflow.ExecuteActivity(workflow.WithActivityOptions(ctx, workflow.ActivityOptions{
|
|
StartToCloseTimeout: 10 * time.Second,
|
|
}), InsertNewInstanceActivity, input.Workflow.ID).Get(ctx, instance)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err = workflow.ExecuteActivity(workflow.WithActivityOptions(ctx, workflow.ActivityOptions{
|
|
StartToCloseTimeout: 10 * time.Second,
|
|
}), SendWorkflowStartedEventActivity, instance).Get(ctx, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
searchAttributes := map[string]any{}
|
|
if w.includeSearchAttributes {
|
|
searchAttributes = map[string]interface{}{
|
|
SearchAttributeWorkflowID: input.Workflow.ID,
|
|
}
|
|
}
|
|
|
|
if err := workflow.ExecuteChildWorkflow(
|
|
workflow.WithChildOptions(ctx, workflow.ChildWorkflowOptions{
|
|
ParentClosePolicy: enums.PARENT_CLOSE_POLICY_ABANDON,
|
|
WorkflowID: workflow.GetInfo(ctx).WorkflowExecution.ID + "-main",
|
|
SearchAttributes: searchAttributes,
|
|
}),
|
|
Run,
|
|
input,
|
|
*instance,
|
|
).GetChildWorkflowExecution().Get(ctx, nil); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return instance, nil
|
|
}
|
|
|
|
func (w Workflows) Run(ctx workflow.Context, i Input, instance Instance) error {
|
|
err := i.Workflow.Config.run(ctx, instance, i.Variables)
|
|
if err != nil {
|
|
instance.SetTerminatedWithError(workflow.Now(ctx), err)
|
|
} else {
|
|
instance.SetTerminated(workflow.Now(ctx))
|
|
}
|
|
|
|
err = workflow.ExecuteActivity(workflow.WithActivityOptions(ctx, workflow.ActivityOptions{
|
|
StartToCloseTimeout: 10 * time.Second,
|
|
}), UpdateInstanceActivity, instance).Get(ctx, nil)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = workflow.ExecuteActivity(workflow.WithActivityOptions(ctx, workflow.ActivityOptions{
|
|
StartToCloseTimeout: 10 * time.Second,
|
|
}), SendWorkflowTerminationEventActivity, instance).Get(ctx, nil)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (w Workflows) DefinitionSet() temporalworker.DefinitionSet {
|
|
return temporalworker.NewDefinitionSet().
|
|
Append(temporalworker.Definition{
|
|
Func: w.Run,
|
|
Name: "Run",
|
|
}).Append(temporalworker.Definition{
|
|
Func: w.Initiate,
|
|
Name: "Initiate",
|
|
})
|
|
}
|
|
|
|
var Initiate = Workflows{}.Initiate
|
|
var Run = Workflows{}.Run
|
|
|
|
func NewWorkflows(includeSearchAttributes bool) *Workflows {
|
|
return &Workflows{
|
|
includeSearchAttributes: includeSearchAttributes,
|
|
}
|
|
}
|