Skip to content

Commit d918b0b

Browse files
committed
Refactor workflow system and add pagination support
Replaced `Workflow` with `WorkflowContainer` for better encapsulation, adding support for `Schema` and improving task management. Refactored API calls across components to use paginated request objects, enhancing scalability. Updated `IWorkflowService` and `WorkflowService` to align with the new `WorkflowContainer` structure. Enhanced workflow designer and monitoring logic to support the updated data model. Upgraded `FlowSynx.Client.AspNetCore` to version 1.3.9. Performed general cleanup, improving error handling and UI consistency. #88
1 parent c5d64c4 commit d918b0b

16 files changed

Lines changed: 148 additions & 78 deletions

src/Components/Pages/PluginConfig/AddPluginConfigDialog.razor

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,14 @@
174174

175175
var authenticationStrategy = new FlowSynx.Client.Authentication.BearerTokenAuthStrategy(token);
176176
FlowSynxClient.SetAuthenticationStrategy(authenticationStrategy);
177-
var result = await FlowSynxClient.Plugins.ListAsync(cancellationToken);
177+
178+
var request = new FlowSynx.Client.Messages.Requests.Plugins.PluginsListRequest
179+
{
180+
Page = 1,
181+
PageSize = int.MaxValue
182+
};
183+
184+
var result = await FlowSynxClient.Plugins.ListAsync(request, cancellationToken);
178185

179186
if (result.StatusCode != 200)
180187
{

src/Components/Pages/PluginConfig/PluginConfig.razor

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,14 @@
8787

8888
var authenticationStrategy = new FlowSynx.Client.Authentication.BearerTokenAuthStrategy(token);
8989
FlowSynxClient.SetAuthenticationStrategy(authenticationStrategy);
90-
var result = await FlowSynxClient.PluginConfig.ListAsync(cancellationToken);
90+
91+
var request = new FlowSynx.Client.Messages.Requests.PluginConfig.PluginConfigListRequest
92+
{
93+
Page = state.Page + 1,
94+
PageSize = state.PageSize
95+
};
96+
97+
var result = await FlowSynxClient.PluginConfig.ListAsync(request, cancellationToken);
9198

9299
if (result.StatusCode != 200)
93100
{
@@ -103,11 +110,12 @@
103110
}
104111

105112
var pluginconfigs = result.Payload.Data.ToList();
113+
var totalCount = result.Payload.Pagination.TotalCount;
106114

107115
return new TableData<PluginConfigListResponse>
108116
{
109117
Items = pluginconfigs,
110-
TotalItems = pluginconfigs.Count
118+
TotalItems = totalCount
111119
};
112120
}
113121
catch (Exception ex)

src/Components/Pages/PluginConfig/UpdatePluginConfigDialog.razor

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,13 @@
247247

248248
var authenticationStrategy = new FlowSynx.Client.Authentication.BearerTokenAuthStrategy(token);
249249
FlowSynxClient.SetAuthenticationStrategy(authenticationStrategy);
250-
var result = await FlowSynxClient.Plugins.ListAsync(cancellationToken);
250+
251+
var request = new FlowSynx.Client.Messages.Requests.Plugins.PluginsListRequest
252+
{
253+
Page = 1,
254+
PageSize = int.MaxValue
255+
};
256+
var result = await FlowSynxClient.Plugins.ListAsync(request, cancellationToken);
251257

252258
if (result.StatusCode != 200)
253259
{

src/Components/Pages/Plugins/Plugins.razor

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,13 @@
8686

8787
var authenticationStrategy = new FlowSynx.Client.Authentication.BearerTokenAuthStrategy(token);
8888
FlowSynxClient.SetAuthenticationStrategy(authenticationStrategy);
89-
var result = await FlowSynxClient.Plugins.ListAsync(cancellationToken);
89+
90+
var request = new FlowSynx.Client.Messages.Requests.Plugins.PluginsListRequest
91+
{
92+
Page = state.Page + 1,
93+
PageSize = state.PageSize
94+
};
95+
var result = await FlowSynxClient.Plugins.ListAsync(request, cancellationToken);
9096

9197
if (result.StatusCode != 200)
9298
{
@@ -102,11 +108,12 @@
102108
}
103109

104110
var plugins = result.Payload.Data.ToList();
111+
var totalCount = result.Payload.Pagination.TotalCount;
105112

106113
return new TableData<PluginsListResponse>
107114
{
108115
Items = plugins,
109-
TotalItems = plugins.Count
116+
TotalItems = totalCount
110117
};
111118
}
112119
catch (Exception ex)

