using Elsa.Expressions.Models;
using Elsa.Http;
using Elsa.SasTokens.Contracts;
using Elsa.Workflows.Api;
using Elsa.Workflows.Runtime;
using Microsoft.Extensions.Options;
// ReSharper disable once CheckNamespace
namespace Elsa.Extensions;
///
/// Provides extension methods for working with .
///
public static class EventExpressionExecutionContextExtensions
{
///
/// Generates a URL that can be used to trigger an event.
///
/// The expression execution context.
/// The name of the event to trigger.
/// The lifetime of the event trigger token.
/// A URL that can be used to trigger an event.
public static string GenerateEventTriggerUrl(this ExpressionExecutionContext context, string eventName, TimeSpan lifetime)
{
var token = context.GenerateEventTriggerTokenInternal(eventName, lifetime);
return context.GenerateEventTriggerUrlInternal(token);
}
///
/// Generates a URL that can be used to trigger an event.
///
/// The expression execution context.
/// The name of the event to trigger.
/// The expiration date of the event trigger token.
/// A URL that can be used to trigger an event.
public static string GenerateEventTriggerUrl(this ExpressionExecutionContext context, string eventName, DateTimeOffset expiresAt)
{
var token = context.GenerateEventTriggerTokenInternal(eventName, expiresAt: expiresAt);
return context.GenerateEventTriggerUrlInternal(token);
}
///
/// Generates a URL that can be used to trigger an event.
///
/// The expression execution context.
/// The name of the event to trigger.
/// A URL that can be used to trigger an event.
public static string GenerateEventTriggerUrl(this ExpressionExecutionContext context, string eventName)
{
var token = context.GenerateEventTriggerTokenInternal(eventName);
return context.GenerateEventTriggerUrlInternal(token);
}
private static string GenerateEventTriggerUrlInternal(this ExpressionExecutionContext context, string token)
{
var options = context.GetRequiredService>().Value;
var url = $"{options.RoutePrefix}/events/trigger?t={token}";
var absoluteUrlProvider = context.GetRequiredService();
return absoluteUrlProvider.ToAbsoluteUrl(url).ToString();
}
private static string GenerateEventTriggerTokenInternal(this ExpressionExecutionContext context, string eventName, TimeSpan? lifetime = null, DateTimeOffset? expiresAt = null)
{
var workflowInstanceId = context.GetWorkflowExecutionContext().Id;
var payload = new EventTokenPayload(eventName, workflowInstanceId);
var tokenService = context.GetRequiredService();
return lifetime != null
? tokenService.CreateToken(payload, lifetime.Value)
: expiresAt != null
? tokenService.CreateToken(payload, expiresAt.Value)
: tokenService.CreateToken(payload);
}
}