Skip to content

Commit 0a3eca6

Browse files
committed
Support workflow definitions in execution command
Enhanced the `ExecuteWorkflowCommand` to support workflow definitions via `-d`/`--definition` and `-f`/`--definition-file` options. Updated `WorkflowId` to be optional and added logic to handle workflows created from definitions. - Modified `workflowIdOption` to accept nullable strings. - Added `definitionOption` and `definitionFileOption`. - Updated `ExecuteWorkflowCommandOptions` with new properties. - Implemented logic to add workflows from definitions if no workflow ID is provided. - Added `ExtractWorkflowId` helper for cleaner ID extraction. - Improved error handling and logging for better feedback. #131
1 parent 57207fd commit 0a3eca6

3 files changed

Lines changed: 72 additions & 13 deletions

File tree

src/FlowCtl/Commands/Workflows/Executions/Execute/ExecuteWorkflowCommand.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,21 @@ internal class ExecuteWorkflowCommand : BaseCommand<ExecuteWorkflowCommandOption
66
{
77
public ExecuteWorkflowCommand() : base("execute", Resources.Commands_Workflows_ExecuteDescription)
88
{
9-
var workflowIdOption = new Option<string>(new[] { "-w", "--workflow-id" },
10-
description: Resources.Commands_Workflows_IdentityOption)
11-
{ IsRequired = true };
9+
var workflowIdOption = new Option<string?>(new[] { "-w", "--workflow-id" },
10+
description: Resources.Commands_Workflows_IdentityOption);
11+
12+
var definitionOption = new Option<string?>(new[] { "-d", "--definition" },
13+
description: Resources.Commands_Workflows_Add_DefinitionData);
14+
15+
var definitionFileOption = new Option<string?>(new[] { "-f", "--definition-file" },
16+
description: Resources.Commands_Workflows_Add_DefinitionDataFile);
1217

1318
var addressOption = new Option<string?>(new[] { "-a", "--address" },
1419
description: Resources.Commands_FlowSynxAddress);
1520

1621
AddOption(workflowIdOption);
22+
AddOption(definitionOption);
23+
AddOption(definitionFileOption);
1724
AddOption(addressOption);
1825
}
1926
}

src/FlowCtl/Commands/Workflows/Executions/Execute/ExecuteWorkflowCommandOptions.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
internal class ExecuteWorkflowCommandOptions : ICommandOptions
44
{
5-
public required string WorkflowId { get; set; }
5+
public string? WorkflowId { get; set; }
6+
public string Definition { get; set; } = string.Empty;
7+
public string? DefinitionFile { get; set; }
68
public string? Address { get; set; } = string.Empty;
79
}

src/FlowCtl/Commands/Workflows/Executions/Execute/ExecuteWorkflowCommandOptionsHandler.cs

Lines changed: 59 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using FlowCtl.Extensions;
44
using FlowSynx.Client;
55
using FlowSynx.Client.Messages.Requests.Workflows;
6+
using FlowSynx.Client.Messages.Responses.Workflows;
67

78
namespace FlowCtl.Commands.Workflows.Executions.Execute;
89

@@ -41,24 +42,73 @@ private async Task Execute(ExecuteWorkflowCommandOptions options, CancellationTo
4142
_flowSynxClient.SetConnection(connection);
4243
}
4344

44-
if (!Guid.TryParse(options.WorkflowId, out Guid workflowId))
45-
throw new FormatException("Invalid workflow id format. Expected a valid GUID.");
45+
Guid workflowId;
4646

47-
var request = new ExecuteWorkflowRequest { WorkflowId = workflowId };
48-
var result = await _flowSynxClient.Workflows.ExecuteAsync(request, cancellationToken);
47+
if (!string.IsNullOrWhiteSpace(options.WorkflowId))
48+
{
49+
// Execute existing workflow by id
50+
if (!Guid.TryParse(options.WorkflowId, out workflowId))
51+
throw new FormatException("Invalid workflow id format. Expected a valid GUID.");
52+
}
53+
else
54+
{
55+
// Need to add workflow first using provided definition
56+
if (string.IsNullOrWhiteSpace(options.Definition) && string.IsNullOrWhiteSpace(options.DefinitionFile))
57+
throw new Exception("Either a workflow id (-w) or a definition (-d / -f) must be provided.");
58+
59+
string? definitionJsonData;
60+
if (!string.IsNullOrEmpty(options.DefinitionFile))
61+
{
62+
if (!File.Exists(options.DefinitionFile))
63+
throw new Exception(string.Format(Resources.Command_Workflow_AddCommand_FileNotExist, options.DefinitionFile));
64+
65+
definitionJsonData = await File.ReadAllTextAsync(options.DefinitionFile, cancellationToken);
66+
}
67+
else
68+
{
69+
definitionJsonData = options.Definition;
70+
}
71+
72+
if (string.IsNullOrWhiteSpace(definitionJsonData))
73+
throw new Exception("Workflow definition content is empty.");
74+
75+
var addRequest = new AddWorkflowRequest { Definition = definitionJsonData };
76+
var addResult = await _flowSynxClient.Workflows.AddAsync(addRequest, cancellationToken);
4977

50-
if (result.StatusCode != 200)
78+
if (addResult.StatusCode != 200)
79+
throw new Exception(Resources.Commands_Error_DuringProcessingRequest);
80+
81+
var addPayload = addResult.Payload;
82+
if (addPayload is { Succeeded: false })
83+
{
84+
_flowCtlLogger.WriteError(addPayload.Messages);
85+
return;
86+
}
87+
88+
workflowId = ExtractWorkflowId(addPayload.Data) ?? throw new Exception("Unable to determine newly added workflow id from response.");
89+
}
90+
91+
var execRequest = new ExecuteWorkflowRequest { WorkflowId = workflowId };
92+
var execResult = await _flowSynxClient.Workflows.ExecuteAsync(execRequest, cancellationToken);
93+
94+
if (execResult.StatusCode != 200)
5195
throw new Exception(Resources.Commands_Error_DuringProcessingRequest);
5296

53-
var payload = result.Payload;
54-
if (payload is { Succeeded: false })
55-
_flowCtlLogger.WriteError(payload.Messages);
97+
var execPayload = execResult.Payload;
98+
if (execPayload is { Succeeded: false })
99+
_flowCtlLogger.WriteError(execPayload.Messages);
56100
else
57-
_flowCtlLogger.Write(payload.Data);
101+
_flowCtlLogger.Write(execPayload.Data);
58102
}
59103
catch (Exception ex)
60104
{
61105
_flowCtlLogger.WriteError(ex.Message);
62106
}
63107
}
108+
109+
private Guid? ExtractWorkflowId(AddWorkflowResponse? data)
110+
{
111+
if (data is null) return null;
112+
return data.Id;
113+
}
64114
}

0 commit comments

Comments
 (0)