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