2023-09-24 22:38:06 +00:00
|
|
|
using Elsa.Expressions.Models;
|
2024-10-14 19:27:11 +00:00
|
|
|
using Elsa.Http;
|
2023-09-24 22:38:06 +00:00
|
|
|
using Elsa.SasTokens.Contracts;
|
2025-07-29 18:22:39 +00:00
|
|
|
using Elsa.Workflows.Api;
|
|
|
|
|
using Elsa.Workflows.Runtime;
|
2023-09-24 22:38:06 +00:00
|
|
|
using Microsoft.Extensions.Options;
|
|
|
|
|
|
|
|
|
|
// ReSharper disable once CheckNamespace
|
|
|
|
|
namespace Elsa.Extensions;
|
|
|
|
|
|
2023-09-24 22:55:29 +00:00
|
|
|
/// <summary>
|
2025-07-29 18:22:39 +00:00
|
|
|
/// Provides extension methods for working with <see cref="ExpressionExecutionContext"/>.
|
2023-09-24 22:55:29 +00:00
|
|
|
/// </summary>
|
2025-07-29 18:22:39 +00:00
|
|
|
public static class EventExpressionExecutionContextExtensions
|
2023-09-24 22:38:06 +00:00
|
|
|
{
|
2023-09-24 22:55:29 +00:00
|
|
|
/// <summary>
|
|
|
|
|
/// Generates a URL that can be used to trigger an event.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="context">The expression execution context.</param>
|
|
|
|
|
/// <param name="eventName">The name of the event to trigger.</param>
|
|
|
|
|
/// <param name="lifetime">The lifetime of the event trigger token.</param>
|
|
|
|
|
/// <returns>A URL that can be used to trigger an event.</returns>
|
2023-09-24 22:38:06 +00:00
|
|
|
public static string GenerateEventTriggerUrl(this ExpressionExecutionContext context, string eventName, TimeSpan lifetime)
|
|
|
|
|
{
|
|
|
|
|
var token = context.GenerateEventTriggerTokenInternal(eventName, lifetime);
|
|
|
|
|
return context.GenerateEventTriggerUrlInternal(token);
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-24 22:55:29 +00:00
|
|
|
/// <summary>
|
|
|
|
|
/// Generates a URL that can be used to trigger an event.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="context">The expression execution context.</param>
|
|
|
|
|
/// <param name="eventName">The name of the event to trigger.</param>
|
|
|
|
|
/// <param name="expiresAt">The expiration date of the event trigger token.</param>
|
|
|
|
|
/// <returns>A URL that can be used to trigger an event.</returns>
|
2023-09-24 22:38:06 +00:00
|
|
|
public static string GenerateEventTriggerUrl(this ExpressionExecutionContext context, string eventName, DateTimeOffset expiresAt)
|
|
|
|
|
{
|
|
|
|
|
var token = context.GenerateEventTriggerTokenInternal(eventName, expiresAt: expiresAt);
|
|
|
|
|
return context.GenerateEventTriggerUrlInternal(token);
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-24 22:55:29 +00:00
|
|
|
/// <summary>
|
|
|
|
|
/// Generates a URL that can be used to trigger an event.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="context">The expression execution context.</param>
|
|
|
|
|
/// <param name="eventName">The name of the event to trigger.</param>
|
|
|
|
|
/// <returns>A URL that can be used to trigger an event.</returns>
|
2023-09-24 22:38:06 +00:00
|
|
|
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)
|
|
|
|
|
{
|
2025-07-29 18:22:39 +00:00
|
|
|
var options = context.GetRequiredService<IOptions<ApiEndpointOptions>>().Value;
|
|
|
|
|
var url = $"{options.RoutePrefix}/events/trigger?t={token}";
|
2023-09-24 22:38:06 +00:00
|
|
|
var absoluteUrlProvider = context.GetRequiredService<IAbsoluteUrlProvider>();
|
|
|
|
|
return absoluteUrlProvider.ToAbsoluteUrl(url).ToString();
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-29 18:22:39 +00:00
|
|
|
private static string GenerateEventTriggerTokenInternal(this ExpressionExecutionContext context, string eventName, TimeSpan? lifetime = null, DateTimeOffset? expiresAt = null)
|
2023-09-24 22:38:06 +00:00
|
|
|
{
|
|
|
|
|
var workflowInstanceId = context.GetWorkflowExecutionContext().Id;
|
|
|
|
|
var payload = new EventTokenPayload(eventName, workflowInstanceId);
|
|
|
|
|
var tokenService = context.GetRequiredService<ITokenService>();
|
|
|
|
|
|
|
|
|
|
return lifetime != null
|
|
|
|
|
? tokenService.CreateToken(payload, lifetime.Value)
|
|
|
|
|
: expiresAt != null
|
|
|
|
|
? tokenService.CreateToken(payload, expiresAt.Value)
|
|
|
|
|
: tokenService.CreateToken(payload);
|
|
|
|
|
}
|
|
|
|
|
}
|