src/Components/Pages/Workflows/AddWorkflow.razor

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555

5656
@code {
5757
private bool IsProcessing = false;
58-
private Workflow Workflow => WorkflowService.Get();
58+
private WorkflowContainer WorkflowContainer => WorkflowService.Get();
5959
private string? _workflowJson;
6060
private AddWorkflowRequest AddWorkflowRequest = new AddWorkflowRequest { Definition = "" };
6161

@@ -70,7 +70,7 @@
7070
{
7171
View.Code => @<WorkflowJsonEditor JsonContent="@_workflowJson"
7272
JsonContentChanged="v => _workflowJson = v" />,
73-
View.Designer => @<WorkflowDesigner Workflow="@Workflow" />,
73+
View.Designer => @<WorkflowDesigner WorkflowContainer="@WorkflowContainer" />,
7474
_ => @<p>Unknown view</p>
7575
};
7676

@@ -79,7 +79,7 @@
7979
CurrentView = CurrentView == View.Code ? View.Designer : View.Code;
8080
if (CurrentView == View.Code)
8181
{
82-
WorkflowService.Set(Workflow);
82+
WorkflowService.Set(WorkflowContainer);
8383
_workflowJson = WorkflowService.GetJson();
8484
}
8585
else
@@ -169,9 +169,10 @@
169169
{
170170
"Config", new WorkflowViewModel
171171
{
172-
Name = Workflow.Name,
173-
Description = Workflow.Description,
174-
Configuration = Workflow.Configuration
172+
Schema = WorkflowContainer.Schema,
173+
Name = WorkflowContainer.Workflow.Name,
174+
Description = WorkflowContainer.Workflow.Description,
175+
Configuration = WorkflowContainer.Workflow.Configuration
175176
}
176177
}
177178
};
@@ -181,9 +182,10 @@
181182
if (dialogResult != null && !dialogResult.Canceled)
182183
{
183184
var result = (WorkflowViewModel)dialogResult.Data;
184-
Workflow.Name = result.Name;
185-
Workflow.Description = result.Description;
186-
Workflow.Configuration = result.Configuration;
185+
WorkflowContainer.Schema = result.Schema;
186+
WorkflowContainer.Workflow.Name = result.Name;
187+
WorkflowContainer.Workflow.Description = result.Description;
188+
WorkflowContainer.Workflow.Configuration = result.Configuration;
187189
}
188190
}
189191

src/Components/Pages/Workflows/ConfigureWorkflowDialog.razor

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@
1818

1919
<DialogContent>
2020
<MudGrid>
21+
<MudItem xs="12" sm="12">
22+
<MudTextField T="string" For="@(() => Config.Schema)"
23+
@bind-Value="Config.Schema"
24+
Label="Workflow Schema"
25+
Variant="Variant.Text"
26+
Margin="Margin.Dense" />
27+
</MudItem>
28+
2129
<MudItem xs="12" sm="12">
2230
<MudTextField T="string" For="@(() => Config.Name)"
2331
@bind-Value="Config.Name"

src/Components/Pages/Workflows/ManageWorkflow.razor

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@
9292
public Guid id { get; set; }
9393

9494
private bool IsProcessing = false;
95-
private Workflow Workflow { get; set; } = new Workflow();
95+
private WorkflowContainer WorkflowContainer { get; set; } = new WorkflowContainer();
9696
private string? _workflowJson;
9797
private UpdateWorkflowRequest UpdateWorkflowRequest = new UpdateWorkflowRequest
9898
{
@@ -136,8 +136,16 @@
136136
}
137137

