From 10d77b7365d4c75cd7fe344827f7159e27d0563a Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Mon, 26 Apr 2021 13:28:20 +0200 Subject: [PATCH] Add "workflow_definition_id" liquid filter --- .../LiquidServiceCollectionExtensions.cs | 3 +- .../Filters/WorkflowDefinitionIdFilter.cs | 38 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 src/scripting/Elsa.Scripting.Liquid/Filters/WorkflowDefinitionIdFilter.cs diff --git a/src/scripting/Elsa.Scripting.Liquid/Extensions/LiquidServiceCollectionExtensions.cs b/src/scripting/Elsa.Scripting.Liquid/Extensions/LiquidServiceCollectionExtensions.cs index e7253eed3..1868fef9a 100644 --- a/src/scripting/Elsa.Scripting.Liquid/Extensions/LiquidServiceCollectionExtensions.cs +++ b/src/scripting/Elsa.Scripting.Liquid/Extensions/LiquidServiceCollectionExtensions.cs @@ -18,7 +18,8 @@ namespace Elsa.Scripting.Liquid.Extensions .AddScoped() .AddSingleton() .AddLiquidFilter("json") - .AddLiquidFilter("base64"); + .AddLiquidFilter("base64") + .AddLiquidFilter("workflow_definition_id"); } public static IServiceCollection AddLiquidFilter(this IServiceCollection services, string name) where T : class, ILiquidFilter diff --git a/src/scripting/Elsa.Scripting.Liquid/Filters/WorkflowDefinitionIdFilter.cs b/src/scripting/Elsa.Scripting.Liquid/Filters/WorkflowDefinitionIdFilter.cs new file mode 100644 index 000000000..9b68e0bab --- /dev/null +++ b/src/scripting/Elsa.Scripting.Liquid/Filters/WorkflowDefinitionIdFilter.cs @@ -0,0 +1,38 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using Elsa.Scripting.Liquid.Services; +using Elsa.Services; +using Elsa.Services.Models; +using Fluid; +using Fluid.Values; + +namespace Elsa.Scripting.Liquid.Filters +{ + public class WorkflowDefinitionIdFilter : ILiquidFilter + { + private readonly IWorkflowRegistry _workflowRegistry; + + public WorkflowDefinitionIdFilter(IWorkflowRegistry workflowRegistry) => _workflowRegistry = workflowRegistry; + + public async ValueTask ProcessAsync(FluidValue input, FilterArguments arguments, TemplateContext context) + { + if (input.Type != FluidValues.String) + throw new NotSupportedException("Unrecognized FluidValue"); + + var queryType = arguments.Values.FirstOrDefault()?.ToStringValue() ?? "name"; + var queryValue = input.ToStringValue().ToLowerInvariant(); + + Func predicate = queryType switch + { + "name" => x => string.Equals(x.Name, queryValue, StringComparison.OrdinalIgnoreCase), + "tag" => x => string.Equals(x.Tag, queryValue, StringComparison.OrdinalIgnoreCase), + _ => throw new ArgumentOutOfRangeException() + }; + + var workflowBlueprint = await _workflowRegistry.FindAsync(predicate); + var workflowDefinitionId = workflowBlueprint?.Id; + return new StringValue(workflowDefinitionId); + } + } +} \ No newline at end of file