Skip to content

Commit da23eca

Browse files
authored
Merge pull request #335 from neuroglia-io/fix-odata-expression-eval
Fixed the ODataFunctionProcessor to properly evaluate both operation uri and arguments before performing the ODATA call
2 parents 389241f + d4b5b85 commit da23eca

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

src/apps/Synapse.Worker/Extensions/IWorkflowRuntimeContextExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public static class IWorkflowRuntimeContextExtensions
4343
var json = JsonConvert.SerializeObject(expressionObject, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore }); ;
4444
foreach (var match in Regex.Matches(json, @"""\$\{.+?\}""", RegexOptions.Compiled).Cast<Match>())
4545
{
46-
var expression = match.Value[3..^2].Trim().Replace(@"\""", @"""");
46+
var expression = Regex.Unescape(match.Value[3..^2].Trim().Replace(@"\""", @""""));
4747
var evaluationResult = await context.EvaluateAsync(expression, data, cancellationToken);
4848
if (evaluationResult == null) continue;
4949
var valueToken = JToken.FromObject(evaluationResult);
@@ -52,7 +52,7 @@ public static class IWorkflowRuntimeContextExtensions
5252
{
5353
value = valueToken.Type switch
5454
{
55-
JTokenType.String => @$"""{valueToken}""",
55+
JTokenType.String => JsonConvert.SerializeObject(valueToken),
5656
_ => valueToken.ToString(),
5757
};
5858
}

src/apps/Synapse.Worker/Services/Processors/ODataFunctionProcessor.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*
1616
*/
1717

18+
using IdentityModel.Client;
19+
using Newtonsoft.Json;
1820
using Simple.OData.Client;
1921
using Synapse.Integration.Events.WorkflowActivities;
2022

@@ -80,7 +82,13 @@ protected override async Task InitializeAsync(CancellationToken cancellationToke
8082
{
8183
await base.InitializeAsync(cancellationToken);
8284
await this.HttpClient.ConfigureAuthorizationAsync(this.ServiceProvider, this.Authentication, cancellationToken);
83-
var components = this.Function.Operation.Split("#", StringSplitOptions.RemoveEmptyEntries);
85+
var odataUriString = this.Function.Operation;
86+
if (odataUriString.IsRuntimeExpression())
87+
{
88+
var evaluationResult = (string?)await this.Context.EvaluateAsync(odataUriString, this.Activity.Input, cancellationToken);
89+
if (!string.IsNullOrWhiteSpace(evaluationResult)) odataUriString = evaluationResult;
90+
}
91+
var components = odataUriString.Split("#", StringSplitOptions.RemoveEmptyEntries);
8492
if (components.Length != 2)
8593
throw new FormatException($"The 'operation' property of the ODATA function with name '{this.Function.Name}' has an invalid value '{this.Function.Operation}'. ODATA functions expect a value in the following format: <URI_to_odata_service>#<Entity_Set_Name>");
8694
this.ServiceUri = new(components.First());
@@ -97,7 +105,11 @@ protected override async Task ProcessAsync(CancellationToken cancellationToken)
97105
return;
98106
try
99107
{
100-
var commandOptions = this.FunctionReference.Arguments?.ToObject<ODataCommandOptions>();
108+
var parameters = this.FunctionReference.Arguments?.ToObject()!;
109+
var inputData = this.Activity.Input!.ToObject()!;
110+
parameters = (await this.Context.EvaluateObjectAsync(parameters, inputData, cancellationToken))!;
111+
112+
var commandOptions = JsonConvert.DeserializeObject<ODataCommandOptions>(JsonConvert.SerializeObject(parameters));
101113
var command = this.EntitySet;
102114
if (!string.IsNullOrWhiteSpace(commandOptions?.Key))
103115
command += $"({commandOptions.Key})";

0 commit comments

Comments
 (0)