diff --git a/src/modules/Elsa.Workflows.Management/Activities/WorkflowDefinitionActivity/WorkflowDefinitionActivity.cs b/src/modules/Elsa.Workflows.Management/Activities/WorkflowDefinitionActivity/WorkflowDefinitionActivity.cs index cfd6f0bbe..e0a394dea 100644 --- a/src/modules/Elsa.Workflows.Management/Activities/WorkflowDefinitionActivity/WorkflowDefinitionActivity.cs +++ b/src/modules/Elsa.Workflows.Management/Activities/WorkflowDefinitionActivity/WorkflowDefinitionActivity.cs @@ -23,7 +23,7 @@ public class WorkflowDefinitionActivity : Composite, IInitializable public string WorkflowDefinitionId { get; set; } = default!; /// - /// the latest published version number set by the provider. This is used by tooling to let the user know that a newer version is available. + /// The latest published version number set by the provider. This is used by tooling to let the user know that a newer version is available. /// public int LatestAvailablePublishedVersion { get; set; } diff --git a/src/modules/Elsa.Workflows.Management/Serialization/Converters/ActivityJsonConverter.cs b/src/modules/Elsa.Workflows.Management/Serialization/Converters/ActivityJsonConverter.cs index b44039d7a..fdde39057 100644 --- a/src/modules/Elsa.Workflows.Management/Serialization/Converters/ActivityJsonConverter.cs +++ b/src/modules/Elsa.Workflows.Management/Serialization/Converters/ActivityJsonConverter.cs @@ -44,6 +44,7 @@ public class ActivityJsonConverter : JsonConverter var activityTypeName = GetActivityDetails(activityRoot, out var activityTypeVersion, out var activityDescriptor); var notFoundActivityTypeName = ActivityTypeNameHelper.GenerateTypeName(); + // If the activity type is a NotFoundActivity, try to extract the original activity type name and version. if(activityTypeName.Equals(notFoundActivityTypeName) && activityRoot.TryGetProperty("originalActivityJson", out var originalActivityJson)) { activityRoot = JsonDocument.Parse(originalActivityJson.GetString()!).RootElement; @@ -54,6 +55,7 @@ public class ActivityJsonConverter : JsonConverter newOptions.Converters.Add(new InputJsonConverterFactory(_serviceProvider)); newOptions.Converters.Add(new OutputJsonConverterFactory(_serviceProvider)); + // If the activity type is not found, create a NotFoundActivity instead. if (activityDescriptor == null) { var notFoundContext = new ActivityConstructorContext(activityRoot, newOptions); @@ -221,10 +223,17 @@ public class ActivityJsonConverter : JsonConverter throw new JsonException("Failed to extract activity type property"); var activityTypeName = activityTypeNameElement.GetString()!; - - activityTypeVersion = activityRoot.TryGetProperty("version", out var activityVersionElement) ? activityVersionElement.GetInt32() : 1; - activityDescriptor = _activityRegistry.Find(activityTypeName, activityTypeVersion); - activityDescriptor ??= _activityRegistry.Find(activityTypeName); + + if (activityRoot.TryGetProperty("version", out var activityVersionElement)) + { + activityTypeVersion = activityVersionElement.GetInt32(); + activityDescriptor = _activityRegistry.Find(activityTypeName, activityTypeVersion); + } + else + { + activityDescriptor = _activityRegistry.Find(activityTypeName); + activityTypeVersion = activityDescriptor?.Version ?? 0; + } return activityTypeName; } diff --git a/src/modules/Elsa.Workflows.Management/Serialization/SerializationOptionsConfigurator.cs b/src/modules/Elsa.Workflows.Management/Serialization/SerializationOptionsConfigurator.cs index f038bfe3c..70ab26f1c 100644 --- a/src/modules/Elsa.Workflows.Management/Serialization/SerializationOptionsConfigurator.cs +++ b/src/modules/Elsa.Workflows.Management/Serialization/SerializationOptionsConfigurator.cs @@ -5,15 +5,22 @@ using Microsoft.Extensions.DependencyInjection; namespace Elsa.Workflows.Management.Serialization; +/// +/// Configures the JSON serialization options with support for serializing and deserializing activities and expressions. +/// public class SerializationOptionsConfigurator : ISerializationOptionsConfigurator { private readonly IServiceProvider _serviceProvider; + /// + /// Initializes a new instance of the class. + /// public SerializationOptionsConfigurator(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } + /// public void Configure(JsonSerializerOptions options) { options.Converters.Add(Create());