create Deadline activity

This commit is contained in:
Behzad Alizadeh
2026-05-05 11:49:59 +03:30
parent dcf3687b82
commit b859e20a01
2 changed files with 66 additions and 2 deletions
@@ -4,10 +4,10 @@ using Elsa.Workflows;
using Elsa.Workflows.Attributes;
using Elsa.Workflows.Models;
namespace YourNamespace.Activities;
namespace Elsa.Workflows.Activities.Caspian;
[Activity(
Category = "Workflow",
Category = "Caspian",
DisplayName = "Append To InquiryResult",
Description = "Appends an item to WorkflowStash.InquiryResult (supports JsonElement after persistence)."
)]
@@ -0,0 +1,64 @@
using Elsa.Extensions;
using Elsa.Workflows;
using Elsa.Workflows.Activities.Flowchart.Attributes;
using Elsa.Workflows.Attributes;
using Elsa.Workflows.Models;
using System.Text.Json;
namespace Elsa.Workflows.Activities.Caspian;
[Activity(
Category = "Caspian",
DisplayName = "Deadline",
Description = "Checks whether a configured deadline has expired."
)]
[FlowNode("Valid", "Expired")]
public class Deadline : Activity
{
[Input(
Description = "Variable name used to store the start time of the deadline.",
DefaultValue = "DeadlineStartedAt"
)]
public Input<string> VariableName { get; set; } = new("DeadlineStartedAt");
[Input(
Description = "The deadline duration (example: 48:00:00).",
DefaultValue = "48:00:00"
)]
public Input<TimeSpan> Timeout { get; set; } = new(TimeSpan.FromHours(48));
protected override async ValueTask ExecuteAsync(ActivityExecutionContext context)
{
var variableName = context.Get(VariableName);
var timeout = context.Get(Timeout);
var startedAtObject = context.GetVariable<object>(variableName);
if (startedAtObject == null)
{
context.SetVariable(variableName, DateTimeOffset.UtcNow);
await context.ScheduleOutcomesAsync("Valid");
return;
}
var startedTime = ParseDateTime(startedAtObject);
var elapsed = DateTimeOffset.UtcNow - startedTime;
if (elapsed > timeout)
await context.ScheduleOutcomesAsync("Expired");
else
await context.ScheduleOutcomesAsync("Valid");
}
private DateTimeOffset ParseDateTime(object value)
{
return value switch
{
DateTimeOffset dto => dto,
DateTime dt => new DateTimeOffset(dt),
JsonElement e when e.ValueKind == JsonValueKind.String => DateTimeOffset.Parse(e.GetString()!),
string s => DateTimeOffset.Parse(s),
_ => throw new InvalidCastException($"Cannot convert {value.GetType()} to DateTimeOffset")
};
}
}