diff --git a/bindings/zeebe/command/throw_error.go b/bindings/zeebe/command/throw_error.go index 3b0f43e8f7..d594ad94b6 100644 --- a/bindings/zeebe/command/throw_error.go +++ b/bindings/zeebe/command/throw_error.go @@ -19,15 +19,18 @@ import ( "errors" "fmt" + "github.com/camunda/zeebe/clients/go/v8/pkg/commands" + "github.com/dapr/components-contrib/bindings" ) var ErrMissingErrorCode = errors.New("errorCode is a required attribute") type throwErrorPayload struct { - JobKey *int64 `json:"jobKey"` - ErrorCode string `json:"errorCode"` - ErrorMessage string `json:"errorMessage"` + JobKey *int64 `json:"jobKey"` + ErrorCode string `json:"errorCode"` + ErrorMessage string `json:"errorMessage"` + Variables interface{} `json:"variables"` } func (z *ZeebeCommand) throwError(ctx context.Context, req *bindings.InvokeRequest) (*bindings.InvokeResponse, error) { @@ -53,7 +56,15 @@ func (z *ZeebeCommand) throwError(ctx context.Context, req *bindings.InvokeReque cmd = cmd.ErrorMessage(payload.ErrorMessage) } - _, err = cmd.Send(ctx) + var cmdDispatch = cmd + if payload.Variables != nil { + cmdDispatch, err = cmd.VariablesFromObject(payload.Variables) + if err != nil { + return nil, err + } + } + + _, err = cmdDispatch.Send(ctx) if err != nil { return nil, fmt.Errorf("cannot throw error for job key %d: %w", payload.JobKey, err) } diff --git a/bindings/zeebe/command/throw_error_test.go b/bindings/zeebe/command/throw_error_test.go index 38df83b24f..dacf2cf722 100644 --- a/bindings/zeebe/command/throw_error_test.go +++ b/bindings/zeebe/command/throw_error_test.go @@ -48,6 +48,7 @@ type mockThrowErrorCommandStep2 struct { type mockDispatchThrowErrorCommand struct { commands.DispatchThrowErrorCommand errorMessage string + variables interface{} } func (mc *mockThrowErrorClient) NewThrowErrorCommand() commands.ThrowErrorCommandStep1 { @@ -78,6 +79,12 @@ func (cmd3 *mockDispatchThrowErrorCommand) ErrorMessage(errorMessage string) com return cmd3 } +func (cmd3 *mockDispatchThrowErrorCommand) VariablesFromObject(variables interface{}) (commands.DispatchThrowErrorCommand, error) { + cmd3.variables = variables + + return cmd3, nil +} + func (cmd3 *mockDispatchThrowErrorCommand) Send(context.Context) (*pb.ThrowErrorResponse, error) { return &pb.ThrowErrorResponse{}, nil } @@ -129,4 +136,30 @@ func TestThrowError(t *testing.T) { assert.Equal(t, payload.ErrorCode, mc.cmd1.cmd2.errorCode) assert.Equal(t, payload.ErrorMessage, mc.cmd1.cmd2.cmd3.errorMessage) }) + + t.Run("throw an error with variables", func(t *testing.T) { + payload := throwErrorPayload{ + JobKey: new(int64), + ErrorCode: "a", + ErrorMessage: "b", + Variables: map[string]interface{}{ + "key": "value", + }, + } + data, err := json.Marshal(payload) + require.NoError(t, err) + + req := &bindings.InvokeRequest{Data: data, Operation: ThrowErrorOperation} + + var mc mockThrowErrorClient + + cmd := ZeebeCommand{logger: testLogger, client: &mc} + _, err = cmd.Invoke(context.TODO(), req) + require.NoError(t, err) + + assert.Equal(t, *payload.JobKey, mc.cmd1.jobKey) + assert.Equal(t, payload.ErrorCode, mc.cmd1.cmd2.errorCode) + assert.Equal(t, payload.ErrorMessage, mc.cmd1.cmd2.cmd3.errorMessage) + assert.Equal(t, payload.Variables, mc.cmd1.cmd2.cmd3.variables) + }) }