138138
_workflowJson = payload.Data.Workflow;
139+
140+
// var workflowContainer = new WorkflowContainer
141+
// {
142+
// Schema = payload.Data.sc,
143+
// Workflow = payload.Data.Workflow
144+
// };
145+
146+
139147
WorkflowService.SetJson(_workflowJson);
140-
Workflow = WorkflowService.Get();
148+
WorkflowContainer = WorkflowService.Get();
141149
StateHasChanged();
142150
}
143151
catch (Exception ex)
@@ -162,8 +170,8 @@
162170
{
163171
View.Code => @<WorkflowJsonEditor JsonContent="@_workflowJson"
164172
JsonContentChanged="v => _workflowJson = v" />,
165-
View.Designer => Workflow is not null && Workflow.Tasks?.Any() == true
166-
? @<WorkflowDesigner Workflow="@Workflow" />
173+
View.Designer => WorkflowContainer is not null && WorkflowContainer.Workflow.Tasks?.Any() == true
174+
? @<WorkflowDesigner WorkflowContainer="@WorkflowContainer" />
167175
: @<MudProgressCircular Indeterminate="true" Size="Size.Large" Color="Color.Primary" />,
168176
_ => @<p>Unknown view</p>
169177
};
@@ -262,9 +270,9 @@
262270
{
263271
"Config", new WorkflowViewModel
264272
{
265-
Name = Workflow.Name,
266-
Description = Workflow.Description,
267-
Configuration = Workflow.Configuration
273+
Name = WorkflowContainer.Workflow.Name,
274+
Description = WorkflowContainer.Workflow.Description,
275+
Configuration = WorkflowContainer.Workflow.Configuration
268276
}
269277
}
270278
};
@@ -274,9 +282,9 @@
274282
if (dialogResult != null && !dialogResult.Canceled)
275283
{
276284
var result = (WorkflowViewModel)dialogResult.Data;
277-
Workflow.Name = result.Name;
278-
Workflow.Description = result.Description;
279-
Workflow.Configuration = result.Configuration;
285+
WorkflowContainer.Workflow.Name = result.Name;
286+
WorkflowContainer.Workflow.Description = result.Description;
287+
WorkflowContainer.Workflow.Configuration = result.Configuration;
280288
}
281289
}
282290

@@ -293,8 +301,8 @@
293301

294302
var parameters = new DialogParameters {
295303
{ "Id", id },
296-
{ "WorkflowName", Workflow.Name },
297-
{ "WorkflowDescription", Workflow.Description }
304+
{ "WorkflowName", WorkflowContainer.Workflow.Name },
305+
{ "WorkflowDescription", WorkflowContainer.Workflow.Description }
298306
};
299307

300308
var dialog = await DialogService.ShowAsync<DeleteWorkflowDialog>("Delete workflow", parameters, options);

src/Components/Pages/Workflows/SearchablePluginsList.razor

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,12 @@
9191
var authenticationStrategy = new FlowSynx.Client.Authentication.BearerTokenAuthStrategy(token);
9292
FlowSynxClient.SetAuthenticationStrategy(authenticationStrategy);
9393

94-
var result = await FlowSynxClient.Plugins.ListAsync(cancellationToken);
94+
var request = new FlowSynx.Client.Messages.Requests.Plugins.PluginsListRequest
95+
{
96+
Page = 1,
97+
PageSize = int.MaxValue
98+
};
99+
var result = await FlowSynxClient.Plugins.ListAsync(request, cancellationToken);
95100

