From bc005a7586695567e17fa704cb4034b496f30ac3 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Tue, 18 Feb 2025 19:39:37 +0100 Subject: [PATCH] Remove mediator-based workflow definition handling Replaced mediator requests and commands with direct store interactions in the workflow management module. Simplified service dependencies, eliminating unnecessary handlers and requests, and streamlined workflow-related operations for better maintainability and performance. --- src/modules/Elsa.Http/Features/HttpFeature.cs | 1 - .../GetByDefinitionId/Endpoint.cs | 10 ++-- .../Commands/SaveWorkflowDefinitionCommand.cs | 6 --- .../Features/WorkflowDefinitionsFeature.cs | 14 +----- .../Commands/SaveWorkflowDefinitionHandler.cs | 14 ------ ...dLastVersionOfWorkflowDefinitionHandler.cs | 18 ------- ...stOrPublishedWorkflowDefinitionsHandler.cs | 31 ------------ .../Requests/FindWorkflowDefinitionHandler.cs | 18 ------- ...dLastVersionOfWorkflowDefinitionRequest.cs | 10 ---- ...stOrPublishedWorkflowDefinitionsRequest.cs | 9 ---- .../Requests/FindWorkflowDefinitionRequest.cs | 12 ----- .../Services/WorkflowDefinitionPublisher.cs | 50 ++++++++++++------- .../Services/WorkflowDefinitionService.cs | 6 +-- 13 files changed, 39 insertions(+), 160 deletions(-) delete mode 100644 src/modules/Elsa.Workflows.Management/Commands/SaveWorkflowDefinitionCommand.cs delete mode 100644 src/modules/Elsa.Workflows.Management/Handlers/Commands/SaveWorkflowDefinitionHandler.cs delete mode 100644 src/modules/Elsa.Workflows.Management/Handlers/Requests/FindLastVersionOfWorkflowDefinitionHandler.cs delete mode 100644 src/modules/Elsa.Workflows.Management/Handlers/Requests/FindLatestOrPublishedWorkflowDefinitionsHandler.cs delete mode 100644 src/modules/Elsa.Workflows.Management/Handlers/Requests/FindWorkflowDefinitionHandler.cs delete mode 100644 src/modules/Elsa.Workflows.Management/Requests/FindLastVersionOfWorkflowDefinitionRequest.cs delete mode 100644 src/modules/Elsa.Workflows.Management/Requests/FindLatestOrPublishedWorkflowDefinitionsRequest.cs delete mode 100644 src/modules/Elsa.Workflows.Management/Requests/FindWorkflowDefinitionRequest.cs diff --git a/src/modules/Elsa.Http/Features/HttpFeature.cs b/src/modules/Elsa.Http/Features/HttpFeature.cs index 65c0e42d8..085a5c4ab 100644 --- a/src/modules/Elsa.Http/Features/HttpFeature.cs +++ b/src/modules/Elsa.Http/Features/HttpFeature.cs @@ -15,7 +15,6 @@ using Elsa.Http.Services; using Elsa.Http.Tasks; using Elsa.Http.UIHints; using Elsa.Workflows; -using Elsa.Workflows.Management.Requests; using FluentStorage; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.StaticFiles; diff --git a/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/GetByDefinitionId/Endpoint.cs b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/GetByDefinitionId/Endpoint.cs index 403000110..4b2fbe9e7 100644 --- a/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/GetByDefinitionId/Endpoint.cs +++ b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/GetByDefinitionId/Endpoint.cs @@ -1,14 +1,13 @@ using Elsa.Abstractions; using Elsa.Common.Models; -using Elsa.Mediator.Contracts; -using Elsa.Workflows.Management.Requests; +using Elsa.Workflows.Management; using Elsa.Workflows.Models; using JetBrains.Annotations; namespace Elsa.Workflows.Api.Endpoints.WorkflowDefinitions.GetByDefinitionId; [PublicAPI] -internal class GetByDefinitionId(IMediator mediator, IWorkflowDefinitionLinker linker) : ElsaEndpoint +internal class GetByDefinitionId(IWorkflowDefinitionStore store, IWorkflowDefinitionLinker linker) : ElsaEndpoint { public override void Configure() { @@ -19,9 +18,8 @@ internal class GetByDefinitionId(IMediator mediator, IWorkflowDefinitionLinker l public override async Task HandleAsync(Request request, CancellationToken cancellationToken) { var versionOptions = request.VersionOptions != null ? VersionOptions.FromString(request.VersionOptions) : VersionOptions.Latest; - var handle = WorkflowDefinitionHandle.ByDefinitionId(request.DefinitionId, versionOptions); - var findRequest = new FindWorkflowDefinitionRequest(handle); - var definition = await mediator.SendAsync(findRequest, cancellationToken); + var filter = WorkflowDefinitionHandle.ByDefinitionId(request.DefinitionId, versionOptions).ToFilter(); + var definition = await store.FindAsync(filter, cancellationToken); if (definition == null) { diff --git a/src/modules/Elsa.Workflows.Management/Commands/SaveWorkflowDefinitionCommand.cs b/src/modules/Elsa.Workflows.Management/Commands/SaveWorkflowDefinitionCommand.cs deleted file mode 100644 index 0a7eac4a1..000000000 --- a/src/modules/Elsa.Workflows.Management/Commands/SaveWorkflowDefinitionCommand.cs +++ /dev/null @@ -1,6 +0,0 @@ -using Elsa.Mediator.Contracts; -using Elsa.Workflows.Management.Entities; - -namespace Elsa.Workflows.Management.Commands; - -public record SaveWorkflowDefinitionCommand(WorkflowDefinition WorkflowDefinition) : ICommand; \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Management/Features/WorkflowDefinitionsFeature.cs b/src/modules/Elsa.Workflows.Management/Features/WorkflowDefinitionsFeature.cs index 94c248b05..8425c991d 100644 --- a/src/modules/Elsa.Workflows.Management/Features/WorkflowDefinitionsFeature.cs +++ b/src/modules/Elsa.Workflows.Management/Features/WorkflowDefinitionsFeature.cs @@ -1,8 +1,5 @@ using Elsa.Features.Abstractions; using Elsa.Features.Services; -using Elsa.Mediator.Contracts; -using Elsa.Workflows.Management.Handlers.Commands; -using Elsa.Workflows.Management.Handlers.Requests; using Elsa.Workflows.Management.Stores; using Microsoft.Extensions.DependencyInjection; @@ -17,20 +14,11 @@ public class WorkflowDefinitionsFeature(IModule module) : FeatureBase(module) /// The factory to create new instances of . /// public Func WorkflowDefinitionStore { get; set; } = sp => sp.GetRequiredService(); - public Type FindWorkflowDefinitionHandler { get; set; } = typeof(FindWorkflowDefinitionHandler); - public Type FindLastVersionOfWorkflowDefinitionHandler { get; set; } = typeof(FindLastVersionOfWorkflowDefinitionHandler); - public Type FindLatestOrPublishedWorkflowDefinitionsHandler { get; set; } = typeof(FindLatestOrPublishedWorkflowDefinitionsHandler); - public Type SaveWorkflowDefinitionHandler { get; set; } = typeof(SaveWorkflowDefinitionHandler); /// public override void Apply() { Services - .AddScoped(WorkflowDefinitionStore) - .AddScoped(typeof(IRequestHandler), FindWorkflowDefinitionHandler) - .AddScoped(typeof(IRequestHandler), FindLastVersionOfWorkflowDefinitionHandler) - .AddScoped(typeof(IRequestHandler), FindLatestOrPublishedWorkflowDefinitionsHandler) - .AddScoped(typeof(ICommandHandler), SaveWorkflowDefinitionHandler) - ; + .AddScoped(WorkflowDefinitionStore); } } \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Management/Handlers/Commands/SaveWorkflowDefinitionHandler.cs b/src/modules/Elsa.Workflows.Management/Handlers/Commands/SaveWorkflowDefinitionHandler.cs deleted file mode 100644 index d2f14abc2..000000000 --- a/src/modules/Elsa.Workflows.Management/Handlers/Commands/SaveWorkflowDefinitionHandler.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Elsa.Mediator.Contracts; -using Elsa.Mediator.Models; -using Elsa.Workflows.Management.Commands; - -namespace Elsa.Workflows.Management.Handlers.Commands; - -public class SaveWorkflowDefinitionHandler(IWorkflowDefinitionStore store) : ICommandHandler -{ - public async Task HandleAsync(SaveWorkflowDefinitionCommand command, CancellationToken cancellationToken) - { - await store.SaveAsync(command.WorkflowDefinition, cancellationToken); - return Unit.Instance; - } -} \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Management/Handlers/Requests/FindLastVersionOfWorkflowDefinitionHandler.cs b/src/modules/Elsa.Workflows.Management/Handlers/Requests/FindLastVersionOfWorkflowDefinitionHandler.cs deleted file mode 100644 index 9b466293c..000000000 --- a/src/modules/Elsa.Workflows.Management/Handlers/Requests/FindLastVersionOfWorkflowDefinitionHandler.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Elsa.Mediator.Contracts; -using Elsa.Workflows.Management.Entities; -using Elsa.Workflows.Management.Filters; -using Elsa.Workflows.Management.Requests; - -namespace Elsa.Workflows.Management.Handlers.Requests; - -public class FindLastVersionOfWorkflowDefinitionHandler(IWorkflowDefinitionStore store) : IRequestHandler -{ - public Task HandleAsync(FindLastVersionOfWorkflowDefinitionRequest request, CancellationToken cancellationToken) - { - var filter = new WorkflowDefinitionFilter() - { - DefinitionId = request.DefinitionId, - }; - return store.FindLastVersionAsync(filter, cancellationToken: cancellationToken); - } -} \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Management/Handlers/Requests/FindLatestOrPublishedWorkflowDefinitionsHandler.cs b/src/modules/Elsa.Workflows.Management/Handlers/Requests/FindLatestOrPublishedWorkflowDefinitionsHandler.cs deleted file mode 100644 index d074deafc..000000000 --- a/src/modules/Elsa.Workflows.Management/Handlers/Requests/FindLatestOrPublishedWorkflowDefinitionsHandler.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Elsa.Common.Entities; -using Elsa.Common.Models; -using Elsa.Mediator.Contracts; -using Elsa.Workflows.Management.Entities; -using Elsa.Workflows.Management.Filters; -using Elsa.Workflows.Management.Requests; - -namespace Elsa.Workflows.Management.Handlers.Requests; - -public class FindLatestOrPublishedWorkflowDefinitionsHandler(IWorkflowDefinitionStore store) : IRequestHandler> -{ - public Task HandleAsync(FindLastVersionOfWorkflowDefinitionRequest request, CancellationToken cancellationToken) - { - var filter = new WorkflowDefinitionFilter() - { - DefinitionId = request.DefinitionId, - }; - return store.FindLastVersionAsync(filter, cancellationToken: cancellationToken); - } - - public async Task> HandleAsync(FindLatestOrPublishedWorkflowDefinitionsRequest request, CancellationToken cancellationToken) - { - var filter = new WorkflowDefinitionFilter - { - DefinitionId = request.DefinitionId, - VersionOptions = VersionOptions.LatestOrPublished - }; - var order = new WorkflowDefinitionOrder(x => x.Version, OrderDirection.Descending); - return (await store.FindManyAsync(filter, order, cancellationToken)).ToList(); - } -} \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Management/Handlers/Requests/FindWorkflowDefinitionHandler.cs b/src/modules/Elsa.Workflows.Management/Handlers/Requests/FindWorkflowDefinitionHandler.cs deleted file mode 100644 index ee5590568..000000000 --- a/src/modules/Elsa.Workflows.Management/Handlers/Requests/FindWorkflowDefinitionHandler.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Elsa.Common.Entities; -using Elsa.Mediator.Contracts; -using Elsa.Workflows.Management.Entities; -using Elsa.Workflows.Management.Filters; -using Elsa.Workflows.Management.Requests; - -namespace Elsa.Workflows.Management.Handlers.Requests; - -public class FindWorkflowDefinitionHandler(IWorkflowDefinitionStore store) : IRequestHandler -{ - public async Task HandleAsync(FindWorkflowDefinitionRequest request, CancellationToken cancellationToken) - { - var filter = request.Handle.ToFilter(); - var order = new WorkflowDefinitionOrder(x => x.Version, OrderDirection.Descending); - var definition = (await store.FindManyAsync(filter, order, cancellationToken: cancellationToken)).FirstOrDefault(); - return definition; - } -} \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Management/Requests/FindLastVersionOfWorkflowDefinitionRequest.cs b/src/modules/Elsa.Workflows.Management/Requests/FindLastVersionOfWorkflowDefinitionRequest.cs deleted file mode 100644 index 0139c3ce6..000000000 --- a/src/modules/Elsa.Workflows.Management/Requests/FindLastVersionOfWorkflowDefinitionRequest.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Elsa.Mediator.Contracts; -using Elsa.Workflows.Management.Entities; - -namespace Elsa.Workflows.Management.Requests; - -/// -/// A request to find the last version of a workflow definition. -/// -/// The ID of the workflow definition. -public record FindLastVersionOfWorkflowDefinitionRequest(string DefinitionId) : IRequest; \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Management/Requests/FindLatestOrPublishedWorkflowDefinitionsRequest.cs b/src/modules/Elsa.Workflows.Management/Requests/FindLatestOrPublishedWorkflowDefinitionsRequest.cs deleted file mode 100644 index 99b60ca05..000000000 --- a/src/modules/Elsa.Workflows.Management/Requests/FindLatestOrPublishedWorkflowDefinitionsRequest.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Elsa.Mediator.Contracts; -using Elsa.Workflows.Management.Entities; - -namespace Elsa.Workflows.Management.Requests; - -/// -/// A request to find the latest or published workflow definitions. -/// -public record FindLatestOrPublishedWorkflowDefinitionsRequest(string DefinitionId) : IRequest>; \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Management/Requests/FindWorkflowDefinitionRequest.cs b/src/modules/Elsa.Workflows.Management/Requests/FindWorkflowDefinitionRequest.cs deleted file mode 100644 index ec89a902c..000000000 --- a/src/modules/Elsa.Workflows.Management/Requests/FindWorkflowDefinitionRequest.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Elsa.Mediator.Contracts; -using Elsa.Workflows.Management.Entities; -using Elsa.Workflows.Models; - -namespace Elsa.Workflows.Management.Requests; - -/// -/// A request to find a workflow definition. -/// -/// The ID of the workflow definition. -/// The version options. -public record FindWorkflowDefinitionRequest(WorkflowDefinitionHandle Handle) : IRequest; \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Management/Services/WorkflowDefinitionPublisher.cs b/src/modules/Elsa.Workflows.Management/Services/WorkflowDefinitionPublisher.cs index 42e52450f..88640c69d 100644 --- a/src/modules/Elsa.Workflows.Management/Services/WorkflowDefinitionPublisher.cs +++ b/src/modules/Elsa.Workflows.Management/Services/WorkflowDefinitionPublisher.cs @@ -1,13 +1,13 @@ using Elsa.Common; +using Elsa.Common.Entities; using Elsa.Common.Models; using Elsa.Mediator.Contracts; using Elsa.Workflows.Activities; -using Elsa.Workflows.Management.Commands; using Elsa.Workflows.Management.Entities; +using Elsa.Workflows.Management.Filters; using Elsa.Workflows.Management.Materializers; using Elsa.Workflows.Management.Models; using Elsa.Workflows.Management.Notifications; -using Elsa.Workflows.Management.Requests; using Elsa.Workflows.Models; namespace Elsa.Workflows.Management.Services; @@ -69,8 +69,8 @@ public class WorkflowDefinitionPublisher( /// public async Task PublishAsync(string definitionId, CancellationToken cancellationToken = default) { - var handle = WorkflowDefinitionHandle.ByDefinitionId(definitionId, VersionOptions.Latest); - var definition = await mediator.SendAsync(new FindWorkflowDefinitionRequest(handle), cancellationToken); + var filter = WorkflowDefinitionHandle.ByDefinitionId(definitionId, VersionOptions.Latest).ToFilter(); + var definition = await workflowDefinitionStore.FindAsync(filter, cancellationToken); if (definition == null) return new(false, new List @@ -94,14 +94,18 @@ public class WorkflowDefinitionPublisher( var definitionId = definition.DefinitionId; // Reset current latest and published definitions. - var publishedWorkflows = await mediator.SendAsync(new FindLatestOrPublishedWorkflowDefinitionsRequest(definitionId), cancellationToken); + var publishedWorkflows = await workflowDefinitionStore.FindManyAsync(new() + { + DefinitionId = definitionId, + VersionOptions = VersionOptions.LatestOrPublished + }, cancellationToken); foreach (var publishedAndOrLatestWorkflow in publishedWorkflows) { var isPublished = publishedAndOrLatestWorkflow.IsPublished; publishedAndOrLatestWorkflow.IsPublished = false; publishedAndOrLatestWorkflow.IsLatest = false; - await mediator.SendAsync(new SaveWorkflowDefinitionCommand(publishedAndOrLatestWorkflow), cancellationToken); + await workflowDefinitionStore.SaveAsync(publishedAndOrLatestWorkflow, cancellationToken); if (isPublished) await mediator.SendAsync(new WorkflowDefinitionVersionRetracted(publishedAndOrLatestWorkflow), cancellationToken); @@ -110,7 +114,7 @@ public class WorkflowDefinitionPublisher( // Save the newly published definition. definition.IsPublished = true; definition = Initialize(definition); - await mediator.SendAsync(new SaveWorkflowDefinitionCommand(definition), cancellationToken); + await workflowDefinitionStore.SaveAsync(definition, cancellationToken); var affectedWorkflows = new AffectedWorkflows(new List()); await mediator.SendAsync(new WorkflowDefinitionPublished(definition, affectedWorkflows), cancellationToken); @@ -120,8 +124,8 @@ public class WorkflowDefinitionPublisher( /// public async Task RetractAsync(string definitionId, CancellationToken cancellationToken = default) { - var handle = WorkflowDefinitionHandle.ByDefinitionId(definitionId, VersionOptions.Published); - var definition = await mediator.SendAsync(new FindWorkflowDefinitionRequest(handle), cancellationToken); + var filter = WorkflowDefinitionHandle.ByDefinitionId(definitionId, VersionOptions.Published).ToFilter(); + var definition = await workflowDefinitionStore.FindAsync(filter, cancellationToken); if (definition == null) return null; @@ -138,7 +142,7 @@ public class WorkflowDefinitionPublisher( definition.IsPublished = false; await mediator.SendAsync(new WorkflowDefinitionRetracting(definition), cancellationToken); - await mediator.SendAsync(new SaveWorkflowDefinitionCommand(definition), cancellationToken); + await workflowDefinitionStore.SaveAsync(definition, cancellationToken); await mediator.SendAsync(new WorkflowDefinitionRetracted(definition), cancellationToken); return definition; } @@ -146,11 +150,17 @@ public class WorkflowDefinitionPublisher( /// public async Task GetDraftAsync(string definitionId, VersionOptions versionOptions, CancellationToken cancellationToken = default) { - var findLastVersionRequest = new FindLastVersionOfWorkflowDefinitionRequest(definitionId); - var lastVersion = await mediator.SendAsync(findLastVersionRequest, cancellationToken); - var handle = WorkflowDefinitionHandle.ByDefinitionId(definitionId, versionOptions); - var findRequest = new FindWorkflowDefinitionRequest(handle); - var definition = await mediator.SendAsync(findRequest, cancellationToken) ?? lastVersion; + var filter = new WorkflowDefinitionFilter + { + DefinitionId = definitionId, + VersionOptions = versionOptions + }; + var order = new WorkflowDefinitionOrder(x => x.Version, OrderDirection.Descending); + var lastVersion = await workflowDefinitionStore.FindLastVersionAsync(new() + { + DefinitionId = definitionId + }, cancellationToken); + var definition = await workflowDefinitionStore.FindAsync(filter, order, cancellationToken) ?? lastVersion; if (definition == null!) return null; @@ -174,13 +184,17 @@ public class WorkflowDefinitionPublisher( { var draft = definition; var definitionId = definition.DefinitionId; - var lastVersion = await mediator.SendAsync(new FindLastVersionOfWorkflowDefinitionRequest(definitionId), cancellationToken); + var filter = new WorkflowDefinitionFilter + { + DefinitionId = definitionId + }; + var lastVersion = await workflowDefinitionStore.FindLastVersionAsync(filter, cancellationToken); draft.Version = draft.Id == lastVersion?.Id ? lastVersion.Version : lastVersion?.Version + 1 ?? 1; draft.IsLatest = true; draft = Initialize(draft); - await mediator.SendAsync(new SaveWorkflowDefinitionCommand(draft), cancellationToken); + await workflowDefinitionStore.SaveAsync(draft, cancellationToken); if (lastVersion is null) await mediator.SendAsync(new WorkflowDefinitionCreated(definition), cancellationToken); @@ -188,7 +202,7 @@ public class WorkflowDefinitionPublisher( if (lastVersion is { IsPublished: true, IsLatest: true }) { lastVersion.IsLatest = false; - await mediator.SendAsync(new SaveWorkflowDefinitionCommand(lastVersion), cancellationToken); + await workflowDefinitionStore.SaveAsync(lastVersion, cancellationToken); } return draft; diff --git a/src/modules/Elsa.Workflows.Management/Services/WorkflowDefinitionService.cs b/src/modules/Elsa.Workflows.Management/Services/WorkflowDefinitionService.cs index 9a7ddfd09..bd3435846 100644 --- a/src/modules/Elsa.Workflows.Management/Services/WorkflowDefinitionService.cs +++ b/src/modules/Elsa.Workflows.Management/Services/WorkflowDefinitionService.cs @@ -1,8 +1,6 @@ using Elsa.Common.Models; -using Elsa.Mediator.Contracts; using Elsa.Workflows.Management.Entities; using Elsa.Workflows.Management.Filters; -using Elsa.Workflows.Management.Requests; using Elsa.Workflows.Models; namespace Elsa.Workflows.Management.Services; @@ -11,7 +9,6 @@ namespace Elsa.Workflows.Management.Services; public class WorkflowDefinitionService( IWorkflowDefinitionStore workflowDefinitionStore, IWorkflowGraphBuilder workflowGraphBuilder, - IMediator mediator, Func> materializers) : IWorkflowDefinitionService { @@ -45,7 +42,8 @@ public class WorkflowDefinitionService( /// public async Task FindWorkflowDefinitionAsync(WorkflowDefinitionHandle handle, CancellationToken cancellationToken = default) { - return await mediator.SendAsync(new FindWorkflowDefinitionRequest(handle), cancellationToken); + var filter = handle.ToFilter(); + return await workflowDefinitionStore.FindAsync(filter, cancellationToken); } ///