From 724caa2124bcb093ffc8b83de571c8373776e20d Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 12 Nov 2019 15:51:57 +0100 Subject: [PATCH] Fix workflow serializer for old NoUpdate values. --- .../Contents/Json/JsonWorkflowStep.cs | 60 +++++++++++++++++++ .../Contents/Json/JsonWorkflowTransition.cs | 4 +- ...nConverter.cs => WorkflowStepConverter.cs} | 12 ++-- .../Config/Domain/SerializationServices.cs | 2 +- .../Model/Contents/WorkflowJsonTests.cs | 10 ++++ .../TestUtils.cs | 7 ++- 6 files changed, 85 insertions(+), 10 deletions(-) create mode 100644 backend/src/Squidex.Domain.Apps.Core.Model/Contents/Json/JsonWorkflowStep.cs rename backend/src/Squidex.Domain.Apps.Core.Model/Contents/Json/{WorkflowTransitionConverter.cs => WorkflowStepConverter.cs} (60%) diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Contents/Json/JsonWorkflowStep.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/Json/JsonWorkflowStep.cs new file mode 100644 index 000000000..e9dfb2ed9 --- /dev/null +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/Json/JsonWorkflowStep.cs @@ -0,0 +1,60 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; +using Squidex.Infrastructure.Reflection; + +namespace Squidex.Domain.Apps.Core.Contents.Json +{ + public sealed class JsonWorkflowStep + { + [JsonProperty] + public Dictionary Transitions { get; set; } + + [JsonProperty] + public string? Color { get; set; } + + [JsonProperty("noUpdate")] + public bool NoUpdateFlag { get; set; } + + [JsonProperty("noUpdateRules")] + public NoUpdate? NoUpdate { get; set; } + + public JsonWorkflowStep() + { + } + + public JsonWorkflowStep(WorkflowStep step) + { + SimpleMapper.Map(step, this); + + Transitions = + step.Transitions.ToDictionary( + x => x.Key, + x => new JsonWorkflowTransition(x.Value)); + } + + public WorkflowStep ToStep() + { + var noUpdate = NoUpdate; + + if (NoUpdateFlag) + { + noUpdate = NoUpdate.Always; + } + + var transitions = + Transitions?.ToDictionary( + x => x.Key, + x => x.Value.ToTransition()); + + return new WorkflowStep(transitions, Color, noUpdate); + } + } +} diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Contents/Json/JsonWorkflowTransition.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/Json/JsonWorkflowTransition.cs index e6b1afb02..ff43a3bf1 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Contents/Json/JsonWorkflowTransition.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/Json/JsonWorkflowTransition.cs @@ -25,9 +25,9 @@ namespace Squidex.Domain.Apps.Core.Contents.Json { } - public JsonWorkflowTransition(WorkflowTransition client) + public JsonWorkflowTransition(WorkflowTransition transition) { - SimpleMapper.Map(client, this); + SimpleMapper.Map(transition, this); } public WorkflowTransition ToTransition() diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Contents/Json/WorkflowTransitionConverter.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/Json/WorkflowStepConverter.cs similarity index 60% rename from backend/src/Squidex.Domain.Apps.Core.Model/Contents/Json/WorkflowTransitionConverter.cs rename to backend/src/Squidex.Domain.Apps.Core.Model/Contents/Json/WorkflowStepConverter.cs index a0c3e2e4b..00481635b 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Contents/Json/WorkflowTransitionConverter.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/Json/WorkflowStepConverter.cs @@ -11,20 +11,20 @@ using Squidex.Infrastructure.Json.Newtonsoft; namespace Squidex.Domain.Apps.Core.Contents.Json { - public sealed class WorkflowTransitionConverter : JsonClassConverter + public sealed class WorkflowStepConverter : JsonClassConverter { - protected override void WriteValue(JsonWriter writer, WorkflowTransition value, JsonSerializer serializer) + protected override void WriteValue(JsonWriter writer, WorkflowStep value, JsonSerializer serializer) { - var json = new JsonWorkflowTransition(value); + var json = new JsonWorkflowStep(value); serializer.Serialize(writer, json); } - protected override WorkflowTransition ReadValue(JsonReader reader, Type objectType, JsonSerializer serializer) + protected override WorkflowStep ReadValue(JsonReader reader, Type objectType, JsonSerializer serializer) { - var json = serializer.Deserialize(reader)!; + var json = serializer.Deserialize(reader)!; - return json.ToTransition(); + return json.ToStep(); } } } diff --git a/backend/src/Squidex/Config/Domain/SerializationServices.cs b/backend/src/Squidex/Config/Domain/SerializationServices.cs index 45d8b5727..f1a387763 100644 --- a/backend/src/Squidex/Config/Domain/SerializationServices.cs +++ b/backend/src/Squidex/Config/Domain/SerializationServices.cs @@ -53,7 +53,7 @@ namespace Squidex.Config.Domain new StatusConverter(), new StringEnumConverter(), new WorkflowConverter(), - new WorkflowTransitionConverter()); + new WorkflowStepConverter()); settings.NullValueHandling = NullValueHandling.Ignore; diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/WorkflowJsonTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/WorkflowJsonTests.cs index a92ca70a6..a37879f16 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/WorkflowJsonTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/WorkflowJsonTests.cs @@ -25,6 +25,16 @@ namespace Squidex.Domain.Apps.Core.Model.Contents serialized.Should().BeEquivalentTo(workflow); } + [Fact] + public void Should_deserialize_old_noUpdate_condition() + { + var jsonStep = new { noUpdate = true }; + + var serialized = jsonStep.SerializeAndDeserialize(); + + serialized.Should().BeEquivalentTo(new WorkflowStep(null, null, NoUpdate.Always)); + } + [Fact] public void Should_serialize_and_deserialize_no_update_condition() { diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/TestUtils.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/TestUtils.cs index aa535de60..878f82e69 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/TestUtils.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/TestUtils.cs @@ -65,7 +65,7 @@ namespace Squidex.Domain.Apps.Core new StatusConverter(), new StringEnumConverter(), new WorkflowConverter(), - new WorkflowTransitionConverter()), + new WorkflowStepConverter()), TypeNameHandling = typeNameHandling }; @@ -123,6 +123,11 @@ namespace Squidex.Domain.Apps.Core return schema; } + public static T SerializeAndDeserialize(this object value) + { + return DefaultSerializer.Deserialize(DefaultSerializer.Serialize(value)); + } + public static T SerializeAndDeserialize(this T value) { return DefaultSerializer.Deserialize(DefaultSerializer.Serialize(value));