96101
if (result.StatusCode != 200)
97102
{

src/Components/Pages/Workflows/WorkflowDesigner.razor

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
</div>
5252

5353
@code {
54-
[Parameter] public Workflow Workflow { get; set; }
54+
[Parameter] public WorkflowContainer WorkflowContainer { get; set; }
5555

5656
private WorkflowTask SelectedTask;
5757
private string _deps;
@@ -84,7 +84,7 @@
8484
{
8585
await JSRuntime.InvokeVoidAsync("fsDrawflow.clear");
8686

87-
foreach (var task in Workflow.Tasks)
87+
foreach (var task in WorkflowContainer.Workflow.Tasks)
8888
{
8989
string displayType;
9090

@@ -139,11 +139,11 @@
139139
task.NodeId = id.ToString();
140140
}
141141

142-
foreach (var t in Workflow.Tasks)
142+
foreach (var t in WorkflowContainer.Workflow.Tasks)
143143
{
144144
foreach (var dep in t.Dependencies)
145145
{
146-
var from = Workflow.Tasks.FirstOrDefault(x => x.Name == dep);
146+
var from = WorkflowContainer.Workflow.Tasks.FirstOrDefault(x => x.Name == dep);
147147
if (from != null)
148148
await JSRuntime.InvokeVoidAsync("fsDrawflow.connect", from.NodeId, t.NodeId);
149149
}
@@ -163,15 +163,15 @@
163163

164164
var newTask = new WorkflowTask
165165
{
166-
Name = $"{plugin.type}-{Workflow.Tasks.Count + 1}",
166+
Name = $"{plugin.type}-{WorkflowContainer.Workflow.Tasks.Count + 1}",
167167
Type = typeValue,
168168
Position = new(
169-
120 + (Workflow.Tasks.Count % 5) * 140,
170-
120 + (Workflow.Tasks.Count / 5) * 120
169+
120 + (WorkflowContainer.Workflow.Tasks.Count % 5) * 140,
170+
120 + (WorkflowContainer.Workflow.Tasks.Count / 5) * 120
171171
)
172172
};
173173

174-
Workflow.Tasks.Add(newTask);
174+
WorkflowContainer.Workflow.Tasks.Add(newTask);
175175

176176
string displayType = plugin.type == "LocalFileSystem"
177177
? ""
@@ -240,7 +240,7 @@
240240
[JSInvokable]
241241
public Task OnNodeSelected(string id)
242242
{
243-
SelectedTask = Workflow.Tasks.FirstOrDefault(x => x.NodeId == id);
243+
SelectedTask = WorkflowContainer.Workflow.Tasks.FirstOrDefault(x => x.NodeId == id);
244244
_deps = SelectedTask != null ? string.Join(',', SelectedTask.Dependencies) : string.Empty;
245245
StateHasChanged();
246246
return Task.CompletedTask;
@@ -252,8 +252,8 @@
252252
[JSInvokable]
253253
public Task OnConnectionCreated(string fromId, string toId)
254254
{
255-
var from = Workflow.Tasks.FirstOrDefault(x => x.NodeId == fromId);
256-
var to = Workflow.Tasks.FirstOrDefault(x => x.NodeId == toId);
255+
var from = WorkflowContainer.Workflow.Tasks.FirstOrDefault(x => x.NodeId == fromId);
256+
var to = WorkflowContainer.Workflow.Tasks.FirstOrDefault(x => x.NodeId == toId);
257257
if (from != null && to != null && !to.Dependencies.Contains(from.Name))
258258
to.Dependencies.Add(from.Name);
259259
_deps = SelectedTask == to ? string.Join(',', to.Dependencies) : _deps;
@@ -264,8 +264,8 @@
264264
[JSInvokable]
265265
public Task OnConnectionRemoved(string fromId, string toId)
266266
{
267-
var from = Workflow.Tasks.FirstOrDefault(x => x.NodeId == fromId);
268-
var to = Workflow.Tasks.FirstOrDefault(x => x.NodeId == toId);
267+
var from = WorkflowContainer.Workflow.Tasks.FirstOrDefault(x => x.NodeId == fromId);
268+
var to = WorkflowContainer.Workflow.Tasks.FirstOrDefault(x => x.NodeId == toId);
269269
to?.Dependencies.Remove(from?.Name);
270270
_deps = SelectedTask == to ? string.Join(',', to.Dependencies) : _deps;
271271
StateHasChanged();
@@ -275,11 +275,11 @@
275275
[JSInvokable]
276276
public Task OnNodeRemoved(string id)
277277
{
278-
var t = Workflow.Tasks.FirstOrDefault(x => x.NodeId == id);
278+
var t = WorkflowContainer.Workflow.Tasks.FirstOrDefault(x => x.NodeId == id);
279279
if (t != null)
280280
{
281-
Workflow.Tasks.Remove(t);
282-
foreach (var o in Workflow.Tasks) o.Dependencies.Remove(t.Name);
281+
WorkflowContainer.Workflow.Tasks.Remove(t);
282+
foreach (var o in WorkflowContainer.Workflow.Tasks) o.Dependencies.Remove(t.Name);
283283
if (SelectedTask == t) { SelectedTask = null; _deps = string.Empty; }
284284
}
285285
StateHasChanged();
@@ -289,7 +289,7 @@
289289
[JSInvokable]
290290
public Task OnNodeDoubleClicked(string id)
291291
{
292-
var task = Workflow.Tasks.FirstOrDefault(x => x.NodeId == id);
292+
var task = WorkflowContainer.Workflow.Tasks.FirstOrDefault(x => x.NodeId == id);
293293
if (task != null)
294294
{
295295
SelectedTask = task;
@@ -301,7 +301,7 @@
301301
[JSInvokable]
302302
public Task OnNodeProperties(string id)
303303
{
304-
var task = Workflow.Tasks.FirstOrDefault(x => x.NodeId == id);
304+
var task = WorkflowContainer.Workflow.Tasks.FirstOrDefault(x => x.NodeId == id);
305305
if (task != null)
306306
{
307307
SelectedTask = task;
@@ -313,7 +313,7 @@
313313
[JSInvokable]
314314
public Task OnNodeMoved(string id, double? x, double? y)
315315
{
316-
var task = Workflow.Tasks.FirstOrDefault(t => t.NodeId == id);
316+
var task = WorkflowContainer.Workflow.Tasks.FirstOrDefault(t => t.NodeId == id);
317317
if (task != null && x.HasValue && y.HasValue)
318318
{
319319
task.Position = new((int)x.Value, (int)y.Value);

0 commit comments

Comments
 (0)