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