Update JavaScript and Liquid handlers with additional variables

This commit is contained in:
Sipke Schoorstra 2021-05-13 12:15:31 +02:00
parent 400a862f96
commit 581048cb99
2 changed files with 17 additions and 8 deletions

View file

@ -25,27 +25,33 @@ namespace Elsa.Scripting.JavaScript.Handlers
public Task Handle(EvaluatingJavaScriptExpression notification, CancellationToken cancellationToken)
{
var activityContext = notification.ActivityExecutionContext;
var workflowExecutionContext = activityContext.WorkflowExecutionContext;
var activityExecutionContext = notification.ActivityExecutionContext;
var workflowExecutionContext = activityExecutionContext.WorkflowExecutionContext;
var workflowBlueprint = workflowExecutionContext.WorkflowBlueprint;
var workflowInstance = workflowExecutionContext.WorkflowInstance;
var engine = notification.Engine;
// Global functions.
engine.SetValue("guid", (Func<string>) (() => Guid.NewGuid().ToString()));
engine.SetValue("setVariable", (Action<string, object>) ((name, value) => activityContext.SetVariable(name, value)));
engine.SetValue("getVariable", (Func<string, object?>) (name => activityContext.GetVariable(name)));
engine.SetValue("setVariable", (Action<string, object>) ((name, value) => activityExecutionContext.SetVariable(name, value)));
engine.SetValue("getVariable", (Func<string, object?>) (name => activityExecutionContext.GetVariable(name)));
engine.SetValue("getConfig", (Func<string, object?>) (name => _configuration.GetSection(name).Value));
engine.SetValue("isNullOrWhiteSpace", (Func<string, bool>) (string.IsNullOrWhiteSpace));
engine.SetValue("isNullOrEmpty", (Func<string, bool>) (string.IsNullOrEmpty));
engine.SetValue("getWorkflowDefinitionIdByName", (Func<string, string?>) (name => GetWorkflowDefinitionIdByName(activityContext, name)));
engine.SetValue("getWorkflowDefinitionIdByTag", (Func<string, string?>) (tag => GetWorkflowDefinitionIdByTag(activityContext, tag)));
engine.SetValue("getWorkflowDefinitionIdByName", (Func<string, string?>) (name => GetWorkflowDefinitionIdByName(activityExecutionContext, name)));
engine.SetValue("getWorkflowDefinitionIdByTag", (Func<string, string?>) (tag => GetWorkflowDefinitionIdByTag(activityExecutionContext, tag)));
// Global variables.
engine.SetValue("input", activityContext.Input);
engine.SetValue("activityExecutionContext", activityExecutionContext);
engine.SetValue("workflowExecutionContext", workflowExecutionContext);
engine.SetValue("workflowInstance", workflowInstance);
engine.SetValue("input", activityExecutionContext.Input);
engine.SetValue("workflowInstanceId", workflowInstance.Id);
engine.SetValue("workflowDefinitionId", workflowInstance.DefinitionId);
engine.SetValue("workflowDefinitionVersion", workflowInstance.Version);
engine.SetValue("correlationId", workflowInstance.CorrelationId);
engine.SetValue("currentCulture", CultureInfo.InvariantCulture);
engine.SetValue("workflowContext", activityContext.GetWorkflowContext());
engine.SetValue("workflowContext", activityExecutionContext.GetWorkflowContext());
// NodaTime types.
RegisterType<Instant>(engine);

View file

@ -34,7 +34,10 @@ namespace Elsa.Scripting.Liquid.Handlers
options.MemberAccessStrategy.Register<LiquidActivityModel>();
options.MemberAccessStrategy.Register<LiquidPropertyAccessor, FluidValue>((x, name) => x.GetValueAsync(name));
options.MemberAccessStrategy.Register<ActivityExecutionContext, FluidValue>("Input", x => ToFluidValue(x.Input, options));
options.MemberAccessStrategy.Register<ActivityExecutionContext, FluidValue>("WorkflowInstanceId", x => ToFluidValue(x.WorkflowInstance.Id, options));
options.MemberAccessStrategy.Register<ActivityExecutionContext, FluidValue>("CorrelationId", x => ToFluidValue(x.CorrelationId, options));
options.MemberAccessStrategy.Register<ActivityExecutionContext, FluidValue>("WorkflowDefinitionId", x => ToFluidValue(x.WorkflowInstance.DefinitionId, options));
options.MemberAccessStrategy.Register<ActivityExecutionContext, FluidValue>("WorkflowDefinitionVersion", x => ToFluidValue(x.WorkflowInstance.Version, options));
options.MemberAccessStrategy.Register<ActivityExecutionContext, LiquidPropertyAccessor>("Variables", x => new LiquidPropertyAccessor(name => ToFluidValue(x.WorkflowExecutionContext.GetMergedVariables(), name, options)));
options.MemberAccessStrategy.Register<ActivityExecutionContext, LiquidPropertyAccessor>("Activities", x => new LiquidPropertyAccessor(name => ToFluidValue(GetActivityModelAsync(x, name), options)!));
options.MemberAccessStrategy.Register<LiquidActivityModel, object?>("Output", GetActivityOutput);