From 3f327ef7422efdd6a99599dd87f78a7c32f111bc Mon Sep 17 00:00:00 2001 From: dominicasley Date: Wed, 24 Nov 2021 20:52:05 +1000 Subject: [PATCH 1/2] Add scripting api to elsa client (#2511) Co-authored-by: Dominic Asley --- src/clients/Elsa.Client/ElsaClient.cs | 5 ++++- .../Extensions/ServiceCollectionExtensions.cs | 3 ++- src/clients/Elsa.Client/IElsaClient.cs | 1 + src/clients/Elsa.Client/Services/IScriptingApi.cs | 13 +++++++++++++ 4 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 src/clients/Elsa.Client/Services/IScriptingApi.cs diff --git a/src/clients/Elsa.Client/ElsaClient.cs b/src/clients/Elsa.Client/ElsaClient.cs index 69c690303..7cb187f9a 100644 --- a/src/clients/Elsa.Client/ElsaClient.cs +++ b/src/clients/Elsa.Client/ElsaClient.cs @@ -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; } } } \ No newline at end of file diff --git a/src/clients/Elsa.Client/Extensions/ServiceCollectionExtensions.cs b/src/clients/Elsa.Client/Extensions/ServiceCollectionExtensions.cs index cf4f00153..3dc8f9eac 100644 --- a/src/clients/Elsa.Client/Extensions/ServiceCollectionExtensions.cs +++ b/src/clients/Elsa.Client/Extensions/ServiceCollectionExtensions.cs @@ -29,7 +29,8 @@ namespace Elsa.Client.Extensions .AddApiClient(refitSettings, httpClientFactory) .AddApiClient(refitSettings, httpClientFactory) .AddApiClient(refitSettings, httpClientFactory) - .AddApiClient(refitSettings, httpClientFactory); + .AddApiClient(refitSettings, httpClientFactory) + .AddApiClient(refitSettings, httpClientFactory); return services .AddTransient(); diff --git a/src/clients/Elsa.Client/IElsaClient.cs b/src/clients/Elsa.Client/IElsaClient.cs index 3e9d46959..e8808872a 100644 --- a/src/clients/Elsa.Client/IElsaClient.cs +++ b/src/clients/Elsa.Client/IElsaClient.cs @@ -10,5 +10,6 @@ namespace Elsa.Client IWorkflowRegistryApi WorkflowRegistry { get; } IWorkflowInstancesApi WorkflowInstances { get; } IWebhookDefinitionsApi WebhookDefinitions { get; } + IScriptingApi Scripting { get; } } } \ No newline at end of file diff --git a/src/clients/Elsa.Client/Services/IScriptingApi.cs b/src/clients/Elsa.Client/Services/IScriptingApi.cs new file mode 100644 index 000000000..b57c9da19 --- /dev/null +++ b/src/clients/Elsa.Client/Services/IScriptingApi.cs @@ -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 GetTypeScriptDefinitionFileAsync(string workflowDefinitionId, CancellationToken cancellationToken = default); + } +} \ No newline at end of file From 5fae56d2bfab853304586c26bbfd4a5edc96b057 Mon Sep 17 00:00:00 2001 From: noxe Date: Wed, 24 Nov 2021 11:52:46 +0100 Subject: [PATCH 2/2] Bug - Accessing Output via Liquid (#2509) * do not create a new Scope - reuse workflowExecutionContext's scope * Upgrade Rebus.ServiceProvider to 7.0 * using the correct storage provider Co-authored-by: Martin --- .../Handlers/ConfigureLiquidEngine.cs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/scripting/Elsa.Scripting.Liquid/Handlers/ConfigureLiquidEngine.cs b/src/scripting/Elsa.Scripting.Liquid/Handlers/ConfigureLiquidEngine.cs index a39f0b3b9..41e26d0bd 100644 --- a/src/scripting/Elsa.Scripting.Liquid/Handlers/ConfigureLiquidEngine.cs +++ b/src/scripting/Elsa.Scripting.Liquid/Handlers/ConfigureLiquidEngine.cs @@ -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) + public ConfigureLiquidEngine(IConfiguration configuration, IWorkflowStorageService workflowStorageService, IOptions 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((x, a) => GetActivityModel(x, a)); memberAccessStrategy.Register((model, name) => GetActivityProperty(model, name, cancellationToken)); memberAccessStrategy.Register, JObject>((x, name) => x.GetValueAsync(name)); - memberAccessStrategy.Register((x, name) => ((IDictionary) x)[name]); + memberAccessStrategy.Register((x, name) => ((IDictionary)x)[name]); memberAccessStrategy.Register((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;