diff --git a/src/activities/Elsa.Activities.Telnyx/Activities/CallRingGroup.cs b/src/activities/Elsa.Activities.Telnyx/Activities/CallRingGroup.cs index 5282d1027..9cf692c86 100644 --- a/src/activities/Elsa.Activities.Telnyx/Activities/CallRingGroup.cs +++ b/src/activities/Elsa.Activities.Telnyx/Activities/CallRingGroup.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Reflection; using Elsa.Activities.ControlFlow; +using Elsa.Activities.Telnyx.Webhooks.Payloads.Call; using Elsa.Attributes; using Elsa.Builders; using Elsa.Design; @@ -85,7 +86,7 @@ namespace Elsa.Activities.Telnyx.Activities .WithFrom(() => From) .WithFromDisplayName(() => FromDisplayName) ) - .Then(); + .ThenTypeNamed(CallAnsweredPayload.ActivityTypeName); } object IActivityPropertyDefaultValueProvider.GetDefaultValue(PropertyInfo property) => Duration.FromSeconds(20); diff --git a/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallAnsweredPayload.cs b/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallAnsweredPayload.cs index a606c5c6c..a33b799f2 100644 --- a/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallAnsweredPayload.cs +++ b/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallAnsweredPayload.cs @@ -2,10 +2,11 @@ namespace Elsa.Activities.Telnyx.Webhooks.Payloads.Call { - [Payload(EventType, "TelnyxCallAnswered", "Call Answered", "Triggered when an incoming call is answered.")] + [Payload(EventType, ActivityTypeName, "Call Answered", "Triggered when an incoming call is answered.")] public sealed record CallAnsweredPayload : CallPayload { public const string EventType = "call.answered"; + public const string ActivityTypeName = "CallAnswered"; public string From { get; init; } = default!; public string To { get; init; } = default!; public string State { get; init; } = default!; diff --git a/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallDtmfReceived.cs b/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallDtmfReceivedPayload.cs similarity index 56% rename from src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallDtmfReceived.cs rename to src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallDtmfReceivedPayload.cs index 2e32124f8..469814107 100644 --- a/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallDtmfReceived.cs +++ b/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallDtmfReceivedPayload.cs @@ -2,10 +2,11 @@ namespace Elsa.Activities.Telnyx.Webhooks.Payloads.Call { - [Payload(EventType, "TelnyxCallDtmfReceived", "Call DTMF Received", "Triggered when DTMF input is received.")] - public sealed record CallDtmfReceived : CallPayload + [Payload(EventType, ActivityTypeName, "Call DTMF Received", "Triggered when DTMF input is received.")] + public sealed record CallDtmfReceivedPayload : CallPayload { public const string EventType = "call.dtmf.received"; + public const string ActivityTypeName = "CallDtmfReceived"; public string Digit { get; set; } public string From { get; set; } public string To { get; set; } diff --git a/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallGatherEnded.cs b/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallGatherEndedPayload.cs similarity index 59% rename from src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallGatherEnded.cs rename to src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallGatherEndedPayload.cs index 94fe67571..3059e279c 100644 --- a/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallGatherEnded.cs +++ b/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallGatherEndedPayload.cs @@ -2,10 +2,11 @@ namespace Elsa.Activities.Telnyx.Webhooks.Payloads.Call { - [Payload(EventType, "TelnyxCallGatherEnded", "Call Gather Ended", "Triggered when an call gather has ended.")] - public sealed record CallGatherEnded : CallPayload + [Payload(EventType, ActivityTypeName, "Call Gather Ended", "Triggered when an call gather has ended.")] + public sealed record CallGatherEndedPayload : CallPayload { public const string EventType = "call.gather.ended"; + public const string ActivityTypeName = "CallGatherEnded"; public string Digits { get; set; } public string From { get; set; } public string To { get; set; } diff --git a/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallHangupPayload.cs b/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallHangupPayload.cs index efde1da4f..327bf925a 100644 --- a/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallHangupPayload.cs +++ b/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallHangupPayload.cs @@ -3,10 +3,11 @@ using NodaTime; namespace Elsa.Activities.Telnyx.Webhooks.Payloads.Call { - [Payload(EventType, "TelnyxCallHangup", "Call Hangup", "Triggered when an incoming call was hangup.")] + [Payload(EventType, ActivityTypeName, "Call Hangup", "Triggered when an incoming call was hangup.")] public sealed record CallHangupPayload : CallPayload { public const string EventType = "call.hangup"; + public const string ActivityTypeName = "CallHangup"; public Instant StartTime { get; init; } public Instant EndTime { get; init; } public string SipHangupCause { get; init; } = default!; diff --git a/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallInitiatedPayload.cs b/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallInitiatedPayload.cs index 1b3df9a3b..72cb6f51b 100644 --- a/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallInitiatedPayload.cs +++ b/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallInitiatedPayload.cs @@ -2,10 +2,11 @@ namespace Elsa.Activities.Telnyx.Webhooks.Payloads.Call { - [Payload(EventType, "TelnyxCallInitiated", "Call Initiated", "Triggered when an incoming call is received.")] + [Payload(EventType, ActivityTypeName, "Call Initiated", "Triggered when an incoming call is received.")] public sealed record CallInitiatedPayload : CallPayload { public const string EventType = "call.initiated"; + public const string ActivityTypeName = "CallInitiated"; public string Direction { get; init; } = default!; public string State { get; init; } = default!; } diff --git a/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallPlaybackEnded.cs b/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallPlaybackEnded.cs deleted file mode 100644 index ada6d0c84..000000000 --- a/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallPlaybackEnded.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Elsa.Activities.Telnyx.Webhooks.Attributes; - -namespace Elsa.Activities.Telnyx.Webhooks.Payloads.Call -{ - [Payload(EventType, "TelnyxCallPlaybackEnded", "Call Playback Ended", "Triggered when an audio playback has ended.")] - public sealed record CallPlaybackEnded : CallPlayback - { - public const string EventType = "call.playback.ended"; - public string Status { get; set; } - } -} \ No newline at end of file diff --git a/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallPlaybackEndedPayload.cs b/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallPlaybackEndedPayload.cs new file mode 100644 index 000000000..2b02503a7 --- /dev/null +++ b/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallPlaybackEndedPayload.cs @@ -0,0 +1,12 @@ +using Elsa.Activities.Telnyx.Webhooks.Attributes; + +namespace Elsa.Activities.Telnyx.Webhooks.Payloads.Call +{ + [Payload(EventType, ActivityTypeName, "Call Playback Ended", "Triggered when an audio playback has ended.")] + public sealed record CallPlaybackEndedPayload : CallPlayback + { + public const string EventType = "call.playback.ended"; + public const string ActivityTypeName = "CallPlaybackEnded"; + public string Status { get; set; } + } +} \ No newline at end of file diff --git a/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallPlaybackStarted.cs b/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallPlaybackStarted.cs deleted file mode 100644 index 1700068b2..000000000 --- a/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallPlaybackStarted.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Elsa.Activities.Telnyx.Webhooks.Attributes; - -namespace Elsa.Activities.Telnyx.Webhooks.Payloads.Call -{ - [Payload(EventType, "TelnyxCallPlaybackStarted", "Call Playback Started", "Triggered when an audio playback has started.")] - public sealed record CallPlaybackStarted : CallPlayback - { - public const string EventType = "call.playback.started"; - } -} \ No newline at end of file diff --git a/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallPlaybackStartedPayload.cs b/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallPlaybackStartedPayload.cs new file mode 100644 index 000000000..e17e24f90 --- /dev/null +++ b/src/activities/Elsa.Activities.Telnyx/Webhooks/Payloads/Call/CallPlaybackStartedPayload.cs @@ -0,0 +1,11 @@ +using Elsa.Activities.Telnyx.Webhooks.Attributes; + +namespace Elsa.Activities.Telnyx.Webhooks.Payloads.Call +{ + [Payload(EventType, ActivityTypeName, "Call Playback Started", "Triggered when an audio playback has started.")] + public sealed record CallPlaybackStartedPayload : CallPlayback + { + public const string EventType = "call.playback.started"; + public const string ActivityTypeName = "CallPlaybackStarted"; + } +} \ No newline at end of file diff --git a/src/core/Elsa.Abstractions/Builders/IActivityBuilder.cs b/src/core/Elsa.Abstractions/Builders/IActivityBuilder.cs index 2387bf0f3..1eca04705 100644 --- a/src/core/Elsa.Abstractions/Builders/IActivityBuilder.cs +++ b/src/core/Elsa.Abstractions/Builders/IActivityBuilder.cs @@ -10,6 +10,7 @@ namespace Elsa.Builders { ICompositeActivityBuilder WorkflowBuilder { get; set; } public Type ActivityType { get; } + public string ActivityTypeName { get; } string ActivityId { get; set; } public string? Name { get; set; } public string? DisplayName { get; set; } @@ -20,10 +21,10 @@ namespace Elsa.Builders bool SaveWorkflowContextEnabled { get; set; } bool PersistOutputEnabled { get; set; } string? Source { get; } - IActivityBuilder Add(Action>? setup = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) where T : class, IActivity; + IActivityBuilder Add(string activityTypeName, Action>? setup = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) where T : class, IActivity; IOutcomeBuilder When(string outcome); IActivityBuilder Then(IActivityBuilder targetActivity); - IConnectionBuilder Then(string activityName); + IConnectionBuilder ThenNamed(string activityName); IActivityBuilder WithId(string? value); IActivityBuilder WithName(string? value); IActivityBuilder WithDisplayName(string? value); diff --git a/src/core/Elsa.Abstractions/Builders/IBuilder.cs b/src/core/Elsa.Abstractions/Builders/IBuilder.cs index 00249c0c2..1ede99e80 100644 --- a/src/core/Elsa.Abstractions/Builders/IBuilder.cs +++ b/src/core/Elsa.Abstractions/Builders/IBuilder.cs @@ -6,7 +6,9 @@ namespace Elsa.Builders { public interface IBuilder { - IActivityBuilder Then(Action>? setup, Action? branch = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) where T : class, IActivity; - IActivityBuilder Then(Action? branch = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) where T : class, IActivity; + IActivityBuilder Then(string activityTypeName, Action>? setup, Action? branch = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) + where T : class, IActivity; + + IActivityBuilder Then(string activityTypeName, Action? branch = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) where T : class, IActivity; } } \ No newline at end of file diff --git a/src/core/Elsa.Abstractions/Builders/ICompositeActivityBuilder.cs b/src/core/Elsa.Abstractions/Builders/ICompositeActivityBuilder.cs index f8df71757..d87f6b695 100644 --- a/src/core/Elsa.Abstractions/Builders/ICompositeActivityBuilder.cs +++ b/src/core/Elsa.Abstractions/Builders/ICompositeActivityBuilder.cs @@ -12,34 +12,37 @@ namespace Elsa.Builders IReadOnlyCollection Activities { get; } IActivityBuilder New( + string activityTypeName, IDictionary? propertyValueProviders = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) where T : class, IActivity; IActivityBuilder New( + string activityTypeName, Action>? setup, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) where T : class, IActivity; IActivityBuilder StartWith( + string activityTypeName, Action>? setup, Action? branch = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) where T : class, IActivity; - IActivityBuilder StartWith(Action? branch = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) where T : class, IActivity; + IActivityBuilder StartWith(string activityTypeName, Action? branch = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) where T : class, IActivity; IActivityBuilder Add( + string activityTypeName, Action>? setup, Action? branch = default, - string? activityType = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) where T : class, IActivity; IActivityBuilder Add( + string activityTypeName, Action? branch = default, - string? activityType = default, IDictionary? propertyValueProviders = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) diff --git a/src/core/Elsa.Abstractions/Builders/ISetupActivity.cs b/src/core/Elsa.Abstractions/Builders/ISetupActivity.cs index 3fd687daf..3c780f2b5 100644 --- a/src/core/Elsa.Abstractions/Builders/ISetupActivity.cs +++ b/src/core/Elsa.Abstractions/Builders/ISetupActivity.cs @@ -17,11 +17,11 @@ namespace Elsa.Builders public static class SetupActivityExtensions { - // public static ISetupActivity Set( - // this ISetupActivity builder, - // Expression> propertyAccessor, - // Func> valueFactory) where T : IActivity => - // builder.Set(propertyAccessor, async context => await valueFactory(context)); + public static ISetupActivity Set( + this ISetupActivity builder, + Expression> propertyAccessor, + Func> valueFactory) where T : IActivity => + builder.Set(propertyAccessor, async context => await valueFactory(context)); public static ISetupActivity Set( this ISetupActivity builder, diff --git a/src/core/Elsa.Core/Builders/ActivityBuilder.cs b/src/core/Elsa.Core/Builders/ActivityBuilder.cs index d1fd4dc88..0791d0f45 100644 --- a/src/core/Elsa.Core/Builders/ActivityBuilder.cs +++ b/src/core/Elsa.Core/Builders/ActivityBuilder.cs @@ -6,20 +6,21 @@ using System.Runtime.CompilerServices; using Elsa.Services; using Elsa.Services.Models; +// ReSharper disable ExplicitCallerInfoArgument namespace Elsa.Builders { public class ActivityBuilder : IActivityBuilder { public ActivityBuilder( Type activityType, - string? activityTypeName, + string activityTypeName, ICompositeActivityBuilder workflowBuilder, IDictionary? propertyValueProviders, int lineNumber, string? sourceFile) { ActivityType = activityType; - ActivityTypeName = activityTypeName ?? activityType.Name; + ActivityTypeName = activityTypeName; WorkflowBuilder = workflowBuilder; PropertyValueProviders = propertyValueProviders; LineNumber = lineNumber; @@ -31,7 +32,7 @@ namespace Elsa.Builders } public Type ActivityType { get; protected set; } = default!; - public string ActivityTypeName { get; set; } = default!; + public string ActivityTypeName { get; protected set; } = default!; public ICompositeActivityBuilder WorkflowBuilder { get; set; } = default!; public string ActivityId { get; set; } = default!; public string? Name { get; set; } @@ -47,27 +48,27 @@ namespace Elsa.Builders public string? Source => SourceFile != null && LineNumber != default ? $"{Path.GetFileName(SourceFile)}:{LineNumber}" : default; public IActivityBuilder Add( + string activityTypeName, Action>? setup = default, - string? activityType = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) where T : class, IActivity => - WorkflowBuilder.Add(setup, null, activityType, lineNumber, sourceFile); + WorkflowBuilder.Add(activityTypeName, setup, null, lineNumber, sourceFile); public IOutcomeBuilder When(string outcome) => new OutcomeBuilder(WorkflowBuilder, this, outcome); public virtual IActivityBuilder Then( + string activityTypeName, Action>? setup = null, Action? branch = null, - string? activityType = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) where T : class, IActivity => - When(OutcomeNames.Done).Then(setup, branch, act, lineNumber, sourceFile); + When(OutcomeNames.Done).Then(activityTypeName, setup, branch, lineNumber, sourceFile); - public virtual IActivityBuilder Then(Action? branch = null, string? activityTypeName = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) + public virtual IActivityBuilder Then(string activityTypeName, Action? branch = null, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) where T : class, IActivity => - When(OutcomeNames.Done).Then(branch, lineNumber, sourceFile); + When(OutcomeNames.Done).Then(activityTypeName, branch, lineNumber, sourceFile); public virtual IActivityBuilder Then(IActivityBuilder targetActivity) { @@ -75,7 +76,7 @@ namespace Elsa.Builders return this; } - public virtual IConnectionBuilder Then(string activityName) => + public virtual IConnectionBuilder ThenNamed(string activityName) => WorkflowBuilder.Connect( () => this, () => WorkflowBuilder.Activities.First(x => x.Name == activityName)); diff --git a/src/core/Elsa.Core/Builders/ActivityBuilderExtensions.cs b/src/core/Elsa.Core/Builders/ActivityBuilderExtensions.cs index 41d072c6a..1bb2c662f 100644 --- a/src/core/Elsa.Core/Builders/ActivityBuilderExtensions.cs +++ b/src/core/Elsa.Core/Builders/ActivityBuilderExtensions.cs @@ -1,65 +1,18 @@ -using System; +using System; using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using Elsa.Activities.Primitives; -using Elsa.ActivityResults; -using Elsa.Services.Models; +using Elsa.Services; // ReSharper disable ExplicitCallerInfoArgument namespace Elsa.Builders { public static class ActivityBuilderExtensions { - public static IActivityBuilder Then( - this IBuilder builder, - Func> activity, + public static IActivityBuilder Add( + this IActivityBuilder activityBuilder, + Action>? setup = default, [CallerLineNumber] int lineNumber = default, - [CallerFilePath] string? sourceFile = default) => - builder.Then(inline => inline.Set(x => x.Function, RunInline(activity)), null, lineNumber, sourceFile); - - public static IActivityBuilder - Then(this IBuilder builder, Func activity, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => - builder.Then(inline => inline.Set(x => x.Function, RunInline(activity)), null, lineNumber, sourceFile); - - public static IActivityBuilder Then(this IBuilder builder, Action activity, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => - builder.Then(inline => inline.Set(x => x.Function, RunInline(activity)), null, lineNumber, sourceFile); - - public static IActivityBuilder Then(this IBuilder builder, Action activity) => - builder.Then(inline => inline.Set(x => x.Function, RunInline(activity))); - - private static Func> RunInline( - Func> activity) => - async context => await activity(context); - - private static Func> RunInline( - Func activity) => - async context => - { - await activity(context); - return new OutcomeResult(); - }; - - private static Func> RunInline( - Action activity) => - context => - { - activity(context); - return new ValueTask(new OutcomeResult()); - }; - - private static Func> RunInline( - Func activity) => - async context => - { - await activity(context); - return new OutcomeResult(); - }; - - private static Func> RunInline(Action activity) => - context => - { - activity(); - return new ValueTask(new OutcomeResult()); - }; + [CallerFilePath] string? sourceFile = default) + where T : class, IActivity => + activityBuilder.Add(typeof(T).Name, setup, lineNumber, sourceFile); } } \ No newline at end of file diff --git a/src/core/Elsa.Core/Builders/BuilderExtensions.cs b/src/core/Elsa.Core/Builders/BuilderExtensions.cs new file mode 100644 index 000000000..963bd0e80 --- /dev/null +++ b/src/core/Elsa.Core/Builders/BuilderExtensions.cs @@ -0,0 +1,42 @@ +using System; +using System.Runtime.CompilerServices; +using Elsa.Services; + +// ReSharper disable ExplicitCallerInfoArgument +namespace Elsa.Builders +{ + public static class BuilderExtensions + { + public static IActivityBuilder Then( + this IBuilder builder, + Action>? setup, + Action? branch = default, + [CallerLineNumber] int lineNumber = default, + [CallerFilePath] string? sourceFile = default) + where T : class, IActivity => builder.Then(typeof(T).Name, setup, branch, lineNumber, sourceFile); + + public static IActivityBuilder ThenTypeNamed( + this IBuilder builder, + string activityTypeName, + Action>? setup, + Action? branch = default, + [CallerLineNumber] int lineNumber = default, + [CallerFilePath] string? sourceFile = default) + => builder.Then(activityTypeName, setup, branch, lineNumber, sourceFile); + + public static IActivityBuilder Then( + this IBuilder builder, + Action? branch = default, + [CallerLineNumber] int lineNumber = default, + [CallerFilePath] string? sourceFile = default) where T : class, IActivity => + builder.Then(typeof(T).Name, branch, lineNumber, sourceFile); + + public static IActivityBuilder ThenTypeNamed( + this IBuilder builder, + string activityTypeName, + Action? branch = default, + [CallerLineNumber] int lineNumber = default, + [CallerFilePath] string? sourceFile = default) => + builder.Then(activityTypeName, branch, lineNumber, sourceFile); + } +} \ No newline at end of file diff --git a/src/core/Elsa.Core/Builders/CompositeActivityBuilder.cs b/src/core/Elsa.Core/Builders/CompositeActivityBuilder.cs index ae98d5e00..8054c3a10 100644 --- a/src/core/Elsa.Core/Builders/CompositeActivityBuilder.cs +++ b/src/core/Elsa.Core/Builders/CompositeActivityBuilder.cs @@ -14,12 +14,11 @@ namespace Elsa.Builders public class CompositeActivityBuilder : ActivityBuilder, ICompositeActivityBuilder { private readonly Func _compositeActivityBuilderFactory; - private readonly IGetsStartActivitiesForCompositeActivityBlueprint startingActivitiesProvider; + private readonly IGetsStartActivitiesForCompositeActivityBlueprint _startingActivitiesProvider; public CompositeActivityBuilder(IServiceProvider serviceProvider, IGetsStartActivitiesForCompositeActivityBlueprint startingActivitiesProvider) { - this.startingActivitiesProvider = startingActivitiesProvider ?? throw new ArgumentNullException(nameof(startingActivitiesProvider)); - + _startingActivitiesProvider = startingActivitiesProvider ?? throw new ArgumentNullException(nameof(startingActivitiesProvider)); ServiceProvider = serviceProvider; ActivityBuilders = new List(); ConnectionBuilders = new List(); @@ -40,7 +39,7 @@ namespace Elsa.Builders public IActivityBuilder New( Type activityType, - string? activityTypeName = default, + string activityTypeName, IDictionary? propertyValueProviders = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) @@ -50,7 +49,7 @@ namespace Elsa.Builders } public IActivityBuilder New( - string? activityTypeName = default, + string activityTypeName, IDictionary? propertyValueProviders = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) @@ -58,8 +57,8 @@ namespace Elsa.Builders New(typeof(T), activityTypeName, propertyValueProviders, lineNumber, sourceFile); public IActivityBuilder New( + string activityTypeName, Action>? setup = default, - string? activityTypeName = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) where T : class, IActivity { @@ -74,62 +73,58 @@ namespace Elsa.Builders } public IActivityBuilder StartWith( + string activityTypeName, Action>? setup = default, Action? branch = default, - string? activityTypeName = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) where T : class, IActivity { - var activityBuilder = New(setup, activityTypeName, lineNumber, sourceFile); + var activityBuilder = New(activityTypeName, setup, lineNumber, sourceFile); return Add(activityBuilder, branch); } - public IActivityBuilder StartWith(Action? branch = default, string? activityTypeName = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) + public IActivityBuilder StartWith(string activityTypeName, Action? branch = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) where T : class, IActivity => - Add(branch, activityTypeName, null, lineNumber, sourceFile); + Add(activityTypeName, branch, null, lineNumber, sourceFile); public IActivityBuilder Add( + string activityTypeName, Action>? setup = default, Action? branch = default, - string? activityType = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) where T : class, IActivity { - var activityBuilder = New(setup, activityType, lineNumber, sourceFile); + var activityBuilder = New(activityTypeName, setup, lineNumber, sourceFile); return Add(activityBuilder, branch); } public IActivityBuilder Add( + string activityTypeName, Action? branch = default, - string? activityType = default, IDictionary? propertyValueProviders = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) where T : class, IActivity { - var activityBuilder = new ActivityBuilder(typeof(T), activityType, this, propertyValueProviders, lineNumber, sourceFile); + var activityBuilder = new ActivityBuilder( typeof(T), activityTypeName, this, propertyValueProviders, lineNumber, sourceFile); return Add(activityBuilder, branch); } - public IActivityBuilder Add(IActivityBuilder activityBuilder, Action? branch = default) + public IActivityBuilder Add( + IActivityBuilder activityBuilder, + Action? branch = default) { branch?.Invoke(activityBuilder); ActivityBuilders.Add(activityBuilder); return activityBuilder; } - public override IActivityBuilder Then( - Action>? setup = null, - Action? branch = null, - string? activityTypeName = default, - [CallerLineNumber] int lineNumber = default, - [CallerFilePath] string? sourceFile = default) => - StartWith(setup, branch, activityTypeName, lineNumber, sourceFile); + public override IActivityBuilder Then(string activityTypeName, Action>? setup = null, Action? branch = null, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => + StartWith(activityTypeName,setup, branch, lineNumber, sourceFile); public override IActivityBuilder Then(IActivityBuilder targetActivity) => Add(targetActivity); - public override IActivityBuilder Then(Action? branch = null, string? activityTypeName = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) - where T : class, IActivity => StartWith(branch, activityTypeName, lineNumber, sourceFile); + public override IActivityBuilder Then(string activityTypeName, Action? branch = null, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => StartWith(activityTypeName, branch, lineNumber, sourceFile); public IConnectionBuilder Connect( IActivityBuilder source, @@ -215,18 +210,18 @@ namespace Elsa.Builders compositeActivityBlueprint.ActivityPropertyProviders = compositeActivityBlueprint.ActivityPropertyProviders; // Connect the composite activity to its starting activities. - var startActivities = startingActivitiesProvider.GetStartActivities(compositeActivityBlueprint).ToList(); + var startActivities = _startingActivitiesProvider.GetStartActivities(compositeActivityBlueprint).ToList(); connections.AddRange(startActivities.Select(x => new Connection(compositeActivityBlueprint, x, CompositeActivity.Enter))); } } - private IActivityBlueprint BuildActivityBlueprint(IActivityBuilder builder, ICompositeActivityBlueprint parent) + private static IActivityBlueprint BuildActivityBlueprint(IActivityBuilder builder, ICompositeActivityBlueprint parent) { var isComposite = typeof(CompositeActivity).IsAssignableFrom(builder.ActivityType); return isComposite - ? new CompositeActivityBlueprint(builder.ActivityId, parent, builder.Name, builder.DisplayName, builder.Description, builder.ActivityType.Name, builder.PersistWorkflowEnabled, builder.LoadWorkflowContextEnabled, + ? new CompositeActivityBlueprint(builder.ActivityId, parent, builder.Name, builder.DisplayName, builder.Description, builder.ActivityTypeName, builder.PersistWorkflowEnabled, builder.LoadWorkflowContextEnabled, builder.SaveWorkflowContextEnabled, builder.PersistOutputEnabled, builder.Source) - : new ActivityBlueprint(builder.ActivityId, parent, builder.Name, builder.DisplayName, builder.Description, builder.ActivityType.Name, builder.PersistWorkflowEnabled, builder.LoadWorkflowContextEnabled, + : new ActivityBlueprint(builder.ActivityId, parent, builder.Name, builder.DisplayName, builder.Description, builder.ActivityTypeName, builder.PersistWorkflowEnabled, builder.LoadWorkflowContextEnabled, builder.SaveWorkflowContextEnabled, builder.PersistOutputEnabled, builder.Source); } } diff --git a/src/core/Elsa.Core/Builders/CompositeActivityBuilderExtensions.cs b/src/core/Elsa.Core/Builders/CompositeActivityBuilderExtensions.cs index 0442a8c71..8910f4475 100644 --- a/src/core/Elsa.Core/Builders/CompositeActivityBuilderExtensions.cs +++ b/src/core/Elsa.Core/Builders/CompositeActivityBuilderExtensions.cs @@ -1,72 +1,52 @@ -using System; +using System; +using System.Collections.Generic; using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using Elsa.Activities.Primitives; -using Elsa.ActivityResults; -using Elsa.Services.Models; +using Elsa.Services; // ReSharper disable ExplicitCallerInfoArgument namespace Elsa.Builders { public static class CompositeActivityBuilderExtensions { - public static IActivityBuilder StartWith(this ICompositeActivityBuilder builder, Action action) => builder.StartWith(inline => inline.Set(x => x.Function, RunInline(action))); - - public static IActivityBuilder - StartWith(this ICompositeActivityBuilder builder, Action action, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => - builder.StartWith(inline => inline.Set(x => x.Function, RunInline(action)), null, lineNumber, sourceFile); - - public static IActivityBuilder StartWith( - this ICompositeActivityBuilder builder, - Func action, + public static IActivityBuilder New( + this ICompositeActivityBuilder compositeActivityBuilder, + IDictionary? propertyValueProviders = default, [CallerLineNumber] int lineNumber = default, - [CallerFilePath] string? sourceFile = default) => - builder.StartWith(inline => inline.Set(x => x.Function, RunInline(action)), null, lineNumber, sourceFile); + [CallerFilePath] string? sourceFile = default) + where T : class, IActivity => compositeActivityBuilder.New(typeof(T).Name, propertyValueProviders, lineNumber, sourceFile); - public static IActivityBuilder StartWith( - this ICompositeActivityBuilder builder, - Func> action, + public static IActivityBuilder New( + this ICompositeActivityBuilder compositeActivityBuilder, + Action>? setup, [CallerLineNumber] int lineNumber = default, - [CallerFilePath] string? sourceFile = default) => - builder.StartWith(inline => inline.Set(x => x.Function, RunInline(action)), null, lineNumber, sourceFile); + [CallerFilePath] string? sourceFile = default) where T : class, IActivity => compositeActivityBuilder.New(typeof(T).Name, setup, lineNumber, sourceFile); - public static IActivityBuilder SetVariable(this ICompositeActivityBuilder builder, string variableName, object? value, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => - builder.StartWith( - activity => - { - activity.Set(x => x.VariableName, _ => variableName); - activity.Set(x => x.Value, _ => value); - }, null, lineNumber, sourceFile); - - public static IActivityBuilder SetVariable( - this ICompositeActivityBuilder builder, - string variableName, - Func value, + public static IActivityBuilder StartWith( + this ICompositeActivityBuilder compositeActivityBuilder, + Action>? setup, + Action? branch = default, [CallerLineNumber] int lineNumber = default, - [CallerFilePath] string? sourceFile = default) => - builder.SetVariable(variableName, value(), lineNumber, sourceFile); + [CallerFilePath] string? sourceFile = default) where T : class, IActivity => compositeActivityBuilder.StartWith(typeof(T).Name, setup, branch, lineNumber, sourceFile); - private static Func> RunInline(Action action) => - _ => - { - action(); - return new ValueTask(new DoneResult()); - }; + public static IActivityBuilder StartWith( + this ICompositeActivityBuilder compositeActivityBuilder, + Action? branch = default, + [CallerLineNumber] int lineNumber = default, + [CallerFilePath] string? sourceFile = default) where T : class, IActivity => compositeActivityBuilder.StartWith(typeof(T).Name, branch, lineNumber, sourceFile); - private static Func> RunInline(Action action) => - context => - { - action(context); - return new ValueTask(new DoneResult()); - }; + public static IActivityBuilder Add( + this ICompositeActivityBuilder compositeActivityBuilder, + Action>? setup, + Action? branch = default, + [CallerLineNumber] int lineNumber = default, + [CallerFilePath] string? sourceFile = default) where T : class, IActivity => compositeActivityBuilder.Add(typeof(T).Name, setup, branch, lineNumber, sourceFile); - private static Func> RunInline(Func action) => - async context => - { - await action(context); - return new DoneResult(); - }; - - private static Func> RunInline(Func> action) => async context => await action(context); + public static IActivityBuilder Add( + this ICompositeActivityBuilder compositeActivityBuilder, + Action? branch = default, + IDictionary? propertyValueProviders = default, + [CallerLineNumber] int lineNumber = default, + [CallerFilePath] string? sourceFile = default) + where T : class, IActivity => compositeActivityBuilder.Add(typeof(T).Name, branch, propertyValueProviders, lineNumber, sourceFile); } } \ No newline at end of file diff --git a/src/core/Elsa.Core/Builders/InlineActivityBuilderExtensions.cs b/src/core/Elsa.Core/Builders/InlineActivityBuilderExtensions.cs new file mode 100644 index 000000000..56024d8fc --- /dev/null +++ b/src/core/Elsa.Core/Builders/InlineActivityBuilderExtensions.cs @@ -0,0 +1,65 @@ +using System; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using Elsa.Activities.Primitives; +using Elsa.ActivityResults; +using Elsa.Services.Models; + +// ReSharper disable ExplicitCallerInfoArgument +namespace Elsa.Builders +{ + public static class InlineActivityBuilderExtensions + { + public static IActivityBuilder Then( + this IBuilder builder, + Func> activity, + [CallerLineNumber] int lineNumber = default, + [CallerFilePath] string? sourceFile = default) => + builder.Then(inline => inline.Set(x => x.Function, RunInline(activity)), null, lineNumber, sourceFile); + + public static IActivityBuilder + Then(this IBuilder builder, Func activity, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => + builder.Then(inline => inline.Set(x => x.Function, RunInline(activity)), null, lineNumber, sourceFile); + + public static IActivityBuilder Then(this IBuilder builder, Action activity, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => + builder.Then(inline => inline.Set(x => x.Function, RunInline(activity)), null, lineNumber, sourceFile); + + public static IActivityBuilder Then(this IBuilder builder, Action activity) => + builder.Then(inline => inline.Set(x => x.Function, RunInline(activity))); + + private static Func> RunInline( + Func> activity) => + async context => await activity(context); + + private static Func> RunInline( + Func activity) => + async context => + { + await activity(context); + return new OutcomeResult(); + }; + + private static Func> RunInline( + Action activity) => + context => + { + activity(context); + return new ValueTask(new OutcomeResult()); + }; + + private static Func> RunInline( + Func activity) => + async context => + { + await activity(context); + return new OutcomeResult(); + }; + + private static Func> RunInline(Action activity) => + context => + { + activity(); + return new ValueTask(new OutcomeResult()); + }; + } +} \ No newline at end of file diff --git a/src/core/Elsa.Core/Builders/InlineCompositeActivityBuilderExtensions.cs b/src/core/Elsa.Core/Builders/InlineCompositeActivityBuilderExtensions.cs new file mode 100644 index 000000000..ab917c8e6 --- /dev/null +++ b/src/core/Elsa.Core/Builders/InlineCompositeActivityBuilderExtensions.cs @@ -0,0 +1,56 @@ +using System; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using Elsa.Activities.Primitives; +using Elsa.ActivityResults; +using Elsa.Services.Models; + +// ReSharper disable ExplicitCallerInfoArgument +namespace Elsa.Builders +{ + public static class InlineCompositeActivityBuilderExtensions + { + public static IActivityBuilder StartWith(this ICompositeActivityBuilder builder, Action action) => builder.StartWith(inline => inline.Set(x => x.Function, RunInline(action))); + + public static IActivityBuilder + StartWith(this ICompositeActivityBuilder builder, Action action, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => + builder.StartWith(inline => inline.Set(x => x.Function, RunInline(action)), null, lineNumber, sourceFile); + + public static IActivityBuilder StartWith( + this ICompositeActivityBuilder builder, + Func action, + [CallerLineNumber] int lineNumber = default, + [CallerFilePath] string? sourceFile = default) => + builder.StartWith(inline => inline.Set(x => x.Function, RunInline(action)), null, lineNumber, sourceFile); + + public static IActivityBuilder StartWith( + this ICompositeActivityBuilder builder, + Func> action, + [CallerLineNumber] int lineNumber = default, + [CallerFilePath] string? sourceFile = default) => + builder.StartWith(inline => inline.Set(x => x.Function, RunInline(action)), null, lineNumber, sourceFile); + + private static Func> RunInline(Action action) => + _ => + { + action(); + return new ValueTask(new DoneResult()); + }; + + private static Func> RunInline(Action action) => + context => + { + action(context); + return new ValueTask(new DoneResult()); + }; + + private static Func> RunInline(Func action) => + async context => + { + await action(context); + return new DoneResult(); + }; + + private static Func> RunInline(Func> action) => async context => await action(context); + } +} \ No newline at end of file diff --git a/src/core/Elsa.Core/Builders/OutcomeBuilder.cs b/src/core/Elsa.Core/Builders/OutcomeBuilder.cs index 557c658b9..8023c9a8d 100644 --- a/src/core/Elsa.Core/Builders/OutcomeBuilder.cs +++ b/src/core/Elsa.Core/Builders/OutcomeBuilder.cs @@ -21,21 +21,21 @@ namespace Elsa.Builders public string Outcome { get; } public IActivityBuilder Then( + string activityTypeName, Action>? setup = default, Action? branch = default, - string? activityType = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) where T : class, IActivity { - var activityBuilder = WorkflowBuilder.Add(setup, default, activityType, lineNumber, sourceFile); + var activityBuilder = WorkflowBuilder.Add(activityTypeName, setup, null, lineNumber, sourceFile); Then(activityBuilder, branch); return activityBuilder; } - public IActivityBuilder Then(Action? branch = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) + public IActivityBuilder Then(string activityTypeName, Action? branch = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) where T : class, IActivity { - var activityBuilder = WorkflowBuilder.Add(branch, null, lineNumber, sourceFile); + var activityBuilder = WorkflowBuilder.Add(activityTypeName, branch, null, lineNumber, sourceFile); Then(activityBuilder); return activityBuilder; } diff --git a/src/core/Elsa.Core/Builders/VariableCompositeActivityBuilderExtensions.cs b/src/core/Elsa.Core/Builders/VariableCompositeActivityBuilderExtensions.cs new file mode 100644 index 000000000..770aab317 --- /dev/null +++ b/src/core/Elsa.Core/Builders/VariableCompositeActivityBuilderExtensions.cs @@ -0,0 +1,26 @@ +using System; +using System.Runtime.CompilerServices; +using Elsa.Activities.Primitives; + +// ReSharper disable ExplicitCallerInfoArgument +namespace Elsa.Builders +{ + public static class VariableCompositeActivityBuilderExtensions + { + public static IActivityBuilder SetVariable(this ICompositeActivityBuilder builder, string variableName, object? value, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => + builder.StartWith( + activity => + { + activity.Set(x => x.VariableName, _ => variableName); + activity.Set(x => x.Value, _ => value); + }, null, lineNumber, sourceFile); + + public static IActivityBuilder SetVariable( + this ICompositeActivityBuilder builder, + string variableName, + Func value, + [CallerLineNumber] int lineNumber = default, + [CallerFilePath] string? sourceFile = default) => + builder.SetVariable(variableName, value(), lineNumber, sourceFile); + } +} \ No newline at end of file diff --git a/src/core/Elsa.Core/Builders/WorkflowBuilder.cs b/src/core/Elsa.Core/Builders/WorkflowBuilder.cs index ad425f07b..445bbe704 100644 --- a/src/core/Elsa.Core/Builders/WorkflowBuilder.cs +++ b/src/core/Elsa.Core/Builders/WorkflowBuilder.cs @@ -17,6 +17,7 @@ namespace Elsa.Builders CustomAttributes = new Variables(); ActivityId = idGenerator.Generate(); ActivityType = typeof(Workflow); + ActivityTypeName = nameof(Workflow); WorkflowBuilder = this; PropertyValueProviders = new Dictionary(); PersistenceBehavior = WorkflowPersistenceBehavior.WorkflowBurst; diff --git a/src/samples/aspnet/Elsa.Samples.ForkJoinTimerAndSignalHttp/Workflows/DemoWorkflow.cs b/src/samples/aspnet/Elsa.Samples.ForkJoinTimerAndSignalHttp/Workflows/DemoWorkflow.cs index a52e5839f..8e8f898cf 100644 --- a/src/samples/aspnet/Elsa.Samples.ForkJoinTimerAndSignalHttp/Workflows/DemoWorkflow.cs +++ b/src/samples/aspnet/Elsa.Samples.ForkJoinTimerAndSignalHttp/Workflows/DemoWorkflow.cs @@ -35,13 +35,13 @@ namespace Elsa.Samples.ForkJoinTimerAndSignalHttp.Workflows .When("Timer") .Timer(_timeOut) .SetVariable("CompletedVia", "Timer") - .Then("Join"); + .ThenNamed("Join"); fork .When("Signal") .SignalReceived("hurry") .SetVariable("CompletedVia", "Signal") - .Then("Join"); + .ThenNamed("Join"); }) .Add(x => x.WithMode(Join.JoinMode.WaitAny)).WithName("Join") .WriteLine(context => $"Demo {GetCorrelationId(context)} completed successfully via {context.GetVariable("CompletedVia")}!"); diff --git a/src/samples/console/Elsa.Samples.UserTaskConsole/UserTaskWorkflow.cs b/src/samples/console/Elsa.Samples.UserTaskConsole/UserTaskWorkflow.cs index de70f687e..037df7aee 100644 --- a/src/samples/console/Elsa.Samples.UserTaskConsole/UserTaskWorkflow.cs +++ b/src/samples/console/Elsa.Samples.UserTaskConsole/UserTaskWorkflow.cs @@ -17,17 +17,17 @@ namespace Elsa.Samples.UserTaskConsole userTask .When("Accept") .WriteLine("Great! Your work has been accepted.") - .Then("Exit"); + .ThenNamed("Exit"); userTask .When("Reject") .WriteLine("Sorry! Your work has been rejected.") - .Then("Exit"); + .ThenNamed("Exit"); userTask .When("Needs Work") .WriteLine("So close! Your work needs a little bit more work.") - .Then("Exit"); + .ThenNamed("Exit"); } ) .WriteLine("Workflow finished.").WithName("Exit"); diff --git a/src/samples/worker/Elsa.Samples.Timers.Quartz/Activities/MyContainer1.cs b/src/samples/worker/Elsa.Samples.Timers.Quartz/Activities/MyContainer1.cs index f8009f4ef..5c964416b 100644 --- a/src/samples/worker/Elsa.Samples.Timers.Quartz/Activities/MyContainer1.cs +++ b/src/samples/worker/Elsa.Samples.Timers.Quartz/Activities/MyContainer1.cs @@ -19,20 +19,20 @@ namespace Elsa.Samples.Temporal.Activities .While(true, @while => @while .Timer(Duration.FromSeconds(1)) .WriteLine("Timer A went off")) - .Then("Join1"); + .ThenNamed("Join1"); fork .When("B") .While(true, @while => @while .Timer(Duration.FromSeconds(5)) .WriteLine("Timer B went off")) - .Then("Join1"); + .ThenNamed("Join1"); fork .When("C") .Timer(Duration.FromSeconds(6)) .WriteLine("Timer C went off") - .Then("Join1"); + .ThenNamed("Join1"); }) .Add(join => join.WithMode(Join.JoinMode.WaitAny)).WithName("Join1") .WriteLine("Container 1 Joined!") diff --git a/src/samples/worker/Elsa.Samples.Timers.Quartz/Activities/MyContainer2.cs b/src/samples/worker/Elsa.Samples.Timers.Quartz/Activities/MyContainer2.cs index dbf69d62b..41451cd27 100644 --- a/src/samples/worker/Elsa.Samples.Timers.Quartz/Activities/MyContainer2.cs +++ b/src/samples/worker/Elsa.Samples.Timers.Quartz/Activities/MyContainer2.cs @@ -18,14 +18,14 @@ namespace Elsa.Samples.Temporal.Activities .When("D") .Timer(Duration.FromSeconds(20)) .WriteLine("Timer D went off. Exiting fork") - .Then("Join2"); + .ThenNamed("Join2"); fork .When("E") .While(true, iterate => iterate .Timer(Duration.FromSeconds(5)) .WriteLine("Timer E went off. Looping.")) - .Then("Join2"); + .ThenNamed("Join2"); }) .Add(join => join.WithMode(Join.JoinMode.WaitAny)).WithName("Join2") .WriteLine("Container 2 Joined!") diff --git a/src/samples/worker/Elsa.Samples.Timers.Quartz/Workflows/ComplicatedWorkflow.cs b/src/samples/worker/Elsa.Samples.Timers.Quartz/Workflows/ComplicatedWorkflow.cs index 998c925f6..cc206a454 100644 --- a/src/samples/worker/Elsa.Samples.Timers.Quartz/Workflows/ComplicatedWorkflow.cs +++ b/src/samples/worker/Elsa.Samples.Timers.Quartz/Workflows/ComplicatedWorkflow.cs @@ -20,7 +20,7 @@ namespace Elsa.Samples.Temporal.Workflows .When("A") .Timer(Duration.FromSeconds(5)).WithId("timer-a") .WriteLine("Timer A went off. Exiting fork").WithId("write-line-a") - .Then("Join2"); + .ThenNamed("Join2"); fork .When("B") @@ -29,7 +29,7 @@ namespace Elsa.Samples.Temporal.Workflows .Timer(Duration.FromSeconds(1)).WithId("timer-b") .WriteLine("Timer B went off. Looping.").WithId("write-line-b")) ).WithId("while-true") - .Then("Join2"); + .ThenNamed("Join2"); }) .Add(join => join.WithMode(Join.JoinMode.WaitAny)).WithName("Join2") ).WithId("for-2")) diff --git a/test/integration/Elsa.Core.IntegrationTests/Workflows/ForkJoinWorkflow.cs b/test/integration/Elsa.Core.IntegrationTests/Workflows/ForkJoinWorkflow.cs index d0141be08..7c5b23577 100644 --- a/test/integration/Elsa.Core.IntegrationTests/Workflows/ForkJoinWorkflow.cs +++ b/test/integration/Elsa.Core.IntegrationTests/Workflows/ForkJoinWorkflow.cs @@ -20,9 +20,9 @@ namespace Elsa.Core.IntegrationTests.Workflows activity => activity.Set(x => x.Branches, new HashSet(new[] { "Branch 1", "Branch 2", "Branch 3" })), fork => { - fork.When("Branch 1").SignalReceived("Signal1").WriteLine("Branch 1 executed").WithName("WriteLine1").Then("Join"); - fork.When("Branch 2").SignalReceived("Signal2").WriteLine("Branch 2 executed").WithName("WriteLine2").Then("Join"); - fork.When("Branch 3").SignalReceived("Signal3").WriteLine("Branch 3 executed").WithName("WriteLine3").Then("Join"); + fork.When("Branch 1").SignalReceived("Signal1").WriteLine("Branch 1 executed").WithName("WriteLine1").ThenNamed("Join"); + fork.When("Branch 2").SignalReceived("Signal2").WriteLine("Branch 2 executed").WithName("WriteLine2").ThenNamed("Join"); + fork.When("Branch 3").SignalReceived("Signal3").WriteLine("Branch 3 executed").WithName("WriteLine3").ThenNamed("Join"); }) .Add(join => join.Set(x => x.Mode, _joinMode)).WithName("Join") .WriteLine("Finished").WithName("Finished");