From 8a4e219e07fcb5c4997aef9fe27f0ce7a65dd244 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Wed, 23 Nov 2022 11:20:35 +0100 Subject: [PATCH] Minor renaming --- .../Elsa.Identity/Features/IdentityFeature.cs | 3 + ...ctionExtensions.cs => ModuleExtensions.cs} | 2 +- .../Activities/Composite.cs | 21 +++-- .../Flowchart/Activities/FlowJoin.cs | 6 +- .../Models/{JoinMode.cs => FlowJoinMode.cs} | 2 +- .../Elsa.Workflows.Core/Activities/Fork.cs | 15 ++-- .../Activities/ForkJoinMode.cs | 7 ++ .../Elsa.Workflows.Core/Activities/Join.cs | 84 ------------------- ...ctionExtensions.cs => ModuleExtensions.cs} | 4 +- .../Features/WorkflowsFeature.cs | 4 +- .../Elsa.Workflows.Core/Models/Trigger.cs | 4 +- .../Elsa.Samples.TelnyxIntegration/Program.cs | 3 +- .../Activities/Finish/FinishForkedWorkflow.cs | 2 +- .../Activities/Fork/JoinAnyForkWorkflow.cs | 2 +- .../BlockingAndBreaking/Workflows.cs | 2 +- 15 files changed, 45 insertions(+), 116 deletions(-) rename src/modules/Elsa.Workflows.Api/Extensions/{DependencyInjectionExtensions.cs => ModuleExtensions.cs} (87%) rename src/modules/Elsa.Workflows.Core/Activities/Flowchart/Models/{JoinMode.cs => FlowJoinMode.cs} (77%) create mode 100644 src/modules/Elsa.Workflows.Core/Activities/ForkJoinMode.cs delete mode 100644 src/modules/Elsa.Workflows.Core/Activities/Join.cs rename src/modules/Elsa.Workflows.Core/Extensions/{DependencyInjectionExtensions.cs => ModuleExtensions.cs} (73%) diff --git a/src/modules/Elsa.Identity/Features/IdentityFeature.cs b/src/modules/Elsa.Identity/Features/IdentityFeature.cs index 4f85efeda..cdd2a3851 100644 --- a/src/modules/Elsa.Identity/Features/IdentityFeature.cs +++ b/src/modules/Elsa.Identity/Features/IdentityFeature.cs @@ -12,6 +12,9 @@ using Microsoft.Extensions.DependencyInjection; namespace Elsa.Identity.Features; +/// +/// Provides identity feature to authenticate & authorize API requests. +/// [DependsOn(typeof(SystemClockFeature))] public class IdentityFeature : FeatureBase { diff --git a/src/modules/Elsa.Workflows.Api/Extensions/DependencyInjectionExtensions.cs b/src/modules/Elsa.Workflows.Api/Extensions/ModuleExtensions.cs similarity index 87% rename from src/modules/Elsa.Workflows.Api/Extensions/DependencyInjectionExtensions.cs rename to src/modules/Elsa.Workflows.Api/Extensions/ModuleExtensions.cs index 6e91ea594..231f95399 100644 --- a/src/modules/Elsa.Workflows.Api/Extensions/DependencyInjectionExtensions.cs +++ b/src/modules/Elsa.Workflows.Api/Extensions/ModuleExtensions.cs @@ -4,7 +4,7 @@ using Elsa.Workflows.Api.Features; // ReSharper disable once CheckNamespace namespace Microsoft.Extensions.DependencyInjection; -public static class DependencyInjectionExtensions +public static class ModuleExtensions { public static IModule UseWorkflowApiEndpoints(this IModule module, Action? configure = default) { diff --git a/src/modules/Elsa.Workflows.Core/Activities/Composite.cs b/src/modules/Elsa.Workflows.Core/Activities/Composite.cs index 9525c93d9..c66e61cfd 100644 --- a/src/modules/Elsa.Workflows.Core/Activities/Composite.cs +++ b/src/modules/Elsa.Workflows.Core/Activities/Composite.cs @@ -77,14 +77,19 @@ public abstract class Composite : ActivityBase context.StopPropagation(); } - protected static Inline From(Func activity) => new(activity); - protected static Inline From(Func activity) => new(activity); - protected static Inline From(Action activity) => new(activity); - protected static Inline From(Action activity) => new(activity); - protected static Inline From(Func> activity, MemoryBlockReference? output = default) => new(activity, output); - protected static Inline From(Func> activity, MemoryBlockReference? output = default) => new(activity, output); - protected static Inline From(Func activity, MemoryBlockReference? output = default) => new(activity, output); - protected static Inline From(Func activity, MemoryBlockReference? output = default) => new(activity, output); + protected static Inline Inline(Func activity) => new(activity); + protected static Inline Inline(Func activity) => new(activity); + protected static Inline Inline(Action activity) => new(activity); + protected static Inline Inline(Action activity) => new(activity); + protected static Inline Inline(Func> activity, MemoryBlockReference? output = default) => new(activity, output); + protected static Inline Inline(Func> activity, MemoryBlockReference? output = default) => new(activity, output); + protected static Inline Inline(Func activity, MemoryBlockReference? output = default) => new(activity, output); + protected static Inline Inline(Func activity, MemoryBlockReference? output = default) => new(activity, output); + + protected static SetVariable SetVariable(Variable variable, T value) => new(variable, value); + protected static SetVariable SetVariable(Variable variable, Func value) => new(variable, value); + protected static SetVariable SetVariable(Variable variable, Func value) => new(variable, value); + protected static SetVariable SetVariable(Variable variable, Variable value) => new(variable, value); } /// diff --git a/src/modules/Elsa.Workflows.Core/Activities/Flowchart/Activities/FlowJoin.cs b/src/modules/Elsa.Workflows.Core/Activities/Flowchart/Activities/FlowJoin.cs index 957080d3d..b4623306b 100644 --- a/src/modules/Elsa.Workflows.Core/Activities/Flowchart/Activities/FlowJoin.cs +++ b/src/modules/Elsa.Workflows.Core/Activities/Flowchart/Activities/FlowJoin.cs @@ -10,7 +10,7 @@ namespace Elsa.Workflows.Core.Activities.Flowchart.Activities; [Activity("Elsa", "Flow", "Merge multiple branches into a single branch of execution.")] public class FlowJoin : ActivityBase, IJoinNode { - [Input] public Input Mode { get; set; } = new(Models.JoinMode.WaitAll); + [Input] public Input Mode { get; set; } = new(Models.FlowJoinMode.WaitAll); protected override async ValueTask ExecuteAsync(ActivityExecutionContext context) { @@ -23,14 +23,14 @@ public class FlowJoin : ActivityBase, IJoinNode switch (mode) { - case Models.JoinMode.WaitAll: + case Models.FlowJoinMode.WaitAll: // If all left-inbound activities have executed, complete & continue. var haveAllInboundActivitiesExecuted = inboundActivities.All(x => flowScope.GetExecutionCount(x) > executionCount); if (haveAllInboundActivitiesExecuted) await context.CompleteActivityAsync(); break; - case Models.JoinMode.WaitAny: + case Models.FlowJoinMode.WaitAny: // Only complete if we haven't already executed. var alreadyExecuted = inboundActivities.Max(x => flowScope.GetExecutionCount(x)) == executionCount; diff --git a/src/modules/Elsa.Workflows.Core/Activities/Flowchart/Models/JoinMode.cs b/src/modules/Elsa.Workflows.Core/Activities/Flowchart/Models/FlowJoinMode.cs similarity index 77% rename from src/modules/Elsa.Workflows.Core/Activities/Flowchart/Models/JoinMode.cs rename to src/modules/Elsa.Workflows.Core/Activities/Flowchart/Models/FlowJoinMode.cs index 928f1f1bb..70eb0d800 100644 --- a/src/modules/Elsa.Workflows.Core/Activities/Flowchart/Models/JoinMode.cs +++ b/src/modules/Elsa.Workflows.Core/Activities/Flowchart/Models/FlowJoinMode.cs @@ -1,6 +1,6 @@ namespace Elsa.Workflows.Core.Activities.Flowchart.Models; -public enum JoinMode +public enum FlowJoinMode { WaitAll, WaitAny diff --git a/src/modules/Elsa.Workflows.Core/Activities/Fork.cs b/src/modules/Elsa.Workflows.Core/Activities/Fork.cs index 5c3b225a6..05aaa3aea 100644 --- a/src/modules/Elsa.Workflows.Core/Activities/Fork.cs +++ b/src/modules/Elsa.Workflows.Core/Activities/Fork.cs @@ -1,5 +1,6 @@ using System.Collections.Immutable; using Elsa.Common.Extensions; +using Elsa.Workflows.Core.Activities.Flowchart.Models; using Elsa.Workflows.Core.Attributes; using Elsa.Workflows.Core.Behaviors; using Elsa.Workflows.Core.Models; @@ -8,18 +9,13 @@ using Elsa.Workflows.Core.Services; namespace Elsa.Workflows.Core.Activities; [Activity("Elsa", "Control Flow", "Branch execution into multiple branches.")] -public class Fork : Activity +public class Fork : ActivityBase { - public Fork() - { - Behaviors.Remove(); - } - /// /// Controls when this activity yields control back to its parent activity. /// [Input] - public JoinMode JoinMode { get; set; } = JoinMode.WaitAny; + public ForkJoinMode JoinMode { get; set; } = ForkJoinMode.WaitAny; /// /// The branches to schedule. @@ -27,6 +23,7 @@ public class Fork : Activity [Port] public ICollection Branches { get; set; } = new List(); + /// protected override void Execute(ActivityExecutionContext context) => context.ScheduleActivities(Branches.Reverse(), CompleteChildAsync); private async ValueTask CompleteChildAsync(ActivityExecutionContext context, ActivityExecutionContext childContext) @@ -46,7 +43,7 @@ public class Fork : Activity switch (joinMode) { - case JoinMode.WaitAny: + case ForkJoinMode.WaitAny: { // Remove any and all bookmarks from other branches. RemoveBookmarks(context); @@ -55,7 +52,7 @@ public class Fork : Activity await CompleteAsync(context); } break; - case JoinMode.WaitAll: + case ForkJoinMode.WaitAll: { var allSet = allChildActivityIds.All(x => completedActivityIds.Contains(x)); diff --git a/src/modules/Elsa.Workflows.Core/Activities/ForkJoinMode.cs b/src/modules/Elsa.Workflows.Core/Activities/ForkJoinMode.cs new file mode 100644 index 000000000..f6cc7a4a1 --- /dev/null +++ b/src/modules/Elsa.Workflows.Core/Activities/ForkJoinMode.cs @@ -0,0 +1,7 @@ +namespace Elsa.Workflows.Core.Activities; + +public enum ForkJoinMode +{ + WaitAll, + WaitAny +} \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Core/Activities/Join.cs b/src/modules/Elsa.Workflows.Core/Activities/Join.cs deleted file mode 100644 index 68c1b9c63..000000000 --- a/src/modules/Elsa.Workflows.Core/Activities/Join.cs +++ /dev/null @@ -1,84 +0,0 @@ -using Elsa.Common.Extensions; -using Elsa.Workflows.Core.Attributes; -using Elsa.Workflows.Core.Models; - -namespace Elsa.Workflows.Core.Activities; - -public enum JoinMode -{ - WaitAny, - WaitAll -} - -public class Join : Activity -{ - public Join(JoinMode joinMode = Activities.JoinMode.WaitAny) - { - JoinMode = new Input(joinMode); - } - - [Input] public Input JoinMode { get; set; } - - protected override void Execute(ActivityExecutionContext context) - { - var joinMode = context.Get(JoinMode); - - switch (joinMode) - { - case Activities.JoinMode.WaitAny: - { - // Remove any and all bookmarks from other branches. - RemoveBookmarks(context); - } - break; - case Activities.JoinMode.WaitAll: - { - var workflowExecutionContext = context.WorkflowExecutionContext; - - // Record last executed activity ID. - var lastActivityId = context.WorkflowExecutionContext.ExecutionLog.LastOrDefault(x => x.EventName == WorkflowExecutionLogEventNames.Executed)?.ActivityId; - - if (lastActivityId != null) - { - var recordedActivitiesKey = $"{Id}:RecordedActivities"; - var recordedActivityIds = workflowExecutionContext.UpdateProperty>(recordedActivitiesKey, set => - { - set ??= new HashSet(); - set.Add(lastActivityId); - return set; - }); - - var inboundActivityIds = context.ActivityNode.Parents.Select(x => x.Activity.Id).ToHashSet(); - var allSet = inboundActivityIds.All(x => recordedActivityIds.Contains(x)); - - if (!allSet) - { - // If not all inbound activities have executed yet, instruct engine to not complete this activity. - context.PreventContinuation(); - } - else - { - // If all inbound activities have executed, clean global state. - workflowExecutionContext.Properties.Remove(recordedActivitiesKey); - } - } - - break; - } - } - } - - private void RemoveBookmarks(ActivityExecutionContext context) - { - var workflowExecutionContext = context.WorkflowExecutionContext; - - // Remove all bookmarks of ancestors and siblings. - var joinNode = context.ActivityNode; - var ancestors = joinNode.Ancestors().Select(x => x.Activity.Id); - var siblingsAndCousins = joinNode.SiblingsAndCousins().Select(x => x.Activity.Id); - var activitiesInPath = ancestors.Concat(siblingsAndCousins).ToHashSet(); - - // Remove any bookmarks of any ancestors. - workflowExecutionContext.Bookmarks.RemoveWhere(x => activitiesInPath.Contains(x.ActivityId)); - } -} \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Core/Extensions/DependencyInjectionExtensions.cs b/src/modules/Elsa.Workflows.Core/Extensions/ModuleExtensions.cs similarity index 73% rename from src/modules/Elsa.Workflows.Core/Extensions/DependencyInjectionExtensions.cs rename to src/modules/Elsa.Workflows.Core/Extensions/ModuleExtensions.cs index 8e6ce07d5..ac514df19 100644 --- a/src/modules/Elsa.Workflows.Core/Extensions/DependencyInjectionExtensions.cs +++ b/src/modules/Elsa.Workflows.Core/Extensions/ModuleExtensions.cs @@ -5,7 +5,7 @@ using Microsoft.Extensions.DependencyInjection; namespace Elsa.Workflows.Core; -public static class DependencyInjectionExtensions +public static class ModuleExtensions { public static IModule UseWorkflows(this IModule configuration, Action? configure = default) { @@ -13,7 +13,7 @@ public static class DependencyInjectionExtensions return configuration; } - public static IServiceCollection AddDataDrive(this IServiceCollection services) where T : class, IStorageDriver + public static IServiceCollection AddStorageDriver(this IServiceCollection services) where T : class, IStorageDriver { return services.AddSingleton(); } diff --git a/src/modules/Elsa.Workflows.Core/Features/WorkflowsFeature.cs b/src/modules/Elsa.Workflows.Core/Features/WorkflowsFeature.cs index 0502422d3..f2237f11d 100644 --- a/src/modules/Elsa.Workflows.Core/Features/WorkflowsFeature.cs +++ b/src/modules/Elsa.Workflows.Core/Features/WorkflowsFeature.cs @@ -89,8 +89,8 @@ public class WorkflowsFeature : FeatureBase // Data drives. .AddSingleton() - .AddDataDrive() - .AddDataDrive() + .AddStorageDriver() + .AddStorageDriver() // Logging .AddLogging(); diff --git a/src/modules/Elsa.Workflows.Core/Models/Trigger.cs b/src/modules/Elsa.Workflows.Core/Models/Trigger.cs index a28b60d24..c3a138c73 100644 --- a/src/modules/Elsa.Workflows.Core/Models/Trigger.cs +++ b/src/modules/Elsa.Workflows.Core/Models/Trigger.cs @@ -12,12 +12,12 @@ public abstract class Trigger : ActivityBase, ITrigger { } - ValueTask> ITrigger.GetTriggerPayloadsAsync(TriggerIndexingContext context) => GetTriggerDataAsync(context); + ValueTask> ITrigger.GetTriggerPayloadsAsync(TriggerIndexingContext context) => GetTriggerPayloadsAsync(context); /// /// Override this method to return trigger data. /// - protected virtual ValueTask> GetTriggerDataAsync(TriggerIndexingContext context) + protected virtual ValueTask> GetTriggerPayloadsAsync(TriggerIndexingContext context) { var hashes = GetTriggerPayloads(context); return ValueTask.FromResult(hashes); diff --git a/src/samples/aspnet/Elsa.Samples.TelnyxIntegration/Program.cs b/src/samples/aspnet/Elsa.Samples.TelnyxIntegration/Program.cs index 6c9ed1342..c9ac3ee3e 100644 --- a/src/samples/aspnet/Elsa.Samples.TelnyxIntegration/Program.cs +++ b/src/samples/aspnet/Elsa.Samples.TelnyxIntegration/Program.cs @@ -1,6 +1,7 @@ using Elsa.Extensions; using Elsa.Features.Extensions; using Elsa.Identity; +using Elsa.Identity.Extensions; using Elsa.Identity.Features; using Elsa.Identity.Options; using Elsa.JavaScript.Activities; @@ -60,7 +61,7 @@ services .AddActivity() .AddActivitiesFrom() ) - .Use(identity => + .UseIdentity(identity => { identity.CreateDefaultUser = true; identity.IdentityOptions = options => identitySection.Bind(options); diff --git a/test/Elsa.IntegrationTests/Activities/Finish/FinishForkedWorkflow.cs b/test/Elsa.IntegrationTests/Activities/Finish/FinishForkedWorkflow.cs index a818af9d7..d267f9215 100644 --- a/test/Elsa.IntegrationTests/Activities/Finish/FinishForkedWorkflow.cs +++ b/test/Elsa.IntegrationTests/Activities/Finish/FinishForkedWorkflow.cs @@ -9,7 +9,7 @@ public class FinishForkedWorkflow : WorkflowBase { workflow.WithRoot(new Fork { - JoinMode = JoinMode.WaitAll, + JoinMode = ForkJoinMode.WaitAll, Branches = { new Sequence diff --git a/test/Elsa.IntegrationTests/Activities/Fork/JoinAnyForkWorkflow.cs b/test/Elsa.IntegrationTests/Activities/Fork/JoinAnyForkWorkflow.cs index 8c300f57e..791ad26e9 100644 --- a/test/Elsa.IntegrationTests/Activities/Fork/JoinAnyForkWorkflow.cs +++ b/test/Elsa.IntegrationTests/Activities/Fork/JoinAnyForkWorkflow.cs @@ -50,7 +50,7 @@ public class JoinAnyForkWorkflow : WorkflowBase } }, }, - JoinMode = JoinMode.WaitAny + JoinMode = ForkJoinMode.WaitAny }, new WriteLine("End") } diff --git a/test/Elsa.IntegrationTests/Scenarios/BlockingAndBreaking/Workflows.cs b/test/Elsa.IntegrationTests/Scenarios/BlockingAndBreaking/Workflows.cs index cd0f222a5..4a47ddad9 100644 --- a/test/Elsa.IntegrationTests/Scenarios/BlockingAndBreaking/Workflows.cs +++ b/test/Elsa.IntegrationTests/Scenarios/BlockingAndBreaking/Workflows.cs @@ -21,7 +21,7 @@ public class BreakWhileBlockForkWorkflow : WorkflowBase { new Fork { - JoinMode = JoinMode.WaitAll, + JoinMode = ForkJoinMode.WaitAll, Branches = { new Sequence