This commit is contained in:
Sipke Schoorstra 2021-11-24 13:39:04 +01:00
commit bb6f9c422e
5 changed files with 33 additions and 5 deletions

View file

@ -10,13 +10,15 @@ namespace Elsa.Client
IWorkflowDefinitionsApi workflowDefinitions,
IWorkflowRegistryApi workflowRegistry,
IWorkflowInstancesApi workflowInstances,
IWebhookDefinitionsApi webhookDefinitions)
IWebhookDefinitionsApi webhookDefinitions,
IScriptingApi scriptingApi)
{
Activities = activities;
WorkflowDefinitions = workflowDefinitions;
WorkflowRegistry = workflowRegistry;
WorkflowInstances = workflowInstances;
WebhookDefinitions = webhookDefinitions;
Scripting = scriptingApi;
}
public IActivitiesApi Activities { get; }
@ -24,5 +26,6 @@ namespace Elsa.Client
public IWorkflowRegistryApi WorkflowRegistry { get; }
public IWorkflowInstancesApi WorkflowInstances { get; }
public IWebhookDefinitionsApi WebhookDefinitions { get; }
public IScriptingApi Scripting { get; }
}
}

View file

@ -29,7 +29,8 @@ namespace Elsa.Client.Extensions
.AddApiClient<IWorkflowDefinitionsApi>(refitSettings, httpClientFactory)
.AddApiClient<IWorkflowRegistryApi>(refitSettings, httpClientFactory)
.AddApiClient<IWorkflowInstancesApi>(refitSettings, httpClientFactory)
.AddApiClient<IWebhookDefinitionsApi>(refitSettings, httpClientFactory);
.AddApiClient<IWebhookDefinitionsApi>(refitSettings, httpClientFactory)
.AddApiClient<IScriptingApi>(refitSettings, httpClientFactory);
return services
.AddTransient<IElsaClient, ElsaClient>();

View file

@ -10,5 +10,6 @@ namespace Elsa.Client
IWorkflowRegistryApi WorkflowRegistry { get; }
IWorkflowInstancesApi WorkflowInstances { get; }
IWebhookDefinitionsApi WebhookDefinitions { get; }
IScriptingApi Scripting { get; }
}
}

View file

@ -0,0 +1,13 @@
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using Refit;
namespace Elsa.Client.Services
{
public interface IScriptingApi
{
[Get("/v1/scripting/javascript/type-definitions/{workflowDefinitionId}")]
Task<HttpContent> GetTypeScriptDefinitionFileAsync(string workflowDefinitionId, CancellationToken cancellationToken = default);
}
}

View file

@ -10,6 +10,7 @@ using Elsa.Providers.WorkflowStorage;
using Elsa.Scripting.Liquid.Helpers;
using Elsa.Scripting.Liquid.Messages;
using Elsa.Scripting.Liquid.Options;
using Elsa.Services;
using Elsa.Services.Models;
using Elsa.Services.WorkflowStorage;
using Fluid;
@ -26,12 +27,14 @@ namespace Elsa.Scripting.Liquid.Handlers
private readonly IConfiguration _configuration;
private readonly IWorkflowStorageService _workflowStorageService;
private readonly LiquidOptions _liquidOptions;
private readonly IActivityTypeService _activityTypeService;
public ConfigureLiquidEngine(IConfiguration configuration, IWorkflowStorageService workflowStorageService, IOptions<LiquidOptions> liquidOptions)
public ConfigureLiquidEngine(IConfiguration configuration, IWorkflowStorageService workflowStorageService, IOptions<LiquidOptions> liquidOptions, IActivityTypeService activityTypeService)
{
_configuration = configuration;
_workflowStorageService = workflowStorageService;
_liquidOptions = liquidOptions.Value;
_activityTypeService = activityTypeService;
}
public Task Handle(EvaluatingLiquidExpression notification, CancellationToken cancellationToken)
@ -61,7 +64,7 @@ namespace Elsa.Scripting.Liquid.Handlers
memberAccessStrategy.Register<ActivityExecutionContext, LiquidActivityModel>((x, a) => GetActivityModel(x, a));
memberAccessStrategy.Register<LiquidActivityModel, object?>((model, name) => GetActivityProperty(model, name, cancellationToken));
memberAccessStrategy.Register<LiquidObjectAccessor<JObject>, JObject>((x, name) => x.GetValueAsync(name));
memberAccessStrategy.Register<ExpandoObject, object>((x, name) => ((IDictionary<string, object>) x)[name]);
memberAccessStrategy.Register<ExpandoObject, object>((x, name) => ((IDictionary<string, object>)x)[name]);
memberAccessStrategy.Register<JObject, object?>((source, name) => source.GetValue(name, StringComparison.OrdinalIgnoreCase));
if (_liquidOptions.EnableConfigurationAccess)
@ -94,7 +97,14 @@ namespace Elsa.Scripting.Liquid.Handlers
var workflowExecutionContext = activityExecutionContext.WorkflowExecutionContext;
var activityBlueprint = activityModel.ActivityId != null ? workflowExecutionContext.GetActivityBlueprintById(activityModel.ActivityId)! : workflowExecutionContext.GetActivityBlueprintByName(activityModel.ActivityName!)!;
var activityId = activityBlueprint.Id;
var storageProviderName = activityBlueprint.PropertyStorageProviders.GetItem(name);
var activityType = await _activityTypeService.GetActivityTypeAsync(activityBlueprint.Type, cancellationToken);
var activityDescriptor = await _activityTypeService.DescribeActivityType(activityType, cancellationToken);
var property = activityDescriptor.OutputProperties.FirstOrDefault(d => d.Name == name);
var storageProviderName = activityBlueprint.PropertyStorageProviders.GetItem(name) ?? property?.DefaultWorkflowStorageProvider;
var storageContext = new WorkflowStorageContext(workflowExecutionContext.WorkflowInstance, activityId);
var value = await _workflowStorageService.LoadAsync(storageProviderName, storageContext, name, cancellationToken);
return value;