Scaffold new activities

This commit is contained in:
Sipke Schoorstra 2022-03-28 22:12:16 +02:00
parent d25a45bdd9
commit 488ea1ef98
6 changed files with 129 additions and 6 deletions

View file

@ -0,0 +1,10 @@
using Elsa.Attributes;
using Elsa.Models;
namespace Elsa.Activities;
[Activity("Elsa", "Control Flow", "Break out of a loop")]
public class Break : Activity
{
// TODO.
}

View file

@ -0,0 +1,10 @@
using Elsa.Attributes;
using Elsa.Models;
namespace Elsa.Activities;
[Activity("Elsa", "Control Flow", "Mark the workflow as Finished")]
public class Finish : Activity
{
// TODO.
}

View file

@ -1,3 +1,4 @@
using System.Text.Json.Serialization;
using Elsa.Attributes;
using Elsa.Contracts;
using Elsa.Models;
@ -60,6 +61,20 @@ public class ForEach : Activity
public class ForEach<T> : ForEach
{
[JsonConstructor]
public ForEach()
{
}
public ForEach(Input<ICollection<T>> items)
{
Items = items;
}
public ForEach(ICollection<T> items) : this(new Input<ICollection<T>>(items))
{
}
[Input]
public new Input<ICollection<T>> Items
{

View file

@ -1,3 +1,4 @@
using System.Text.Json.Serialization;
using Elsa.Attributes;
using Elsa.Contracts;
using Elsa.Expressions;
@ -33,7 +34,7 @@ public class Switch : Activity
private async Task<SwitchCase?> FindMatchingCaseAsync(ExpressionExecutionContext context)
{
var expressionEvaluator = context.GetRequiredService<IExpressionEvaluator>();
foreach (var switchCase in Cases)
{
var result = await expressionEvaluator.EvaluateAsync<bool>(switchCase.Condition, context);
@ -51,11 +52,38 @@ public class Switch : Activity
/// </summary>
public class SwitchCase
{
// ReSharper disable once EmptyConstructor
[JsonConstructor]
public SwitchCase()
{
}
public SwitchCase(string label, IExpression condition, IActivity activity)
{
Label = label;
Condition = condition;
Activity = activity;
}
public SwitchCase(string label, DelegateReference<bool> condition, IActivity activity) : this(label, new DelegateExpression(condition), activity)
{
}
public SwitchCase(string label, Func<ExpressionExecutionContext, ValueTask<bool>> condition, IActivity activity) : this(label, new DelegateReference<bool>(condition), activity)
{
}
public SwitchCase(string label, Func<ValueTask<bool>> condition, IActivity activity) : this(label, new DelegateReference<bool>(condition), activity)
{
}
public SwitchCase(string label, Func<ExpressionExecutionContext, bool> condition, IActivity activity) : this(label, new DelegateReference<bool>(condition), activity)
{
}
public SwitchCase(string label, Func<bool> condition, IActivity activity) : this(label, new DelegateReference<bool>(condition), activity)
{
}
public string Label { get; set; } = default!;
public IExpression Condition { get; set; } = new LiteralExpression(false);
public IActivity? Activity { get; set; }

View file

@ -0,0 +1,64 @@
using System;
using System.Threading.Tasks;
using Elsa.Attributes;
using Elsa.Contracts;
using Elsa.Models;
using Microsoft.Extensions.Logging;
namespace Elsa.Modules.Scheduling.Activities;
[Activity("Elsa", "Scheduling", "Delay execution for the specified amount of time.")]
public class RunAt : Activity
{
public RunAt()
{
}
public RunAt(Input<DateTimeOffset> dateTime) => DateTime = dateTime;
public RunAt(Func<ExpressionExecutionContext, DateTimeOffset> dateTime) : this(new Input<DateTimeOffset>(dateTime))
{
}
public RunAt(Func<ExpressionExecutionContext, ValueTask<DateTimeOffset>> dateTime) : this(new Input<DateTimeOffset>(dateTime))
{
}
public RunAt(Func<ValueTask<DateTimeOffset>> dateTime) : this(new Input<DateTimeOffset>(dateTime))
{
}
public RunAt(Func<DateTimeOffset> dateTime) : this(new Input<DateTimeOffset>(dateTime))
{
}
public RunAt(DateTimeOffset dateTime) => DateTime = new Input<DateTimeOffset>(dateTime);
public RunAt(Variable<DateTimeOffset> dateTime) => DateTime = new Input<DateTimeOffset>(dateTime);
[Input] public Input<DateTimeOffset> DateTime { get; set; } = default!;
protected override void Execute(ActivityExecutionContext context)
{
// TODO: Update e.g. ScheduleWorkflows and other places to make sure this activity works correctly when suspending & resuming workflows.
var executeAt = context.ExpressionExecutionContext.Get(DateTime);
var clock = context.ExpressionExecutionContext.GetRequiredService<ISystemClock>();
var now = clock.UtcNow;
var logger = context.GetRequiredService<ILogger<RunAt>>();
if (executeAt <= now)
{
logger.LogDebug("Scheduled trigger time lies in the past ('{Delta}'). Skipping scheduling", now - executeAt);
context.JournalData.Add("Executed At", now);
return;
}
var payload = new RunAtPayload(executeAt);
context.CreateBookmark(payload);
}
public static RunAt From(DateTimeOffset value) => new(value);
}
public record RunAtPayload(DateTimeOffset ResumeAt);

View file

@ -10,8 +10,4 @@
<ProjectReference Include="..\..\core\Elsa.Jobs\Elsa.Jobs.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Triggers" />
</ItemGroup>
</Project>