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); } }