From 7cc638b86f619033b09f5ba09ddce691eeed4f79 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Fri, 7 Feb 2025 19:54:26 +0100 Subject: [PATCH] Add filtering enhancements and clean up code inconsistencies Introduced new filtering capabilities such as `Names`, `Statuses`, `SubStatuses`, and `SearchTerm` for workflow instance filters. Simplified object initialization syntax and removed unnecessary attributes, improving code readability. Added missing dependencies and API service registrations to ensure completeness. --- .../DependencyInjectionExtensions.cs | 2 ++ .../AlterationWorkflowInstanceFilter.cs | 26 +++++++++++++++++++ .../AlterationWorkflowInstanceFilter.cs | 26 +++++++++++++++++++ .../Services/WorkflowInstanceFinder.cs | 6 ++++- .../DefaultAlterationPlanScheduler.cs | 1 - .../Services/MassTransitWorkflowDispatcher.cs | 4 +-- .../Filters/WorkflowInstanceFilter.cs | 6 +++++ .../WorkflowDispatcherExtensions.cs | 8 +++--- 8 files changed, 71 insertions(+), 8 deletions(-) diff --git a/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs b/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs index e7bed4507..ac5752cb6 100644 --- a/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs +++ b/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs @@ -2,6 +2,7 @@ using Elsa.Api.Client.Options; using Elsa.Api.Client.Resources.ActivityDescriptorOptions.Contracts; using Elsa.Api.Client.Resources.ActivityDescriptors.Contracts; using Elsa.Api.Client.Resources.ActivityExecutions.Contracts; +using Elsa.Api.Client.Resources.Alterations.Contracts; using Elsa.Api.Client.Resources.Features.Contracts; using Elsa.Api.Client.Resources.Identity.Contracts; using Elsa.Api.Client.Resources.IncidentStrategies.Contracts; @@ -68,6 +69,7 @@ public static class DependencyInjectionExtensions services.AddApi(builderOptions); services.AddApi(builderOptions); services.AddApi(builderOptions); + services.AddApi(builderOptions); }); } diff --git a/src/clients/Elsa.Api.Client/Resources/Alterations/Models/AlterationWorkflowInstanceFilter.cs b/src/clients/Elsa.Api.Client/Resources/Alterations/Models/AlterationWorkflowInstanceFilter.cs index 6f4419114..ff2e584f7 100644 --- a/src/clients/Elsa.Api.Client/Resources/Alterations/Models/AlterationWorkflowInstanceFilter.cs +++ b/src/clients/Elsa.Api.Client/Resources/Alterations/Models/AlterationWorkflowInstanceFilter.cs @@ -1,3 +1,4 @@ +using Elsa.Api.Client.Resources.WorkflowInstances.Enums; using Elsa.Api.Client.Shared.Models; namespace Elsa.Api.Client.Resources.Alterations.Models; @@ -16,11 +17,26 @@ public class AlterationWorkflowInstanceFilter /// The correlation IDs of the workflow instances that this plan applies to. /// public IEnumerable? CorrelationIds { get; set; } + + /// + /// A collection of names associated with the workflow instances being filtered. + /// + public ICollection? Names { get; set; } + + /// + /// A search term used to filter workflow instances based on matching criteria. + /// + public string? SearchTerm { get; set; } /// /// A collection of timestamp filters used for filtering data based on specified timestamp columns and operators. /// public IEnumerable? TimestampFilters { get; set; } + + /// + /// The IDs of the workflow definitions that this plan applies to. + /// + public ICollection? DefinitionIds { get; set; } /// /// The IDs of the workflow definitions that this plan applies to. @@ -37,6 +53,16 @@ public class AlterationWorkflowInstanceFilter /// public bool? IsSystem { get; set; } = false; + /// + /// Represents the workflow statuses included in the filter. + /// + public ICollection? Statuses { get; set; } + + /// + /// A collection of sub-statuses used to filter workflow instances by their specific sub-state. + /// + public ICollection? SubStatuses { get; set; } + /// /// Represents a collection of filters for activities. /// diff --git a/src/modules/Elsa.Alterations.Core/Models/AlterationWorkflowInstanceFilter.cs b/src/modules/Elsa.Alterations.Core/Models/AlterationWorkflowInstanceFilter.cs index de83e2c32..12d9d863c 100644 --- a/src/modules/Elsa.Alterations.Core/Models/AlterationWorkflowInstanceFilter.cs +++ b/src/modules/Elsa.Alterations.Core/Models/AlterationWorkflowInstanceFilter.cs @@ -1,3 +1,4 @@ +using Elsa.Workflows; using Elsa.Workflows.Management.Models; using JetBrains.Annotations; @@ -19,11 +20,26 @@ public class AlterationWorkflowInstanceFilter /// public IEnumerable? CorrelationIds { get; set; } + /// + /// A collection of names associated with the workflow instances being filtered. + /// + public ICollection? Names { get; set; } + + /// + /// A search term used to filter workflow instances based on matching criteria. + /// + public string? SearchTerm { get; set; } + /// /// A collection of timestamp filters used for filtering data based on specified timestamp columns and operators. /// public IEnumerable? TimestampFilters { get; set; } + /// + /// The IDs of the workflow definitions that this plan applies to. + /// + public ICollection? DefinitionIds { get; set; } + /// /// The IDs of the workflow definitions that this plan applies to. /// @@ -38,6 +54,16 @@ public class AlterationWorkflowInstanceFilter /// Whether the workflow instances to match are system workflows. Defaults to false. /// public bool? IsSystem { get; set; } = false; + + /// + /// Represents the workflow statuses included in the filter. + /// + public ICollection? Statuses { get; set; } + + /// + /// A collection of sub-statuses used to filter workflow instances by their specific sub-state. + /// + public ICollection? SubStatuses { get; set; } /// /// Represents a collection of filters for activities. diff --git a/src/modules/Elsa.Alterations.Core/Services/WorkflowInstanceFinder.cs b/src/modules/Elsa.Alterations.Core/Services/WorkflowInstanceFinder.cs index 457250b2c..ba1f862b3 100644 --- a/src/modules/Elsa.Alterations.Core/Services/WorkflowInstanceFinder.cs +++ b/src/modules/Elsa.Alterations.Core/Services/WorkflowInstanceFinder.cs @@ -17,12 +17,16 @@ public class WorkflowInstanceFinder(IWorkflowInstanceStore workflowInstanceStore var workflowInstanceFilter = new WorkflowInstanceFilter { Ids = filter.WorkflowInstanceIds?.ToList(), + DefinitionIds = filter.DefinitionIds, DefinitionVersionIds = filter.DefinitionVersionIds?.ToList(), CorrelationIds = filter.CorrelationIds?.ToList(), HasIncidents = filter.HasIncidents, IsSystem = filter.IsSystem, TimestampFilters = filter.TimestampFilters?.ToList(), - WorkflowStatus = WorkflowStatus.Running + WorkflowStatuses = filter.Statuses?.ToList(), + WorkflowSubStatuses = filter.SubStatuses?.ToList(), + Names = filter.Names?.ToList(), + SearchTerm = filter.SearchTerm, }; var activityExecutionFilters = filter.ActivityFilters?.Select(x => new ActivityExecutionRecordFilter { diff --git a/src/modules/Elsa.Alterations/Services/DefaultAlterationPlanScheduler.cs b/src/modules/Elsa.Alterations/Services/DefaultAlterationPlanScheduler.cs index 210914691..0edd6f23f 100644 --- a/src/modules/Elsa.Alterations/Services/DefaultAlterationPlanScheduler.cs +++ b/src/modules/Elsa.Alterations/Services/DefaultAlterationPlanScheduler.cs @@ -30,7 +30,6 @@ public class DefaultAlterationPlanScheduler : IAlterationPlanScheduler } /// - [RequiresUnreferencedCode("The type of the object to be deserialized is not known at compile time.")] public async Task SubmitAsync(AlterationPlanParams planParams, CancellationToken cancellationToken = default) { if(string.IsNullOrWhiteSpace(planParams.Id)) diff --git a/src/modules/Elsa.MassTransit/Services/MassTransitWorkflowDispatcher.cs b/src/modules/Elsa.MassTransit/Services/MassTransitWorkflowDispatcher.cs index edf665e58..caf536610 100644 --- a/src/modules/Elsa.MassTransit/Services/MassTransitWorkflowDispatcher.cs +++ b/src/modules/Elsa.MassTransit/Services/MassTransitWorkflowDispatcher.cs @@ -36,7 +36,7 @@ public class MassTransitWorkflowDispatcher( var workflowGraph = await workflowDefinitionService.FindWorkflowGraphAsync(request.DefinitionId, request.VersionOptions, cancellationToken); if (workflowGraph == null) - throw new Exception($"Workflow definition with definition ID '{request.DefinitionId} and version {request.VersionOptions}' not found"); + throw new($"Workflow definition with definition ID '{request.DefinitionId} and version {request.VersionOptions}' not found"); var workflow = workflowGraph.Workflow; var createWorkflowInstanceRequest = new CreateWorkflowInstanceRequest @@ -178,7 +178,7 @@ public class MassTransitWorkflowDispatcher( private async Task GetSendEndpointAsync(DispatchWorkflowOptions? options = default) { var endpointName = endpointChannelFormatter.FormatEndpointName(options?.Channel); - var sendEndpoint = await bus.GetSendEndpoint(new Uri($"queue:{endpointName}")); + var sendEndpoint = await bus.GetSendEndpoint(new($"queue:{endpointName}")); return sendEndpoint; } diff --git a/src/modules/Elsa.Workflows.Management/Filters/WorkflowInstanceFilter.cs b/src/modules/Elsa.Workflows.Management/Filters/WorkflowInstanceFilter.cs index e578468c5..c87c63c52 100644 --- a/src/modules/Elsa.Workflows.Management/Filters/WorkflowInstanceFilter.cs +++ b/src/modules/Elsa.Workflows.Management/Filters/WorkflowInstanceFilter.cs @@ -101,6 +101,11 @@ public class WorkflowInstanceFilter /// public ICollection? TimestampFilters { get; set; } + /// + /// Filter workflow instances by name. + /// + public List? Names { get; set; } + /// /// Applies the filter to the specified query. /// @@ -119,6 +124,7 @@ public class WorkflowInstanceFilter if (filter.ParentWorkflowInstanceIds != null) query = query.Where(x => x.ParentWorkflowInstanceId != null && filter.ParentWorkflowInstanceIds.Contains(x.ParentWorkflowInstanceId)); if (!string.IsNullOrWhiteSpace(filter.CorrelationId)) query = query.Where(x => x.CorrelationId == filter.CorrelationId); if (filter.CorrelationIds != null) query = query.Where(x => filter.CorrelationIds.Contains(x.CorrelationId!)); + if (filter.Names != null) query = query.Where(x => filter.Names.Contains(x.Name!)); if (filter.WorkflowStatus != null) query = query.Where(x => x.Status == filter.WorkflowStatus); if (filter.WorkflowSubStatus != null) query = query.Where(x => x.SubStatus == filter.WorkflowSubStatus); if (filter.WorkflowStatuses != null) query = query.Where(x => filter.WorkflowStatuses.Contains(x.Status)); diff --git a/src/modules/Elsa.Workflows.Runtime/Extensions/WorkflowDispatcherExtensions.cs b/src/modules/Elsa.Workflows.Runtime/Extensions/WorkflowDispatcherExtensions.cs index 1bdc6b87b..cf2dc9c34 100644 --- a/src/modules/Elsa.Workflows.Runtime/Extensions/WorkflowDispatcherExtensions.cs +++ b/src/modules/Elsa.Workflows.Runtime/Extensions/WorkflowDispatcherExtensions.cs @@ -15,7 +15,7 @@ public static class WorkflowDispatcherExtensions /// public static Task DispatchAsync(this IWorkflowDispatcher workflowDispatcher, DispatchWorkflowDefinitionRequest request, CancellationToken cancellationToken = default) { - return workflowDispatcher.DispatchAsync(request, new DispatchWorkflowOptions(), cancellationToken); + return workflowDispatcher.DispatchAsync(request, new(), cancellationToken); } /// @@ -23,7 +23,7 @@ public static class WorkflowDispatcherExtensions /// public static Task DispatchAsync(this IWorkflowDispatcher workflowDispatcher, DispatchWorkflowInstanceRequest request, CancellationToken cancellationToken = default) { - return workflowDispatcher.DispatchAsync(request, new DispatchWorkflowOptions(), cancellationToken); + return workflowDispatcher.DispatchAsync(request, new(), cancellationToken); } /// @@ -31,7 +31,7 @@ public static class WorkflowDispatcherExtensions /// public static Task DispatchAsync(this IWorkflowDispatcher workflowDispatcher, DispatchTriggerWorkflowsRequest request, CancellationToken cancellationToken = default) { - return workflowDispatcher.DispatchAsync(request, new DispatchWorkflowOptions(), cancellationToken); + return workflowDispatcher.DispatchAsync(request, new(), cancellationToken); } /// @@ -39,6 +39,6 @@ public static class WorkflowDispatcherExtensions /// public static Task DispatchAsync(this IWorkflowDispatcher workflowDispatcher, DispatchResumeWorkflowsRequest request, CancellationToken cancellationToken = default) { - return workflowDispatcher.DispatchAsync(request, new DispatchWorkflowOptions(), cancellationToken); + return workflowDispatcher.DispatchAsync(request, new(), cancellationToken); } } \ No newline at end of file