< Summary

Information
Class: Elsa.Workflows.Runtime.DefaultActivityExecutionMapper
Assembly: Elsa.Workflows.Runtime
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Runtime/Services/DefaultActivityExecutionMapper.cs
Line coverage
100%
Covered lines: 76
Uncovered lines: 0
Coverable lines: 76
Total lines: 107
Line coverage: 100%
Branch coverage
90%
Covered branches: 27
Total branches: 30
Branch coverage: 90%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
MapAsync()81.81%2222100%
GetPersistableInputOutput(...)100%66100%
GetPersistableDictionary(...)100%22100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Runtime/Services/DefaultActivityExecutionMapper.cs

#LineLine coverage
 1using Elsa.Common;
 2using Elsa.Common.Codecs;
 3using Elsa.Workflows.LogPersistence;
 4using Elsa.Workflows.Management.Options;
 5using Elsa.Workflows.Runtime.Entities;
 6using Elsa.Workflows.Runtime.Extensions;
 7using Elsa.Workflows.State;
 8using Microsoft.Extensions.Options;
 9
 10namespace Elsa.Workflows.Runtime;
 11
 12/// <inheritdoc />
 51213public class DefaultActivityExecutionMapper(
 51214    ISafeSerializer safeSerializer,
 51215    IPayloadSerializer payloadSerializer,
 51216    ICompressionCodecResolver compressionCodecResolver,
 51217    IOptions<ManagementOptions> options) : IActivityExecutionMapper
 18{
 19    /// <inheritdoc />
 20    public async Task<ActivityExecutionRecord> MapAsync(ActivityExecutionContext source)
 21    {
 424922        var outputs = source.GetOutputs();
 424923        var inputs = source.GetInputs();
 424924        var persistenceMap = source.GetLogPersistenceModeMap();
 424925        var persistableInputs = GetPersistableInputOutput(inputs, persistenceMap.Inputs);
 424926        var persistableOutputs = GetPersistableInputOutput(outputs, persistenceMap.Outputs);
 424927        var persistableProperties = GetPersistableDictionary(source.Properties!, persistenceMap.InternalState);
 424928        var persistableJournalData = GetPersistableDictionary(source.JournalData!, persistenceMap.InternalState);
 424929        var cancellationToken = source.CancellationToken;
 30
 424931        var record = new ActivityExecutionRecord
 424932        {
 424933            Id = source.Id,
 424934            ActivityId = source.Activity.Id,
 424935            ActivityNodeId = source.NodeId,
 424936            WorkflowInstanceId = source.WorkflowExecutionContext.Id,
 424937            ActivityType = source.Activity.Type,
 424938            ActivityName = source.Activity.Name,
 424939            ActivityState = persistableInputs,
 424940            Outputs = persistableOutputs,
 424941            Properties = persistableProperties!,
 424942            Metadata = new Dictionary<string, object>(source.Metadata),
 424943            Payload = persistableJournalData!,
 424944            Exception = ExceptionState.FromException(source.Exception),
 424945            ActivityTypeVersion = source.Activity.Version,
 424946            StartedAt = source.StartedAt,
 424947            HasBookmarks = source.Bookmarks.Any(),
 424948            Status = source.Status,
 424949            AggregateFaultCount = source.AggregateFaultCount,
 424950            CompletedAt = source.CompletedAt,
 424951            SchedulingActivityExecutionId = source.SchedulingActivityExecutionId,
 424952            SchedulingActivityId = source.SchedulingActivityId,
 424953            SchedulingWorkflowInstanceId = source.SchedulingWorkflowInstanceId,
 424954            CallStackDepth = source.CallStackDepth
 424955        };
 56
 424957        record = record.SanitizeLogMessage();
 424958        var compressionAlgorithm = options.Value.CompressionAlgorithm ?? nameof(None);
 424959        var serializedActivityState = record.ActivityState?.Count > 0 ? safeSerializer.Serialize(record.ActivityState) :
 424960        var compressedSerializedActivityState = serializedActivityState != null ? await compressionCodecResolver.Resolve
 424961        var serializedProperties = record.Properties != null ? payloadSerializer.Serialize(record.Properties) : null;
 424962        var serializedMetadata = record.Metadata != null ? payloadSerializer.Serialize(record.Metadata) : null;
 424963        record.SerializedSnapshot = new()
 424964        {
 424965            Id = record.Id,
 424966            TenantId = record.TenantId,
 424967            WorkflowInstanceId = record.WorkflowInstanceId,
 424968            ActivityId = record.ActivityId,
 424969            ActivityNodeId = record.ActivityNodeId,
 424970            ActivityType = record.ActivityType,
 424971            ActivityTypeVersion = record.ActivityTypeVersion,
 424972            ActivityName = record.ActivityName,
 424973            StartedAt = record.StartedAt,
 424974            HasBookmarks = record.HasBookmarks,
 424975            Status = record.Status,
 424976            AggregateFaultCount = record.AggregateFaultCount,
 424977            CompletedAt = record.CompletedAt,
 424978            SerializedActivityState = compressedSerializedActivityState,
 424979            SerializedActivityStateCompressionAlgorithm = compressionAlgorithm,
 424980            SerializedOutputs = record.Outputs?.Any() == true ? safeSerializer.Serialize(record.Outputs) : null,
 424981            SerializedProperties = serializedProperties,
 424982            SerializedMetadata = serializedMetadata,
 424983            SerializedException = record.Exception != null ? payloadSerializer.Serialize(record.Exception) : null,
 424984            SerializedPayload = record.Payload?.Any() == true ? payloadSerializer.Serialize(record.Payload) : null
 424985        };
 86
 424987        return record;
 424988    }
 89
 90    private IDictionary<string, object?> GetPersistableInputOutput(IDictionary<string, object> state, IDictionary<string
 91    {
 849892        var result = new Dictionary<string, object?>();
 3486693        foreach (var stateEntry in state)
 94        {
 893595            var mode = map.TryGetValue(stateEntry.Key, out var value) ? value : LogPersistenceMode.Include;
 893596            if (mode == LogPersistenceMode.Include)
 892797                result.Add(stateEntry.Key, stateEntry.Value);
 98        }
 99
 8498100        return result;
 101    }
 102
 103    private IDictionary<string, object?>? GetPersistableDictionary(IDictionary<string, object?> dictionary, LogPersisten
 104    {
 8498105        return mode == LogPersistenceMode.Include ? new Dictionary<string, object?>(dictionary) : null;
 106    }
 107}