using Elsa.Workflows.LogPersistence; using Elsa.Workflows.Runtime.Entities; using Elsa.Workflows.State; namespace Elsa.Workflows.Runtime; /// public class DefaultActivityExecutionMapper : IActivityExecutionMapper { public ActivityExecutionRecord Map(ActivityExecutionContext source) { var payload = GetPayload(source); var outputs = source.GetOutputs(); var inputs = source.GetInputs(); var persistenceMap = source.GetLogPersistenceModeMap(); var persistableInputs = GetPersistableInputOutput(inputs, persistenceMap.Inputs); var persistableOutputs = GetPersistableInputOutput(outputs, persistenceMap.Outputs); var persistableProperties = GetPersistableDictionary(source.Properties!, persistenceMap.InternalState); var persistablePayload = GetPersistableDictionary(payload!, persistenceMap.InternalState); return new() { Id = source.Id, ActivityId = source.Activity.Id, ActivityNodeId = source.NodeId, WorkflowInstanceId = source.WorkflowExecutionContext.Id, ActivityType = source.Activity.Type, ActivityName = source.Activity.Name, ActivityState = persistableInputs, Outputs = persistableOutputs, Properties = persistableProperties, Payload = persistablePayload!, Exception = ExceptionState.FromException(source.Exception), ActivityTypeVersion = source.Activity.Version, StartedAt = source.StartedAt, HasBookmarks = source.Bookmarks.Any(), Status = source.Status, CompletedAt = source.CompletedAt }; } /// public Task MapAsync(ActivityExecutionContext source) { return Task.FromResult(Map(source)); } private IDictionary GetPersistableInputOutput(IDictionary state, IDictionary map) { var result = new Dictionary(); foreach (var stateEntry in state) { var mode = map.TryGetValue(stateEntry.Key, out var value) ? value : LogPersistenceMode.Include; if (mode == LogPersistenceMode.Include) result.Add(stateEntry.Key, stateEntry.Value); } return result; } private IDictionary? GetPersistableDictionary(IDictionary dictionary, LogPersistenceMode mode) { return mode == LogPersistenceMode.Include ? dictionary : null; } private static IDictionary GetPayload(ActivityExecutionContext source) { var outcomes = source.JournalData.TryGetValue("Outcomes", out var resultValue) ? resultValue as string[] : null; var payload = new Dictionary(); if (outcomes != null) payload.Add("Outcomes", outcomes); return payload; } }