From 8bcab1b832552aa189f88bfeefa84b858a1f99aa Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Fri, 12 Apr 2024 15:00:00 +0200 Subject: [PATCH] Fix LogPersistenceMode default mapping logic (#5218) * Fix LogPersistenceMode default mapping logic Fixes #5217 * Format adjustment in DefaultActivityExecutionMapper.cs Applied minor code reformatting in the DefaultActivityExecutionMapper.cs file to maintain consistency and improve readability. This was mostly centered around adding spaces for proper code alignment and indentation to match the overall code style in the project. No functional changes were made. --- src/bundles/Elsa.Server.Web/Program.cs | 3 + .../DefaultActivityExecutionMapper.cs | 120 ++++++++---------- 2 files changed, 55 insertions(+), 68 deletions(-) diff --git a/src/bundles/Elsa.Server.Web/Program.cs b/src/bundles/Elsa.Server.Web/Program.cs index e7db8f0d3..ef688eeb9 100644 --- a/src/bundles/Elsa.Server.Web/Program.cs +++ b/src/bundles/Elsa.Server.Web/Program.cs @@ -18,6 +18,7 @@ using Elsa.MongoDb.Modules.Identity; using Elsa.MongoDb.Modules.Management; using Elsa.MongoDb.Modules.Runtime; using Elsa.Server.Web; +using Elsa.Workflows.Enums; using Elsa.Workflows.Management.Compression; using Elsa.Workflows.Management.Stores; using Elsa.Workflows.Runtime.Stores; @@ -154,6 +155,8 @@ services if (useCachingStores) management.UseCachingStores(); + + management.SetDefaultLogPersistenceMode(LogPersistenceMode.Default); }) .UseWorkflowRuntime(runtime => { diff --git a/src/modules/Elsa.Workflows.Runtime/Services/DefaultActivityExecutionMapper.cs b/src/modules/Elsa.Workflows.Runtime/Services/DefaultActivityExecutionMapper.cs index bf012ab59..b81f20368 100644 --- a/src/modules/Elsa.Workflows.Runtime/Services/DefaultActivityExecutionMapper.cs +++ b/src/modules/Elsa.Workflows.Runtime/Services/DefaultActivityExecutionMapper.cs @@ -11,39 +11,27 @@ using Microsoft.Extensions.Options; namespace Elsa.Workflows.Runtime.Services; /// -public class DefaultActivityExecutionMapper : IActivityExecutionMapper -{ - private LogPersistenceMode _serverLogPersistenceMode; - private const string LogPersistenceModeKey = "logPersistenceMode"; - - public DefaultActivityExecutionMapper(IOptions options) - { - _serverLogPersistenceMode = options.Value.LogPersistenceMode; - } - +public class DefaultActivityExecutionMapper(IOptions options) : IActivityExecutionMapper +{ + private const string LogPersistenceModeKey = "logPersistenceMode"; + /// public ActivityExecutionRecord Map(ActivityExecutionContext source) - { - /* - * { - * "logPersistenceMode": { - * "default": "default", - * "inputs": { k : v }, - * "outputs": { k: v } - * } - * } - */ - - var workflowPersistenceProperty = - GetDefaultPersistenceMode(source.WorkflowExecutionContext.Workflow.CustomProperties, () => _serverLogPersistenceMode); - - - var activityPersistenceProperties = source.Activity.CustomProperties - .GetValueOrDefault>(LogPersistenceModeKey, () => new Dictionary()); - var activityPersistencePropertyDefault = - GetDefaultPersistenceMode(source.Activity.CustomProperties, () => workflowPersistenceProperty); - - + { + /* + * { + * "logPersistenceMode": { + * "default": "default", + * "inputs": { k : v }, + * "outputs": { k: v } + * } + * } + */ + + var workflowPersistenceProperty = GetDefaultPersistenceMode(source.WorkflowExecutionContext.Workflow.CustomProperties, () => options.Value.LogPersistenceMode); + var activityPersistenceProperties = source.Activity.CustomProperties.GetValueOrDefault>(LogPersistenceModeKey, () => new Dictionary()); + var activityPersistencePropertyDefault = GetDefaultPersistenceMode(source.Activity.CustomProperties, () => workflowPersistenceProperty); + // Get any outcomes that were added to the activity execution context. var outcomes = source.JournalData.TryGetValue("Outcomes", out var resultValue) ? resultValue as string[] : default; var payload = new Dictionary(); @@ -72,10 +60,10 @@ public class DefaultActivityExecutionMapper : IActivityExecutionMapper return default; }); - - outputs = StorePropertyUsingPersistanceMode(outputs, activityPersistenceProperties!.GetValueOrDefault("outputs", () => new Dictionary())!, activityPersistencePropertyDefault); - var activityState = StorePropertyUsingPersistanceMode(source.ActivityState, activityPersistenceProperties!.GetValueOrDefault("inputs", () => new Dictionary())!, activityPersistencePropertyDefault ); - + + outputs = StorePropertyUsingPersistenceMode(outputs, activityPersistenceProperties!.GetValueOrDefault("outputs", () => new Dictionary())!, activityPersistencePropertyDefault); + var activityState = StorePropertyUsingPersistenceMode(source.ActivityState, activityPersistenceProperties!.GetValueOrDefault("inputs", () => new Dictionary())!, activityPersistencePropertyDefault); + return new ActivityExecutionRecord { Id = source.Id, @@ -95,39 +83,35 @@ public class DefaultActivityExecutionMapper : IActivityExecutionMapper Status = GetAggregateStatus(source), CompletedAt = source.CompletedAt }; - } - - private static LogPersistenceMode GetDefaultPersistenceMode(IDictionary customProperties,Func defaultFactory) - { - var properties = customProperties - .GetValueOrDefault>(LogPersistenceModeKey, () => new Dictionary()); - var persistencePropertyDefault = properties! - .GetValueOrDefault("default", defaultFactory); - - if(persistencePropertyDefault == LogPersistenceMode.Default) - return defaultFactory(); - return persistencePropertyDefault; - } - - private static Dictionary StorePropertyUsingPersistanceMode(IDictionary inputs - , IDictionary persistenceModeConfiguration - , LogPersistenceMode defaultLogPersistenceMode = LogPersistenceMode.Exclude) - { - var result = new Dictionary(); - - foreach (var input in inputs) - { - var persistence = persistenceModeConfiguration.GetValueOrDefault(input.Key.Camelize(), () => defaultLogPersistenceMode); - if (persistence.Equals(LogPersistenceMode.Include) - || (persistence.Equals(LogPersistenceMode.Default) && defaultLogPersistenceMode == LogPersistenceMode.Include) - ) - result.Add(input.Key, input.Value); - - } - - return result; - } - + } + + private static LogPersistenceMode GetDefaultPersistenceMode(IDictionary customProperties, Func defaultFactory) + { + var properties = customProperties.GetValueOrDefault>(LogPersistenceModeKey, () => new Dictionary()); + var persistencePropertyDefault = properties!.GetValueOrDefault("default", defaultFactory); + + if (persistencePropertyDefault == LogPersistenceMode.Default) + return defaultFactory(); + return persistencePropertyDefault; + } + + private static Dictionary StorePropertyUsingPersistenceMode(IDictionary inputs, + IDictionary persistenceModeConfiguration, + LogPersistenceMode defaultLogPersistenceMode) + { + var result = new Dictionary(); + + foreach (var input in inputs) + { + var persistence = persistenceModeConfiguration.GetValueOrDefault(input.Key.Camelize(), () => defaultLogPersistenceMode); + if (persistence.Equals(LogPersistenceMode.Include) + || (persistence.Equals(LogPersistenceMode.Default) && defaultLogPersistenceMode is LogPersistenceMode.Include or LogPersistenceMode.Default)) + result.Add(input.Key, input.Value); + } + + return result; + } + private ActivityStatus GetAggregateStatus(ActivityExecutionContext context) { // If any child activity is faulted, the aggregate status is faulted.