diff --git a/src/Squidex.Domain.Apps.Core/ContentEnricher.cs b/src/Squidex.Domain.Apps.Core/ContentEnricher.cs index 2d633ad13..6b0247080 100644 --- a/src/Squidex.Domain.Apps.Core/ContentEnricher.cs +++ b/src/Squidex.Domain.Apps.Core/ContentEnricher.cs @@ -64,7 +64,7 @@ namespace Squidex.Domain.Apps.Core var key = partitionItem.Key; - if (!fieldData.TryGetValue(key, out var value) || value == null || value.Type == JTokenType.Null) + if (!fieldData.TryGetValue(key, out var value) || field.RawProperties.ShouldApplyDefaultValue(value)) { fieldData.AddValue(key, defaultValue); } diff --git a/src/Squidex.Domain.Apps.Core/Schemas/FieldProperties.cs b/src/Squidex.Domain.Apps.Core/Schemas/FieldProperties.cs index 262d8453f..f9785bbbf 100644 --- a/src/Squidex.Domain.Apps.Core/Schemas/FieldProperties.cs +++ b/src/Squidex.Domain.Apps.Core/Schemas/FieldProperties.cs @@ -9,6 +9,7 @@ using System.Collections.Generic; using Newtonsoft.Json.Linq; using Squidex.Infrastructure; +using Squidex.Infrastructure.Json; namespace Squidex.Domain.Apps.Core.Schemas { @@ -62,6 +63,11 @@ namespace Squidex.Domain.Apps.Core.Schemas public abstract JToken GetDefaultValue(); + public virtual bool ShouldApplyDefaultValue(JToken value) + { + return value.IsNull(); + } + public void Validate(IList errors) { foreach (var error in ValidateCore()) diff --git a/src/Squidex.Domain.Apps.Core/Schemas/StringFieldProperties.cs b/src/Squidex.Domain.Apps.Core/Schemas/StringFieldProperties.cs index eb70680ac..fe038910d 100644 --- a/src/Squidex.Domain.Apps.Core/Schemas/StringFieldProperties.cs +++ b/src/Squidex.Domain.Apps.Core/Schemas/StringFieldProperties.cs @@ -10,6 +10,7 @@ using System.Collections.Generic; using System.Collections.Immutable; using Newtonsoft.Json.Linq; using Squidex.Infrastructure; +using Squidex.Infrastructure.Json; namespace Squidex.Domain.Apps.Core.Schemas { @@ -127,6 +128,11 @@ namespace Squidex.Domain.Apps.Core.Schemas return DefaultValue; } + public override bool ShouldApplyDefaultValue(JToken value) + { + return value.IsNull() || (value is JValue jValue && Equals(jValue.Value, string.Empty)); + } + protected override IEnumerable ValidateCore() { if (!Editor.IsEnumValue()) diff --git a/tests/Squidex.Domain.Apps.Core.Tests/ContentEnrichmentTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/ContentEnrichmentTests.cs index 35ed1e728..c50f0bc42 100644 --- a/tests/Squidex.Domain.Apps.Core.Tests/ContentEnrichmentTests.cs +++ b/tests/Squidex.Domain.Apps.Core.Tests/ContentEnrichmentTests.cs @@ -18,32 +18,30 @@ namespace Squidex.Domain.Apps.Core { public class ContentEnrichmentTests { + private static readonly Instant Now = Instant.FromUnixTimeSeconds(SystemClock.Instance.GetCurrentInstant().ToUnixTimeSeconds()); private readonly LanguagesConfig languagesConfig = LanguagesConfig.Create(Language.DE, Language.EN); + private readonly Schema schema = + Schema.Create("my-schema", new SchemaProperties()) + .AddOrUpdateField(new JsonField(1, "my-json", Partitioning.Invariant, + new JsonFieldProperties())) + .AddOrUpdateField(new StringField(2, "my-string", Partitioning.Language, + new StringFieldProperties { DefaultValue = "en-string" })) + .AddOrUpdateField(new NumberField(3, "my-number", Partitioning.Invariant, + new NumberFieldProperties { DefaultValue = 123 })) + .AddOrUpdateField(new AssetsField(4, "my-assets", Partitioning.Invariant, + new AssetsFieldProperties())) + .AddOrUpdateField(new BooleanField(5, "my-boolean", Partitioning.Invariant, + new BooleanFieldProperties { DefaultValue = true })) + .AddOrUpdateField(new DateTimeField(6, "my-datetime", Partitioning.Invariant, + new DateTimeFieldProperties { DefaultValue = Now })) + .AddOrUpdateField(new ReferencesField(7, "my-references", Partitioning.Invariant, + new ReferencesFieldProperties { SchemaId = Guid.NewGuid() })) + .AddOrUpdateField(new GeolocationField(8, "my-geolocation", Partitioning.Invariant, + new GeolocationFieldProperties())); [Fact] private void Should_enrich_with_default_values() { - var now = Instant.FromUnixTimeSeconds(SystemClock.Instance.GetCurrentInstant().ToUnixTimeSeconds()); - - var schema = - Schema.Create("my-schema", new SchemaProperties()) - .AddOrUpdateField(new JsonField(1, "my-json", Partitioning.Invariant, - new JsonFieldProperties())) - .AddOrUpdateField(new StringField(2, "my-string", Partitioning.Language, - new StringFieldProperties { DefaultValue = "en-string" })) - .AddOrUpdateField(new NumberField(3, "my-number", Partitioning.Invariant, - new NumberFieldProperties { DefaultValue = 123 })) - .AddOrUpdateField(new AssetsField(4, "my-assets", Partitioning.Invariant, - new AssetsFieldProperties())) - .AddOrUpdateField(new BooleanField(5, "my-boolean", Partitioning.Invariant, - new BooleanFieldProperties { DefaultValue = true })) - .AddOrUpdateField(new DateTimeField(6, "my-datetime", Partitioning.Invariant, - new DateTimeFieldProperties { DefaultValue = now })) - .AddOrUpdateField(new ReferencesField(7, "my-references", Partitioning.Invariant, - new ReferencesFieldProperties { SchemaId = Guid.NewGuid() })) - .AddOrUpdateField(new GeolocationField(8, "my-geolocation", Partitioning.Invariant, - new GeolocationFieldProperties())); - var data = new NamedContentData() .AddField("my-string", @@ -60,9 +58,29 @@ namespace Squidex.Domain.Apps.Core Assert.Equal("de-string", (string)data["my-string"]["de"]); Assert.Equal("en-string", (string)data["my-string"]["en"]); - Assert.Equal(now, InstantPattern.General.Parse((string)data["my-datetime"]["iv"]).Value); + Assert.Equal(Now, InstantPattern.General.Parse((string)data["my-datetime"]["iv"]).Value); Assert.Equal(true, (bool)data["my-boolean"]["iv"]); } + + [Fact] + private void Should_also_enrich_with_default_values_when_string_is_empty() + { + var now = Instant.FromUnixTimeSeconds(SystemClock.Instance.GetCurrentInstant().ToUnixTimeSeconds()); + + var data = + new NamedContentData() + .AddField("my-string", + new ContentFieldData() + .AddValue("de", string.Empty)) + .AddField("my-number", + new ContentFieldData() + .AddValue("iv", 456)); + + data.Enrich(schema, languagesConfig.ToResolver()); + + Assert.Equal("en-string", (string)data["my-string"]["de"]); + Assert.Equal("en-string", (string)data["my-string"]["en"]); + } } }