diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Apps/AppClients.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Apps/AppClients.cs index 2ba208f40..5b42241b4 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Apps/AppClients.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Apps/AppClients.cs @@ -5,7 +5,6 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== -using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using Squidex.Infrastructure; diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/ArrayFieldProperties.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/ArrayFieldProperties.cs index c4d7f99f3..48867f0ee 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/ArrayFieldProperties.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/ArrayFieldProperties.cs @@ -16,14 +16,14 @@ namespace Squidex.Domain.Apps.Core.Schemas public int? MaxItems { get; set; } - public override T Accept(IFieldPropertiesVisitor visitor) + public override T Accept(IFieldPropertiesVisitor visitor, TArgs args) { - return visitor.Visit(this); + return visitor.Visit(this, args); } - public override T Accept(IFieldVisitor visitor, IField field) + public override T Accept(IFieldVisitor visitor, IField field, TArgs args) { - return visitor.Visit((IArrayField)field); + return visitor.Visit((IArrayField)field, args); } public override RootField CreateRootField(long id, string name, Partitioning partitioning, IFieldSettings? settings = null) diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/AssetsFieldProperties.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/AssetsFieldProperties.cs index d09e2ac39..aa177d290 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/AssetsFieldProperties.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/AssetsFieldProperties.cs @@ -52,14 +52,14 @@ namespace Squidex.Domain.Apps.Core.Schemas public ReadOnlyCollection? AllowedExtensions { get; set; } - public override T Accept(IFieldPropertiesVisitor visitor) + public override T Accept(IFieldPropertiesVisitor visitor, TArgs args) { - return visitor.Visit(this); + return visitor.Visit(this, args); } - public override T Accept(IFieldVisitor visitor, IField field) + public override T Accept(IFieldVisitor visitor, IField field, TArgs args) { - return visitor.Visit((IField)field); + return visitor.Visit((IField)field, args); } public override RootField CreateRootField(long id, string name, Partitioning partitioning, IFieldSettings? settings = null) diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/BooleanFieldProperties.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/BooleanFieldProperties.cs index 7820d3c64..55b9e15b1 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/BooleanFieldProperties.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/BooleanFieldProperties.cs @@ -18,14 +18,14 @@ namespace Squidex.Domain.Apps.Core.Schemas public BooleanFieldEditor Editor { get; set; } - public override T Accept(IFieldPropertiesVisitor visitor) + public override T Accept(IFieldPropertiesVisitor visitor, TArgs args) { - return visitor.Visit(this); + return visitor.Visit(this, args); } - public override T Accept(IFieldVisitor visitor, IField field) + public override T Accept(IFieldVisitor visitor, IField field, TArgs args) { - return visitor.Visit((IField)field); + return visitor.Visit((IField)field, args); } public override RootField CreateRootField(long id, string name, Partitioning partitioning, IFieldSettings? settings = null) diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/DateTimeFieldProperties.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/DateTimeFieldProperties.cs index 0327165b4..94fc465c4 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/DateTimeFieldProperties.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/DateTimeFieldProperties.cs @@ -24,14 +24,14 @@ namespace Squidex.Domain.Apps.Core.Schemas public DateTimeFieldEditor Editor { get; set; } - public override T Accept(IFieldPropertiesVisitor visitor) + public override T Accept(IFieldPropertiesVisitor visitor, TArgs args) { - return visitor.Visit(this); + return visitor.Visit(this, args); } - public override T Accept(IFieldVisitor visitor, IField field) + public override T Accept(IFieldVisitor visitor, IField field, TArgs args) { - return visitor.Visit((IField)field); + return visitor.Visit((IField)field, args); } public override RootField CreateRootField(long id, string name, Partitioning partitioning, IFieldSettings? settings = null) diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/FieldProperties.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/FieldProperties.cs index 41ccb8aaa..165d07feb 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/FieldProperties.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/FieldProperties.cs @@ -24,9 +24,9 @@ namespace Squidex.Domain.Apps.Core.Schemas public ReadOnlyCollection? Tags { get; set; } - public abstract T Accept(IFieldPropertiesVisitor visitor); + public abstract T Accept(IFieldPropertiesVisitor visitor, TArgs args); - public abstract T Accept(IFieldVisitor visitor, IField field); + public abstract T Accept(IFieldVisitor visitor, IField field, TArgs args); public abstract RootField CreateRootField(long id, string name, Partitioning partitioning, IFieldSettings? settings = null); diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/GeolocationFieldProperties.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/GeolocationFieldProperties.cs index 7d3a8d344..fb06c9099 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/GeolocationFieldProperties.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/GeolocationFieldProperties.cs @@ -12,14 +12,14 @@ namespace Squidex.Domain.Apps.Core.Schemas { public GeolocationFieldEditor Editor { get; set; } - public override T Accept(IFieldPropertiesVisitor visitor) + public override T Accept(IFieldPropertiesVisitor visitor, TArgs args) { - return visitor.Visit(this); + return visitor.Visit(this, args); } - public override T Accept(IFieldVisitor visitor, IField field) + public override T Accept(IFieldVisitor visitor, IField field, TArgs args) { - return visitor.Visit((IField)field); + return visitor.Visit((IField)field, args); } public override RootField CreateRootField(long id, string name, Partitioning partitioning, IFieldSettings? settings = null) diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/IField.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/IField.cs index 52b1b0bd2..4f9aadac1 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/IField.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/IField.cs @@ -15,6 +15,6 @@ namespace Squidex.Domain.Apps.Core.Schemas FieldProperties RawProperties { get; } - T Accept(IFieldVisitor visitor); + T Accept(IFieldVisitor visitor, TArgs args); } } \ No newline at end of file diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/IFieldPropertiesVisitor.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/IFieldPropertiesVisitor.cs index 652d6173b..32e7c319b 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/IFieldPropertiesVisitor.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/IFieldPropertiesVisitor.cs @@ -7,28 +7,28 @@ namespace Squidex.Domain.Apps.Core.Schemas { - public interface IFieldPropertiesVisitor + public interface IFieldPropertiesVisitor { - T Visit(ArrayFieldProperties properties); + T Visit(ArrayFieldProperties properties, TArgs args); - T Visit(AssetsFieldProperties properties); + T Visit(AssetsFieldProperties properties, TArgs args); - T Visit(BooleanFieldProperties properties); + T Visit(BooleanFieldProperties properties, TArgs args); - T Visit(DateTimeFieldProperties properties); + T Visit(DateTimeFieldProperties properties, TArgs args); - T Visit(GeolocationFieldProperties properties); + T Visit(GeolocationFieldProperties properties, TArgs args); - T Visit(JsonFieldProperties properties); + T Visit(JsonFieldProperties properties, TArgs args); - T Visit(NumberFieldProperties properties); + T Visit(NumberFieldProperties properties, TArgs args); - T Visit(ReferencesFieldProperties properties); + T Visit(ReferencesFieldProperties properties, TArgs args); - T Visit(StringFieldProperties properties); + T Visit(StringFieldProperties properties, TArgs args); - T Visit(TagsFieldProperties properties); + T Visit(TagsFieldProperties properties, TArgs args); - T Visit(UIFieldProperties properties); + T Visit(UIFieldProperties properties, TArgs args); } } diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/IFieldVisitor.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/IFieldVisitor.cs index 710560f6d..94c4f34de 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/IFieldVisitor.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/IFieldVisitor.cs @@ -7,28 +7,28 @@ namespace Squidex.Domain.Apps.Core.Schemas { - public interface IFieldVisitor + public interface IFieldVisitor { - T Visit(IArrayField field); + T Visit(IArrayField field, TArgs args); - T Visit(IField field); + T Visit(IField field, TArgs args); - T Visit(IField field); + T Visit(IField field, TArgs args); - T Visit(IField field); + T Visit(IField field, TArgs args); - T Visit(IField field); + T Visit(IField field, TArgs args); - T Visit(IField field); + T Visit(IField field, TArgs args); - T Visit(IField field); + T Visit(IField field, TArgs args); - T Visit(IField field); + T Visit(IField field, TArgs args); - T Visit(IField field); + T Visit(IField field, TArgs args); - T Visit(IField field); + T Visit(IField field, TArgs args); - T Visit(IField field); + T Visit(IField field, TArgs args); } } diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/JsonFieldProperties.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/JsonFieldProperties.cs index 5e86df1e0..b9450c950 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/JsonFieldProperties.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/JsonFieldProperties.cs @@ -10,14 +10,14 @@ namespace Squidex.Domain.Apps.Core.Schemas [Equals(DoNotAddEqualityOperators = true)] public sealed class JsonFieldProperties : FieldProperties { - public override T Accept(IFieldPropertiesVisitor visitor) + public override T Accept(IFieldPropertiesVisitor visitor, TArgs args) { - return visitor.Visit(this); + return visitor.Visit(this, args); } - public override T Accept(IFieldVisitor visitor, IField field) + public override T Accept(IFieldVisitor visitor, IField field, TArgs args) { - return visitor.Visit((IField)field); + return visitor.Visit((IField)field, args); } public override RootField CreateRootField(long id, string name, Partitioning partitioning, IFieldSettings? settings = null) diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/NestedField.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/NestedField.cs index a28b78659..8bf0a391d 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/NestedField.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/NestedField.cs @@ -131,7 +131,7 @@ namespace Squidex.Domain.Apps.Core.Schemas }); } - public abstract T Accept(IFieldVisitor visitor); + public abstract T Accept(IFieldVisitor visitor, TArgs args); public abstract NestedField Update(FieldProperties newProperties); } diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/NestedField{T}.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/NestedField{T}.cs index 881d7225d..b4e468880 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/NestedField{T}.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/NestedField{T}.cs @@ -67,9 +67,9 @@ namespace Squidex.Domain.Apps.Core.Schemas return typedProperties; } - public override TResult Accept(IFieldVisitor visitor) + public override TResult Accept(IFieldVisitor visitor, TArgs args) { - return properties.Accept(visitor, this); + return properties.Accept(visitor, this, args); } } } diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/NumberFieldProperties.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/NumberFieldProperties.cs index 60dbb9930..fb9b3bf42 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/NumberFieldProperties.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/NumberFieldProperties.cs @@ -28,14 +28,14 @@ namespace Squidex.Domain.Apps.Core.Schemas public NumberFieldEditor Editor { get; set; } - public override T Accept(IFieldPropertiesVisitor visitor) + public override T Accept(IFieldPropertiesVisitor visitor, TArgs args) { - return visitor.Visit(this); + return visitor.Visit(this, args); } - public override T Accept(IFieldVisitor visitor, IField field) + public override T Accept(IFieldVisitor visitor, IField field, TArgs args) { - return visitor.Visit((IField)field); + return visitor.Visit((IField)field, args); } public override RootField CreateRootField(long id, string name, Partitioning partitioning, IFieldSettings? settings = null) diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/ReferencesFieldProperties.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/ReferencesFieldProperties.cs index 1eb2d93a2..6fec66b06 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/ReferencesFieldProperties.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/ReferencesFieldProperties.cs @@ -52,14 +52,14 @@ namespace Squidex.Domain.Apps.Core.Schemas public ReadOnlyCollection? SchemaIds { get; set; } - public override T Accept(IFieldPropertiesVisitor visitor) + public override T Accept(IFieldPropertiesVisitor visitor, TArgs args) { - return visitor.Visit(this); + return visitor.Visit(this, args); } - public override T Accept(IFieldVisitor visitor, IField field) + public override T Accept(IFieldVisitor visitor, IField field, TArgs args) { - return visitor.Visit((IField)field); + return visitor.Visit((IField)field, args); } public override RootField CreateRootField(long id, string name, Partitioning partitioning, IFieldSettings? settings = null) diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/RootField.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/RootField.cs index 22b71e544..4693bf75c 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/RootField.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/RootField.cs @@ -140,7 +140,7 @@ namespace Squidex.Domain.Apps.Core.Schemas }); } - public abstract T Accept(IFieldVisitor visitor); + public abstract T Accept(IFieldVisitor visitor, TArgs args); public abstract RootField Update(FieldProperties newProperties); } diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/RootField{T}.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/RootField{T}.cs index bc5ccce87..62bf695da 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/RootField{T}.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/RootField{T}.cs @@ -65,9 +65,9 @@ namespace Squidex.Domain.Apps.Core.Schemas return typedProperties; } - public override TResult Accept(IFieldVisitor visitor) + public override TResult Accept(IFieldVisitor visitor, TArgs args) { - return properties.Accept(visitor, this); + return properties.Accept(visitor, this, args); } } } diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/StringFieldProperties.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/StringFieldProperties.cs index d783291a4..2d53a091d 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/StringFieldProperties.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/StringFieldProperties.cs @@ -42,14 +42,14 @@ namespace Squidex.Domain.Apps.Core.Schemas public StringFieldEditor Editor { get; set; } - public override T Accept(IFieldPropertiesVisitor visitor) + public override T Accept(IFieldPropertiesVisitor visitor, TArgs args) { - return visitor.Visit(this); + return visitor.Visit(this, args); } - public override T Accept(IFieldVisitor visitor, IField field) + public override T Accept(IFieldVisitor visitor, IField field, TArgs args) { - return visitor.Visit((IField)field); + return visitor.Visit((IField)field, args); } public override RootField CreateRootField(long id, string name, Partitioning partitioning, IFieldSettings? settings = null) diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/TagsFieldProperties.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/TagsFieldProperties.cs index 1f5c287fb..e80e21154 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/TagsFieldProperties.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/TagsFieldProperties.cs @@ -26,14 +26,14 @@ namespace Squidex.Domain.Apps.Core.Schemas public TagsFieldNormalization Normalization { get; set; } - public override T Accept(IFieldPropertiesVisitor visitor) + public override T Accept(IFieldPropertiesVisitor visitor, TArgs args) { - return visitor.Visit(this); + return visitor.Visit(this, args); } - public override T Accept(IFieldVisitor visitor, IField field) + public override T Accept(IFieldVisitor visitor, IField field, TArgs args) { - return visitor.Visit((IField)field); + return visitor.Visit((IField)field, args); } public override RootField CreateRootField(long id, string name, Partitioning partitioning, IFieldSettings? settings = null) diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/UIFieldProperties.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/UIFieldProperties.cs index 0aaa23a7c..b4f96f913 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/UIFieldProperties.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/UIFieldProperties.cs @@ -12,14 +12,14 @@ namespace Squidex.Domain.Apps.Core.Schemas { public UIFieldEditor Editor { get; set; } - public override T Accept(IFieldPropertiesVisitor visitor) + public override T Accept(IFieldPropertiesVisitor visitor, TArgs args) { - return visitor.Visit(this); + return visitor.Visit(this, args); } - public override T Accept(IFieldVisitor visitor, IField field) + public override T Accept(IFieldVisitor visitor, IField field, TArgs args) { - return visitor.Visit((IField)field); + return visitor.Visit((IField)field, args); } public override NestedField CreateNestedField(long id, string name, IFieldSettings? settings = null) diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/StringFormatter.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/StringFormatter.cs index 41ec367a7..4f44a534c 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/StringFormatter.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/StringFormatter.cs @@ -11,16 +11,25 @@ using Squidex.Infrastructure.Json.Objects; namespace Squidex.Domain.Apps.Core.ConvertContent { - public sealed class StringFormatter : IFieldVisitor + public sealed class StringFormatter : IFieldPropertiesVisitor { - private readonly IJsonValue value; + private static readonly StringFormatter Instance = new StringFormatter(); - private StringFormatter(IJsonValue value) + public readonly struct Args + { + public readonly IJsonValue Value; + + public Args(IJsonValue value) + { + Value = value; + } + } + + private StringFormatter() { - this.value = value; } - public static string Format(IJsonValue? value, IField field) + public static string Format(IField field, IJsonValue? value) { Guard.NotNull(field, nameof(field)); @@ -29,22 +38,24 @@ namespace Squidex.Domain.Apps.Core.ConvertContent return string.Empty; } - return field.Accept(new StringFormatter(value)); + var args = new Args(value ?? JsonValue.Null); + + return field.RawProperties.Accept(Instance, args); } - public string Visit(IArrayField field) + public string Visit(ArrayFieldProperties properties, Args args) { - return FormatArray("Item", "Items"); + return FormatArray(args.Value, "Item", "Items"); } - public string Visit(IField field) + public string Visit(AssetsFieldProperties properties, Args args) { - return FormatArray("Asset", "Assets"); + return FormatArray(args.Value, "Asset", "Assets"); } - public string Visit(IField field) + public string Visit(BooleanFieldProperties properties, Args args) { - if (value is JsonBoolean boolean && boolean.Value) + if (args.Value is JsonBoolean boolean && boolean.Value) { return "Yes"; } @@ -54,14 +65,16 @@ namespace Squidex.Domain.Apps.Core.ConvertContent } } - public string Visit(IField field) + public string Visit(DateTimeFieldProperties properties, Args args) { - return value.ToString(); + return args.Value.ToString(); } - public string Visit(IField field) + public string Visit(GeolocationFieldProperties properties, Args args) { - if (value is JsonObject obj && obj.TryGetValue("latitude", out var lat) && obj.TryGetValue("longitude", out var lon)) + if (args.Value is JsonObject jsonObject && + jsonObject.TryGetValue("latitude", out var lat) && + jsonObject.TryGetValue("longitude", out var lon)) { return $"{lat}, {lon}"; } @@ -71,36 +84,36 @@ namespace Squidex.Domain.Apps.Core.ConvertContent } } - public string Visit(IField field) + public string Visit(JsonFieldProperties properties, Args args) { return ""; } - public string Visit(IField field) + public string Visit(NumberFieldProperties properties, Args args) { - return value.ToString(); + return args.Value.ToString(); } - public string Visit(IField field) + public string Visit(ReferencesFieldProperties properties, Args args) { - return FormatArray("Reference", "References"); + return FormatArray(args.Value, "Reference", "References"); } - public string Visit(IField field) + public string Visit(StringFieldProperties properties, Args args) { - if (field.Properties.Editor == StringFieldEditor.StockPhoto) + if (properties.Editor == StringFieldEditor.StockPhoto) { return "[Photo]"; } else { - return value.ToString(); + return args.Value.ToString(); } } - public string Visit(IField field) + public string Visit(TagsFieldProperties properties, Args args) { - if (value is JsonArray array) + if (args.Value is JsonArray array) { return string.Join(", ", array); } @@ -110,12 +123,12 @@ namespace Squidex.Domain.Apps.Core.ConvertContent } } - public string Visit(IField field) + public string Visit(UIFieldProperties properties, Args args) { return string.Empty; } - private string FormatArray(string singularName, string pluralName) + private static string FormatArray(IJsonValue value, string singularName, string pluralName) { if (value is JsonArray array) { diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/DefaultValues/DefaultValueFactory.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/DefaultValues/DefaultValueFactory.cs index 971008610..bad76fe3d 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/DefaultValues/DefaultValueFactory.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/DefaultValues/DefaultValueFactory.cs @@ -13,104 +13,116 @@ using Squidex.Infrastructure.Json.Objects; namespace Squidex.Domain.Apps.Core.DefaultValues { - public sealed class DefaultValueFactory : IFieldVisitor + public sealed class DefaultValueFactory : IFieldPropertiesVisitor { - private readonly Instant now; - private readonly string partition; + private static readonly DefaultValueFactory Instance = new DefaultValueFactory(); - private DefaultValueFactory(Instant now, string partition) + public readonly struct Args + { + public readonly Instant Now; + + public readonly string Partition; + + public Args(Instant now, string partition) + { + Now = now; + + Partition = partition; + } + } + + private DefaultValueFactory() { - this.now = now; - this.partition = partition; } public static IJsonValue CreateDefaultValue(IField field, Instant now, string partition) { Guard.NotNull(field, nameof(field)); + Guard.NotNull(partition, nameof(partition)); - return field.Accept(new DefaultValueFactory(now, partition)); + return field.RawProperties.Accept(Instance, new Args(now, partition)); } - public IJsonValue Visit(IArrayField field) + public IJsonValue Visit(ArrayFieldProperties properties, Args args) { return JsonValue.Array(); } - public IJsonValue Visit(IField field) + public IJsonValue Visit(AssetsFieldProperties properties, Args args) { - var value = GetDefaultValue(field.Properties.DefaultValue, field.Properties.DefaultValues); + var value = GetDefaultValue(properties.DefaultValue, properties.DefaultValues, args.Partition); return Array(value); } - public IJsonValue Visit(IField field) + public IJsonValue Visit(BooleanFieldProperties properties, Args args) { - var value = GetDefaultValue(field.Properties.DefaultValue, field.Properties.DefaultValues); + var value = GetDefaultValue(properties.DefaultValue, properties.DefaultValues, args.Partition); return JsonValue.Create(value); } - public IJsonValue Visit(IField field) + public IJsonValue Visit(GeolocationFieldProperties properties, Args args) { return JsonValue.Null; } - public IJsonValue Visit(IField field) + public IJsonValue Visit(JsonFieldProperties properties, Args args) { return JsonValue.Null; } - public IJsonValue Visit(IField field) + public IJsonValue Visit(NumberFieldProperties properties, Args args) { - var value = GetDefaultValue(field.Properties.DefaultValue, field.Properties.DefaultValues); + var value = GetDefaultValue(properties.DefaultValue, properties.DefaultValues, args.Partition); return JsonValue.Create(value); } - public IJsonValue Visit(IField field) + public IJsonValue Visit(ReferencesFieldProperties properties, Args args) { - var value = GetDefaultValue(field.Properties.DefaultValue, field.Properties.DefaultValues); + var value = GetDefaultValue(properties.DefaultValue, properties.DefaultValues, args.Partition); return Array(value); } - public IJsonValue Visit(IField field) + public IJsonValue Visit(StringFieldProperties properties, Args args) { - var value = GetDefaultValue(field.Properties.DefaultValue, field.Properties.DefaultValues); + var value = GetDefaultValue(properties.DefaultValue, properties.DefaultValues, args.Partition); return JsonValue.Create(value); } - public IJsonValue Visit(IField field) + public IJsonValue Visit(TagsFieldProperties properties, Args args) { - var value = GetDefaultValue(field.Properties.DefaultValue, field.Properties.DefaultValues); + var value = GetDefaultValue(properties.DefaultValue, properties.DefaultValues, args.Partition); return Array(value); } - public IJsonValue Visit(IField field) + public IJsonValue Visit(UIFieldProperties properties, Args args) { return JsonValue.Null; } - public IJsonValue Visit(IField field) + public IJsonValue Visit(DateTimeFieldProperties properties, Args args) { - if (field.Properties.CalculatedDefaultValue == DateTimeCalculatedDefaultValue.Now) + if (properties.CalculatedDefaultValue == DateTimeCalculatedDefaultValue.Now) { - return JsonValue.Create(now); + return JsonValue.Create(args.Now); } - if (field.Properties.CalculatedDefaultValue == DateTimeCalculatedDefaultValue.Today) + if (properties.CalculatedDefaultValue == DateTimeCalculatedDefaultValue.Today) { - return JsonValue.Create($"{now.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)}T00:00:00Z"); + return JsonValue.Create($"{args.Now.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)}T00:00:00Z"); } - var value = GetDefaultValue(field.Properties.DefaultValue, field.Properties.DefaultValues); + var value = GetDefaultValue(properties.DefaultValue, properties.DefaultValues, args.Partition); return JsonValue.Create(value); } - private T GetDefaultValue(T value, LocalizedValue? values) + private static T GetDefaultValue(T value, LocalizedValue? values, string partition) { if (values != null && values.TryGetValue(partition, out var @default)) { diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ContentReferencesExtensions.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ContentReferencesExtensions.cs index 1b78ebf91..75808fe0b 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ContentReferencesExtensions.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ContentReferencesExtensions.cs @@ -20,57 +20,52 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds { Guard.NotNull(schema, nameof(schema)); - var extractor = new ReferencesExtractor(new HashSet(), referencesPerField); + var result = new HashSet(); - AddReferencedIds(source, schema.Fields, extractor); + AddReferencedIds(source, schema.Fields, result, referencesPerField); - return extractor.Result; + return result; } public static void AddReferencedIds(this NamedContentData source, Schema schema, HashSet result, int referencesPerField = int.MaxValue) { Guard.NotNull(schema, nameof(schema)); - var extractor = new ReferencesExtractor(result, referencesPerField); - - AddReferencedIds(source, schema.Fields, extractor); + AddReferencedIds(source, schema.Fields, result, referencesPerField); } public static void AddReferencedIds(this NamedContentData source, IEnumerable fields, HashSet result, int referencesPerField = int.MaxValue) { Guard.NotNull(fields, nameof(fields)); + Guard.NotNull(result, nameof(result)); - var extractor = new ReferencesExtractor(result, referencesPerField); - - AddReferencedIds(source, fields, extractor); + foreach (var field in fields) + { + AddReferencedIds(source, result, referencesPerField, field); + } } public static void AddReferencedIds(this NamedContentData source, IField field, HashSet result, int referencesPerField = int.MaxValue) { Guard.NotNull(field, nameof(field)); + Guard.NotNull(result, nameof(result)); - var extractor = new ReferencesExtractor(result, referencesPerField); - - AddReferencedIds(source, field, extractor); - } - - private static void AddReferencedIds(NamedContentData source, IEnumerable fields, ReferencesExtractor extractor) - { - foreach (var field in fields) + if (source.TryGetValue(field.Name, out var fieldData) && fieldData != null) { - AddReferencedIds(source, field, extractor); + foreach (var partitionValue in fieldData) + { + ReferencesExtractor.Extract(field, partitionValue.Value, result, referencesPerField); + } } } - private static void AddReferencedIds(NamedContentData source, IField field, ReferencesExtractor extractor) + private static void AddReferencedIds(NamedContentData source, HashSet result, int referencesPerField, IField field) { if (source.TryGetValue(field.Name, out var fieldData) && fieldData != null) { foreach (var partitionValue in fieldData) { - extractor.SetValue(partitionValue.Value); - - field.Accept(extractor); + ReferencesExtractor.Extract(field, partitionValue.Value, result, referencesPerField); } } } @@ -81,11 +76,7 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds if (value != null) { - var extractor = new ReferencesExtractor(result, referencesPerField); - - extractor.SetValue(value); - - field.Accept(extractor); + ReferencesExtractor.Extract(field, value, result, referencesPerField); } return result; diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesCleaner.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesCleaner.cs index 4694d91dc..d0a983b9d 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesCleaner.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesCleaner.cs @@ -12,87 +12,99 @@ using Squidex.Infrastructure.Json.Objects; namespace Squidex.Domain.Apps.Core.ExtractReferenceIds { - public sealed class ReferencesCleaner : IFieldVisitor + internal sealed class ReferencesCleaner : IFieldVisitor { - private readonly HashSet validIds; - private IJsonValue value; + private static readonly ReferencesCleaner Instance = new ReferencesCleaner(); - public ReferencesCleaner(HashSet validIds) + public readonly struct Args { - Guard.NotNull(validIds, nameof(validIds)); + public readonly IJsonValue Value; - this.validIds = validIds; + public readonly HashSet ValidIds; + + public Args(IJsonValue value, HashSet validIds) + { + Value = value; + + ValidIds = validIds; + } } - public void SetValue(IJsonValue newValue) + private ReferencesCleaner() { - value = newValue; } - public IJsonValue Visit(IField field) + public static IJsonValue Cleanup(IField field, IJsonValue? value, HashSet validIds) + { + var args = new Args(value ?? JsonValue.Null, validIds); + + return field.Accept(Instance, args); + } + + public IJsonValue Visit(IField field, Args args) { - return CleanIds(); + return CleanIds(args); } - public IJsonValue Visit(IField field) + public IJsonValue Visit(IField field, Args args) { - return CleanIds(); + return CleanIds(args); } - public IJsonValue Visit(IField field) + public IJsonValue Visit(IField field, Args args) { - return value; + return args.Value; } - public IJsonValue Visit(IField field) + public IJsonValue Visit(IField field, Args args) { - return value; + return args.Value; } - public IJsonValue Visit(IField field) + public IJsonValue Visit(IField field, Args args) { - return value; + return args.Value; } - public IJsonValue Visit(IField field) + public IJsonValue Visit(IField field, Args args) { - return value; + return args.Value; } - public IJsonValue Visit(IField field) + public IJsonValue Visit(IField field, Args args) { - return value; + return args.Value; } - public IJsonValue Visit(IField field) + public IJsonValue Visit(IField field, Args args) { - return value; + return args.Value; } - public IJsonValue Visit(IField field) + public IJsonValue Visit(IField field, Args args) { - return value; + return args.Value; } - public IJsonValue Visit(IField field) + public IJsonValue Visit(IField field, Args args) { - return value; + return args.Value; } - public IJsonValue Visit(IArrayField field) + public IJsonValue Visit(IArrayField field, Args args) { - return value; + return args.Value; } - private IJsonValue CleanIds() + private static IJsonValue CleanIds(Args args) { - if (value is JsonArray array) + if (args.Value is JsonArray array) { var result = array; for (var i = 0; i < result.Count; i++) { - if (!IsValidReference(result[i])) + if (!IsValidReference(result[i], args)) { if (ReferenceEquals(result, array)) { @@ -107,12 +119,12 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds return result; } - return value; + return args.Value; } - private bool IsValidReference(IJsonValue item) + private static bool IsValidReference(IJsonValue item, Args args) { - return item is JsonString s && validIds.Contains(DomainId.Create(s.Value)); + return item is JsonString s && args.ValidIds.Contains(DomainId.Create(s.Value)); } } } diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesExtractor.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesExtractor.cs index a5beee7b8..08ae112a0 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesExtractor.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesExtractor.cs @@ -13,34 +13,40 @@ using Squidex.Infrastructure.Json.Objects; namespace Squidex.Domain.Apps.Core.ExtractReferenceIds { - internal sealed class ReferencesExtractor : IFieldVisitor + internal sealed class ReferencesExtractor : IFieldVisitor { - private readonly HashSet result; - private readonly int take; - private IJsonValue? value; + private static readonly ReferencesExtractor Instance = new ReferencesExtractor(); - public HashSet Result + public readonly struct Args { - get { return result; } - } + public readonly IJsonValue Value; - public ReferencesExtractor(HashSet result, int take) - { - Guard.NotNull(result, nameof(result)); + public readonly HashSet Result; + + public readonly int ResultLimit; - this.result = result; + public Args(IJsonValue value, HashSet result, int take) + { + Value = value; + Result = result; + ResultLimit = take; + } + } - this.take = take; + private ReferencesExtractor() + { } - public void SetValue(IJsonValue? newValue) + public static None Extract(IField field, IJsonValue? value, HashSet result, int take) { - value = newValue; + var args = new Args(value ?? JsonValue.Null, result, take); + + return field.Accept(Instance, args); } - public None Visit(IArrayField field) + public None Visit(IArrayField field, Args args) { - if (value is JsonArray array) + if (args.Value is JsonArray array) { foreach (var item in array.OfType()) { @@ -48,9 +54,7 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds { if (item.TryGetValue(nestedField.Name, out var nestedValue)) { - SetValue(nestedValue); - - nestedField.Accept(this); + nestedField.Accept(this, new Args(nestedValue, args.Result, args.ResultLimit)); } } } @@ -59,58 +63,81 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds return None.Value; } - public None Visit(IField field) + public None Visit(IField field, Args args) { - value.AddIds(result, take); + AddIds(ref args); return None.Value; } - public None Visit(IField field) + public None Visit(IField field, Args args) { - value.AddIds(result, take); + AddIds(ref args); return None.Value; } - public None Visit(IField field) + public None Visit(IField field, Args args) { return None.Value; } - public None Visit(IField field) + public None Visit(IField field, Args args) { return None.Value; } - public None Visit(IField field) + public None Visit(IField field, Args args) { return None.Value; } - public None Visit(IField field) + public None Visit(IField field, Args args) { return None.Value; } - public None Visit(IField field) + public None Visit(IField field, Args args) { return None.Value; } - public None Visit(IField field) + public None Visit(IField field, Args args) { return None.Value; } - public None Visit(IField field) + public None Visit(IField field, Args args) { return None.Value; } - public None Visit(IField field) + public None Visit(IField field, Args args) { return None.Value; } + + private static void AddIds(ref Args args) + { + var added = 0; + + if (args.Value is JsonArray array) + { + foreach (var id in array) + { + if (id is JsonString s) + { + args.Result.Add(DomainId.Create(s.Value)); + + added++; + + if (added >= args.ResultLimit) + { + break; + } + } + } + } + } } } diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ValueReferencesConverter.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ValueReferencesConverter.cs index 2ca7ad847..26302ffcd 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ValueReferencesConverter.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ValueReferencesConverter.cs @@ -21,8 +21,6 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds return ValueConverters.Noop; } - var cleaner = new ReferencesCleaner(validIds); - return (value, field, parent) => { if (value.Type == JsonValueType.Null) @@ -30,9 +28,7 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds return value; } - cleaner.SetValue(value); - - return field.Accept(cleaner); + return ReferencesCleaner.Cleanup(field, value, validIds); }; } } diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateEdmSchema/EdmSchemaExtensions.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateEdmSchema/EdmSchemaExtensions.cs index 1bee2d459..a1b3dcf45 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateEdmSchema/EdmSchemaExtensions.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateEdmSchema/EdmSchemaExtensions.cs @@ -33,8 +33,6 @@ namespace Squidex.Domain.Apps.Core.GenerateEdmSchema var (edmType, _) = typeFactory("Data"); - var visitor = new EdmTypeVisitor(typeFactory); - foreach (var field in schema.FieldsByName.Values) { if (!field.IsForApi(withHidden)) @@ -42,7 +40,7 @@ namespace Squidex.Domain.Apps.Core.GenerateEdmSchema continue; } - var fieldEdmType = field.Accept(visitor); + var fieldEdmType = EdmTypeVisitor.BuildType(field, typeFactory); if (fieldEdmType == null) { diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateEdmSchema/EdmTypeVisitor.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateEdmSchema/EdmTypeVisitor.cs index 523a5fca5..f2b9f1544 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateEdmSchema/EdmTypeVisitor.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateEdmSchema/EdmTypeVisitor.cs @@ -11,30 +11,46 @@ using Squidex.Text; namespace Squidex.Domain.Apps.Core.GenerateEdmSchema { - public sealed class EdmTypeVisitor : IFieldVisitor + internal sealed class EdmTypeVisitor : IFieldVisitor { private static readonly EdmComplexType JsonType = new EdmComplexType("Squidex", "Json", null, false, true); - private readonly EdmTypeFactory typeFactory; + private static readonly EdmTypeVisitor Instance = new EdmTypeVisitor(); - internal EdmTypeVisitor(EdmTypeFactory typeFactory) + public readonly struct Args { - this.typeFactory = typeFactory; + public readonly EdmTypeFactory Factory; + + public Args(EdmTypeFactory factory) + { + Factory = factory; + } + } + + private EdmTypeVisitor() + { + } + + public static IEdmTypeReference? BuildType(IField field, EdmTypeFactory factory) + { + var args = new Args(factory); + + return field.Accept(Instance, args); } - public IEdmTypeReference? CreateEdmType(IField field) + public IEdmTypeReference? CreateEdmType(IField field, Args args) { - return field.Accept(this); + return field.Accept(this, args); } - public IEdmTypeReference? Visit(IArrayField field) + public IEdmTypeReference? Visit(IArrayField field, Args args) { - var (fieldEdmType, created) = typeFactory($"Data.{field.Name.ToPascalCase()}.Item"); + var (fieldEdmType, created) = args.Factory($"Data.{field.Name.ToPascalCase()}.Item"); if (created) { foreach (var nestedField in field.Fields) { - var nestedEdmType = nestedField.Accept(this); + var nestedEdmType = nestedField.Accept(this, args); if (nestedEdmType != null) { @@ -46,52 +62,52 @@ namespace Squidex.Domain.Apps.Core.GenerateEdmSchema return new EdmComplexTypeReference(fieldEdmType, false); } - public IEdmTypeReference? Visit(IField field) + public IEdmTypeReference? Visit(IField field, Args args) { return CreatePrimitive(EdmPrimitiveTypeKind.String, field); } - public IEdmTypeReference? Visit(IField field) + public IEdmTypeReference? Visit(IField field, Args args) { return CreatePrimitive(EdmPrimitiveTypeKind.Boolean, field); } - public IEdmTypeReference? Visit(IField field) + public IEdmTypeReference? Visit(IField field, Args args) { return CreatePrimitive(EdmPrimitiveTypeKind.DateTimeOffset, field); } - public IEdmTypeReference? Visit(IField field) + public IEdmTypeReference? Visit(IField field, Args args) { return null; } - public IEdmTypeReference? Visit(IField field) + public IEdmTypeReference? Visit(IField field, Args args) { return new EdmComplexTypeReference(JsonType, !field.RawProperties.IsRequired); } - public IEdmTypeReference? Visit(IField field) + public IEdmTypeReference? Visit(IField field, Args args) { return CreatePrimitive(EdmPrimitiveTypeKind.Double, field); } - public IEdmTypeReference? Visit(IField field) + public IEdmTypeReference? Visit(IField field, Args args) { return CreatePrimitive(EdmPrimitiveTypeKind.String, field); } - public IEdmTypeReference? Visit(IField field) + public IEdmTypeReference? Visit(IField field, Args args) { return CreatePrimitive(EdmPrimitiveTypeKind.String, field); } - public IEdmTypeReference? Visit(IField field) + public IEdmTypeReference? Visit(IField field, Args args) { return CreatePrimitive(EdmPrimitiveTypeKind.String, field); } - public IEdmTypeReference? Visit(IField field) + public IEdmTypeReference? Visit(IField field, Args args) { return null; } diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonSchemaExtensions.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonSchemaExtensions.cs index 45e9bb204..d8dd738c9 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonSchemaExtensions.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonSchemaExtensions.cs @@ -21,7 +21,6 @@ namespace Squidex.Domain.Apps.Core.GenerateJsonSchema var schemaName = schema.Name.ToPascalCase(); - var jsonTypeVisitor = new JsonTypeVisitor(schemaResolver, withHidden); var jsonSchema = SchemaBuilder.Object(); foreach (var field in schema.Fields.ForApi(withHidden)) @@ -31,7 +30,7 @@ namespace Squidex.Domain.Apps.Core.GenerateJsonSchema foreach (var partitionKey in partitioning.AllKeys) { - var partitionItemProperty = field.Accept(jsonTypeVisitor); + var partitionItemProperty = JsonTypeVisitor.BuildProperty(field, schemaResolver, withHidden); if (partitionItemProperty != null) { diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonTypeVisitor.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonTypeVisitor.cs index b022d2a23..8edb94e13 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonTypeVisitor.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonTypeVisitor.cs @@ -13,25 +13,42 @@ namespace Squidex.Domain.Apps.Core.GenerateJsonSchema { public delegate JsonSchema SchemaResolver(string name, JsonSchema schema); - public sealed class JsonTypeVisitor : IFieldVisitor + internal sealed class JsonTypeVisitor : IFieldVisitor { - private readonly SchemaResolver schemaResolver; - private readonly bool withHiddenFields; + private static readonly JsonTypeVisitor Instance = new JsonTypeVisitor(); - public JsonTypeVisitor(SchemaResolver schemaResolver, bool withHiddenFields) + public readonly struct Args { - this.schemaResolver = schemaResolver; + public readonly SchemaResolver SchemaResolver; - this.withHiddenFields = withHiddenFields; + public readonly bool WithHiddenFields; + + public Args(SchemaResolver schemaResolver, bool withHiddenFields) + { + SchemaResolver = schemaResolver; + + WithHiddenFields = withHiddenFields; + } + } + + private JsonTypeVisitor() + { + } + + public static JsonSchemaProperty? BuildProperty(IField field, SchemaResolver schemaResolver, bool withHiddenFields) + { + var args = new Args(schemaResolver, withHiddenFields); + + return field.Accept(Instance, args); } - public JsonSchemaProperty? Visit(IArrayField field) + public JsonSchemaProperty? Visit(IArrayField field, Args args) { var itemSchema = SchemaBuilder.Object(); - foreach (var nestedField in field.Fields.ForApi(withHiddenFields)) + foreach (var nestedField in field.Fields.ForApi(args.WithHiddenFields)) { - var nestedProperty = nestedField.Accept(this); + var nestedProperty = nestedField.Accept(this, args); if (nestedProperty != null) { @@ -45,24 +62,24 @@ namespace Squidex.Domain.Apps.Core.GenerateJsonSchema return SchemaBuilder.ArrayProperty(itemSchema); } - public JsonSchemaProperty? Visit(IField field) + public JsonSchemaProperty? Visit(IField field, Args args) { - var itemSchema = schemaResolver("AssetItem", SchemaBuilder.String()); + var itemSchema = args.SchemaResolver("AssetItem", SchemaBuilder.String()); return SchemaBuilder.ArrayProperty(itemSchema); } - public JsonSchemaProperty? Visit(IField field) + public JsonSchemaProperty? Visit(IField field, Args args) { return SchemaBuilder.BooleanProperty(); } - public JsonSchemaProperty? Visit(IField field) + public JsonSchemaProperty? Visit(IField field, Args args) { return SchemaBuilder.DateTimeProperty(); } - public JsonSchemaProperty? Visit(IField field) + public JsonSchemaProperty? Visit(IField field, Args args) { var geolocationSchema = SchemaBuilder.Object(); @@ -80,17 +97,17 @@ namespace Squidex.Domain.Apps.Core.GenerateJsonSchema Minimum = -180 }.SetRequired(true)); - var reference = schemaResolver("GeolocationDto", geolocationSchema); + var reference = args.SchemaResolver("GeolocationDto", geolocationSchema); return SchemaBuilder.ObjectProperty(reference); } - public JsonSchemaProperty? Visit(IField field) + public JsonSchemaProperty? Visit(IField field, Args args) { return SchemaBuilder.JsonProperty(); } - public JsonSchemaProperty? Visit(IField field) + public JsonSchemaProperty? Visit(IField field, Args args) { var property = SchemaBuilder.NumberProperty(); @@ -107,14 +124,14 @@ namespace Squidex.Domain.Apps.Core.GenerateJsonSchema return property; } - public JsonSchemaProperty? Visit(IField field) + public JsonSchemaProperty? Visit(IField field, Args args) { - var itemSchema = schemaResolver("ReferenceItem", SchemaBuilder.String()); + var itemSchema = args.SchemaResolver("ReferenceItem", SchemaBuilder.String()); return SchemaBuilder.ArrayProperty(itemSchema); } - public JsonSchemaProperty? Visit(IField field) + public JsonSchemaProperty? Visit(IField field, Args args) { var property = SchemaBuilder.StringProperty(); @@ -135,14 +152,14 @@ namespace Squidex.Domain.Apps.Core.GenerateJsonSchema return property; } - public JsonSchemaProperty? Visit(IField field) + public JsonSchemaProperty? Visit(IField field, Args args) { - var itemSchema = schemaResolver("ReferenceItem", SchemaBuilder.String()); + var itemSchema = args.SchemaResolver("ReferenceItem", SchemaBuilder.String()); return SchemaBuilder.ArrayProperty(itemSchema); } - public JsonSchemaProperty? Visit(IField field) + public JsonSchemaProperty? Visit(IField field, Args args) { return null; } diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/DefaultFieldValueValidatorsFactory.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/DefaultFieldValueValidatorsFactory.cs index d3add88ee..95b751acd 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/DefaultFieldValueValidatorsFactory.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/DefaultFieldValueValidatorsFactory.cs @@ -10,37 +10,44 @@ using System.Collections.Generic; using NodaTime; using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Core.ValidateContent.Validators; -using Squidex.Infrastructure; using Squidex.Infrastructure.Json.Objects; namespace Squidex.Domain.Apps.Core.ValidateContent { - internal sealed class DefaultFieldValueValidatorsFactory : IFieldVisitor> + internal sealed class DefaultFieldValueValidatorsFactory : IFieldVisitor, DefaultFieldValueValidatorsFactory.Args> { - private readonly ValidatorContext context; - private readonly ValidatorFactory createFieldValidator; + private static readonly DefaultFieldValueValidatorsFactory Instance = new DefaultFieldValueValidatorsFactory(); - private DefaultFieldValueValidatorsFactory(ValidatorContext context, ValidatorFactory createFieldValidator) + public struct Args { - this.context = context; - this.createFieldValidator = createFieldValidator; + public readonly ValidatorContext Context; + + public readonly ValidatorFactory Factory; + + public Args(ValidatorContext context, ValidatorFactory factory) + { + Context = context; + + Factory = factory; + } } - public static IEnumerable CreateValidators(ValidatorContext context, IField field, ValidatorFactory createFieldValidator) + private DefaultFieldValueValidatorsFactory() { - Guard.NotNull(context, nameof(context)); - Guard.NotNull(field, nameof(field)); + } - var visitor = new DefaultFieldValueValidatorsFactory(context, createFieldValidator); + public static IEnumerable CreateValidators(ValidatorContext context, IField field, ValidatorFactory createFieldValidator) + { + var args = new Args(context, createFieldValidator); - return field.Accept(visitor); + return field.Accept(Instance, args); } - public IEnumerable Visit(IArrayField field) + public IEnumerable Visit(IArrayField field, Args args) { var properties = field.Properties; - var isRequired = IsRequired(properties); + var isRequired = IsRequired(properties, args.Context); if (isRequired || properties.MinItems.HasValue || properties.MaxItems.HasValue) { @@ -51,22 +58,22 @@ namespace Squidex.Domain.Apps.Core.ValidateContent foreach (var nestedField in field.Fields) { - nestedValidators[nestedField.Name] = (false, createFieldValidator(nestedField)); + nestedValidators[nestedField.Name] = (false, args.Factory(nestedField)); } yield return new CollectionItemValidator(new ObjectValidator(nestedValidators, false, "field")); } - public IEnumerable Visit(IField field) + public IEnumerable Visit(IField field, Args args) { yield break; } - public IEnumerable Visit(IField field) + public IEnumerable Visit(IField field, Args args) { var properties = field.Properties; - var isRequired = IsRequired(properties); + var isRequired = IsRequired(properties, args.Context); if (isRequired) { @@ -74,11 +81,11 @@ namespace Squidex.Domain.Apps.Core.ValidateContent } } - public IEnumerable Visit(IField field) + public IEnumerable Visit(IField field, Args args) { var properties = field.Properties; - var isRequired = IsRequired(properties); + var isRequired = IsRequired(properties, args.Context); if (isRequired) { @@ -91,11 +98,11 @@ namespace Squidex.Domain.Apps.Core.ValidateContent } } - public IEnumerable Visit(IField field) + public IEnumerable Visit(IField field, Args args) { var properties = field.Properties; - var isRequired = IsRequired(properties); + var isRequired = IsRequired(properties, args.Context); if (isRequired) { @@ -103,11 +110,11 @@ namespace Squidex.Domain.Apps.Core.ValidateContent } } - public IEnumerable Visit(IField field) + public IEnumerable Visit(IField field, Args args) { var properties = field.Properties; - var isRequired = IsRequired(properties); + var isRequired = IsRequired(properties, args.Context); if (isRequired) { @@ -115,11 +122,11 @@ namespace Squidex.Domain.Apps.Core.ValidateContent } } - public IEnumerable Visit(IField field) + public IEnumerable Visit(IField field, Args args) { var properties = field.Properties; - var isRequired = IsRequired(properties); + var isRequired = IsRequired(properties, args.Context); if (isRequired) { @@ -137,16 +144,16 @@ namespace Squidex.Domain.Apps.Core.ValidateContent } } - public IEnumerable Visit(IField field) + public IEnumerable Visit(IField field, Args args) { yield break; } - public IEnumerable Visit(IField field) + public IEnumerable Visit(IField field, Args args) { var properties = field.Properties; - var isRequired = IsRequired(properties); + var isRequired = IsRequired(properties, args.Context); if (isRequired) { @@ -193,11 +200,11 @@ namespace Squidex.Domain.Apps.Core.ValidateContent } } - public IEnumerable Visit(IField field) + public IEnumerable Visit(IField field, Args args) { var properties = field.Properties; - var isRequired = IsRequired(properties); + var isRequired = IsRequired(properties, args.Context); if (isRequired || properties.MinItems.HasValue || properties.MaxItems.HasValue) { @@ -212,7 +219,7 @@ namespace Squidex.Domain.Apps.Core.ValidateContent yield return new CollectionItemValidator(new RequiredStringValidator(true)); } - public IEnumerable Visit(IField field) + public IEnumerable Visit(IField field, Args args) { if (field is INestedField) { @@ -220,7 +227,7 @@ namespace Squidex.Domain.Apps.Core.ValidateContent } } - private bool IsRequired(FieldProperties properties) + private static bool IsRequired(FieldProperties properties, ValidatorContext context) { var isRequired = properties.IsRequired; diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/FieldBagValidatorsFactory.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/FieldBagValidatorsFactory.cs index 79747c6b8..eec5149b9 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/FieldBagValidatorsFactory.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/FieldBagValidatorsFactory.cs @@ -12,7 +12,7 @@ using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Core.ValidateContent { - public sealed class FieldBagValidatorsFactory : IFieldVisitor> + internal sealed class FieldBagValidatorsFactory : IFieldVisitor, None> { private static readonly FieldBagValidatorsFactory Instance = new FieldBagValidatorsFactory(); @@ -22,62 +22,60 @@ namespace Squidex.Domain.Apps.Core.ValidateContent public static IEnumerable CreateValidators(IField field) { - Guard.NotNull(field, nameof(field)); - - return field.Accept(Instance); + return field.Accept(Instance, None.Value); } - public IEnumerable Visit(IArrayField field) + public IEnumerable Visit(IArrayField field, None args) { yield break; } - public IEnumerable Visit(IField field) + public IEnumerable Visit(IField field, None args) { yield break; } - public IEnumerable Visit(IField field) + public IEnumerable Visit(IField field, None args) { yield break; } - public IEnumerable Visit(IField field) + public IEnumerable Visit(IField field, None args) { yield break; } - public IEnumerable Visit(IField field) + public IEnumerable Visit(IField field, None args) { yield break; } - public IEnumerable Visit(IField field) + public IEnumerable Visit(IField field, None args) { yield break; } - public IEnumerable Visit(IField field) + public IEnumerable Visit(IField field, None args) { yield break; } - public IEnumerable Visit(IField field) + public IEnumerable Visit(IField field, None args) { yield break; } - public IEnumerable Visit(IField field) + public IEnumerable Visit(IField field, None args) { yield break; } - public IEnumerable Visit(IField field) + public IEnumerable Visit(IField field, None args) { yield break; } - public IEnumerable Visit(IField field) + public IEnumerable Visit(IField field, None args) { yield return NoValueValidator.Instance; } diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/JsonValueConverter.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/JsonValueConverter.cs index c831e445a..b6e188968 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/JsonValueConverter.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/JsonValueConverter.cs @@ -16,43 +16,55 @@ using Squidex.Infrastructure.Validation; namespace Squidex.Domain.Apps.Core.ValidateContent { - public sealed class JsonValueConverter : IFieldVisitor<(object? Result, JsonError? Error)> + public sealed class JsonValueConverter : IFieldVisitor<(object? Result, JsonError? Error), JsonValueConverter.Args> { - private readonly IJsonValue value; + private static readonly JsonValueConverter Instance = new JsonValueConverter(); - private JsonValueConverter(IJsonValue value) + public readonly struct Args { - this.value = value; + public readonly IJsonValue Value; + + public Args(IJsonValue value) + { + Value = value; + } } - public static (object? Result, JsonError? Error) ConvertValue(IField field, IJsonValue json) + private JsonValueConverter() { - return field.Accept(new JsonValueConverter(json)); } - public (object? Result, JsonError? Error) Visit(IArrayField field) + public static (object? Result, JsonError? Error) ConvertValue(IField field, IJsonValue value) + { + Guard.NotNull(field, nameof(field)); + Guard.NotNull(value, nameof(value)); + + return field.Accept(Instance, new Args(value)); + } + + public (object? Result, JsonError? Error) Visit(IArrayField field, Args args) { - return ConvertToObjectList(); + return ConvertToObjectList(args.Value); } - public (object? Result, JsonError? Error) Visit(IField field) + public (object? Result, JsonError? Error) Visit(IField field, Args args) { - return ConvertToIdList(); + return ConvertToIdList(args.Value); } - public (object? Result, JsonError? Error) Visit(IField field) + public (object? Result, JsonError? Error) Visit(IField field, Args args) { - return ConvertToIdList(); + return ConvertToIdList(args.Value); } - public (object? Result, JsonError? Error) Visit(IField field) + public (object? Result, JsonError? Error) Visit(IField field, Args args) { - return ConvertToStringList(); + return ConvertToStringList(args.Value); } - public (object? Result, JsonError? Error) Visit(IField field) + public (object? Result, JsonError? Error) Visit(IField field, Args args) { - if (value is JsonBoolean b) + if (args.Value is JsonBoolean b) { return (b.Value, null); } @@ -60,9 +72,9 @@ namespace Squidex.Domain.Apps.Core.ValidateContent return (null, new JsonError(T.Get("contents.invalidBoolean"))); } - public (object? Result, JsonError? Error) Visit(IField field) + public (object? Result, JsonError? Error) Visit(IField field, Args args) { - if (value is JsonNumber n) + if (args.Value is JsonNumber n) { return (n.Value, null); } @@ -70,9 +82,9 @@ namespace Squidex.Domain.Apps.Core.ValidateContent return (null, new JsonError(T.Get("contents.invalidNumber"))); } - public (object? Result, JsonError? Error) Visit(IField field) + public (object? Result, JsonError? Error) Visit(IField field, Args args) { - if (value is JsonString s) + if (args.Value is JsonString s) { return (s.Value, null); } @@ -80,16 +92,16 @@ namespace Squidex.Domain.Apps.Core.ValidateContent return (null, new JsonError(T.Get("contents.invalidString"))); } - public (object? Result, JsonError? Error) Visit(IField field) + public (object? Result, JsonError? Error) Visit(IField field, Args args) { - return (value, null); + return (args.Value, null); } - public (object? Result, JsonError? Error) Visit(IField field) + public (object? Result, JsonError? Error) Visit(IField field, Args args) { - if (value.Type == JsonValueType.String) + if (args.Value.Type == JsonValueType.String) { - var parseResult = InstantPattern.General.Parse(value.ToString()); + var parseResult = InstantPattern.General.Parse(args.Value.ToString()); if (!parseResult.Success) { @@ -102,9 +114,9 @@ namespace Squidex.Domain.Apps.Core.ValidateContent return (null, new JsonError(T.Get("contents.invalidString"))); } - public (object? Result, JsonError? Error) Visit(IField field) + public (object? Result, JsonError? Error) Visit(IField field, Args args) { - if (value is JsonObject geolocation) + if (args.Value is JsonObject geolocation) { foreach (var propertyName in geolocation.Keys) { @@ -143,18 +155,18 @@ namespace Squidex.Domain.Apps.Core.ValidateContent return (null, new JsonError(T.Get("contents.invalidGeolocation"))); } - return (value, null); + return (args.Value, null); } return (null, new JsonError(T.Get("contents.invalidGeolocation"))); } - public (object? Result, JsonError? Error) Visit(IField field) + public (object? Result, JsonError? Error) Visit(IField field, Args args) { - return (value, null); + return (args.Value, null); } - private (object? Result, JsonError? Error) ConvertToIdList() + private static (object? Result, JsonError? Error) ConvertToIdList(IJsonValue value) { if (value is JsonArray array) { @@ -178,7 +190,7 @@ namespace Squidex.Domain.Apps.Core.ValidateContent return (null, new JsonError("Invalid json type, expected array of strings.")); } - private (object? Result, JsonError? Error) ConvertToStringList() + private static (object? Result, JsonError? Error) ConvertToStringList(IJsonValue value) { if (value is JsonArray array) { @@ -206,7 +218,7 @@ namespace Squidex.Domain.Apps.Core.ValidateContent return (null, new JsonError(T.Get("contents.invalidArrayOfStrings"))); } - private (object? Result, JsonError? Error) ConvertToObjectList() + private static (object? Result, JsonError? Error) ConvertToObjectList(IJsonValue value) { if (value is JsonArray array) { diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/ObjectPath.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/ObjectPath.cs index 081780c90..d8b735b69 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/ObjectPath.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/ObjectPath.cs @@ -17,6 +17,7 @@ namespace Squidex.Domain.Apps.Core.ValidateContent var sb = new StringBuilder(); var index = 0; + foreach (var property in path) { if (index == 0) diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentsSearchSource.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentsSearchSource.cs index b99c52718..915345c47 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentsSearchSource.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentsSearchSource.cs @@ -138,7 +138,7 @@ namespace Squidex.Domain.Apps.Entities.Contents { var value = GetValue(content.ReferenceData, field) ?? GetValue(content.Data, field); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); if (!string.IsNullOrWhiteSpace(formatted)) { diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs index dce9c9907..c0b2c06ac 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs @@ -30,6 +30,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL private readonly IObjectGraphType assetType; private readonly IGraphType assetListType; private readonly GraphQLSchema graphQLSchema; + private readonly GraphQLTypeVisitor graphQLTypeVisitor; private readonly ISemanticLog log; public bool CanGenerateAssetSourceUrl { get; } @@ -54,6 +55,8 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL assetType = new AssetGraphType(this); assetListType = new ListGraphType(new NonNullGraphType(assetType)); + graphQLTypeVisitor = new GraphQLTypeVisitor(contentTypes, this, assetListType); + var allSchemas = schemas.Where(x => x.SchemaDef.IsPublished).ToList(); BuildSchemas(allSchemas); @@ -120,12 +123,12 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL public IGraphType? GetInputGraphType(ISchemaEntity schema, IField field, string fieldName) { - return field.Accept(new InputFieldVisitor(schema, this, fieldName)); + return InputFieldVisitor.Build(field, this, schema, fieldName); } public (IGraphType?, ValueResolver?, QueryArguments?) GetGraphType(ISchemaEntity schema, IField field, string fieldName) { - return field.Accept(new QueryGraphTypeVisitor(schema, contentTypes, this, assetListType, fieldName)); + return field.Accept(graphQLTypeVisitor, new GraphQLTypeVisitor.Args(schema, fieldName)); } public IGraphType GetAssetType() diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/QueryGraphTypeVisitor.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/GraphQLTypeVisitor.cs similarity index 72% rename from backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/QueryGraphTypeVisitor.cs rename to backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/GraphQLTypeVisitor.cs index cf48299ac..32e65dd02 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/QueryGraphTypeVisitor.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/GraphQLTypeVisitor.cs @@ -18,81 +18,92 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types { public delegate object ValueResolver(IJsonValue value, IResolveFieldContext context); - public sealed class QueryGraphTypeVisitor : IFieldVisitor<(IGraphType?, ValueResolver?, QueryArguments?)> + internal sealed class GraphQLTypeVisitor : IFieldVisitor<(IGraphType?, ValueResolver?, QueryArguments?), GraphQLTypeVisitor.Args> { private static readonly ValueResolver NoopResolver = (value, c) => value; private readonly Dictionary schemaTypes; - private readonly ISchemaEntity schema; - private readonly IGraphModel model; private readonly IGraphType assetListType; - private readonly string fieldName; + private readonly IGraphModel model; + + public readonly struct Args + { + public readonly ISchemaEntity Schema; + + public readonly string SchemaField; - public QueryGraphTypeVisitor(ISchemaEntity schema, + public Args(ISchemaEntity schema, string fieldName) + { + Schema = schema; + SchemaField = fieldName; + } + } + + public GraphQLTypeVisitor( Dictionary schemaTypes, IGraphModel model, - IGraphType assetListType, - string fieldName) + IGraphType assetListType) { - this.model = model; this.assetListType = assetListType; - this.schema = schema; + this.model = model; this.schemaTypes = schemaTypes; - this.fieldName = fieldName; } - public (IGraphType?, ValueResolver?, QueryArguments?) Visit(IArrayField field) + public (IGraphType?, ValueResolver?, QueryArguments?) Visit(IArrayField field, Args args) { - var schemaFieldType = new ListGraphType(new NonNullGraphType(new NestedGraphType(model, schema, field, fieldName))); + var schemaFieldType = + new ListGraphType( + new NonNullGraphType( + new NestedGraphType(model, args.Schema, field, args.SchemaField))); return (schemaFieldType, NoopResolver, null); } - public (IGraphType?, ValueResolver?, QueryArguments?) Visit(IField field) + public (IGraphType?, ValueResolver?, QueryArguments?) Visit(IField field, Args args) { return ResolveAssets(); } - public (IGraphType?, ValueResolver?, QueryArguments?) Visit(IField field) + public (IGraphType?, ValueResolver?, QueryArguments?) Visit(IField field, Args args) { return ResolveDefault(AllTypes.NoopBoolean); } - public (IGraphType?, ValueResolver?, QueryArguments?) Visit(IField field) + public (IGraphType?, ValueResolver?, QueryArguments?) Visit(IField field, Args args) { return ResolveDefault(AllTypes.NoopDate); } - public (IGraphType?, ValueResolver?, QueryArguments?) Visit(IField field) + public (IGraphType?, ValueResolver?, QueryArguments?) Visit(IField field, Args args) { return ResolveDefault(AllTypes.NoopGeolocation); } - public (IGraphType?, ValueResolver?, QueryArguments?) Visit(IField field) + public (IGraphType?, ValueResolver?, QueryArguments?) Visit(IField field, Args args) { return ResolveDefault(AllTypes.NoopFloat); } - public (IGraphType?, ValueResolver?, QueryArguments?) Visit(IField field) + public (IGraphType?, ValueResolver?, QueryArguments?) Visit(IField field, Args args) { - return ResolveReferences(field); + return ResolveReferences(field, args); } - public (IGraphType?, ValueResolver?, QueryArguments?) Visit(IField field) + public (IGraphType?, ValueResolver?, QueryArguments?) Visit(IField field, Args args) { return ResolveDefault(AllTypes.NoopString); } - public (IGraphType?, ValueResolver?, QueryArguments?) Visit(IField field) + public (IGraphType?, ValueResolver?, QueryArguments?) Visit(IField field, Args args) { return ResolveDefault(AllTypes.NoopTags); } - public (IGraphType?, ValueResolver?, QueryArguments?) Visit(IField field) + public (IGraphType?, ValueResolver?, QueryArguments?) Visit(IField field, Args args) { return (null, null, null); } - public (IGraphType?, ValueResolver?, QueryArguments?) Visit(IField field) + public (IGraphType?, ValueResolver?, QueryArguments?) Visit(IField field, Args args) { return (AllTypes.NoopJson, ContentActions.Json.Resolver, ContentActions.Json.Arguments); } @@ -114,13 +125,13 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types return (assetListType, resolver, null); } - private (IGraphType?, ValueResolver?, QueryArguments?) ResolveReferences(IField field) + private (IGraphType?, ValueResolver?, QueryArguments?) ResolveReferences(IField field, Args args) { IGraphType contentType = schemaTypes.GetOrDefault(field.Properties.SingleId()); if (contentType == null) { - var union = new ContentUnionGraphType(fieldName, schemaTypes, field.Properties.SchemaIds); + var union = new ContentUnionGraphType(args.SchemaField, schemaTypes, field.Properties.SchemaIds); if (!union.PossibleTypes.Any()) { diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/InputFieldVisitor.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/InputFieldVisitor.cs index 815ce052b..9ddcabb73 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/InputFieldVisitor.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/InputFieldVisitor.cs @@ -12,72 +12,93 @@ using Squidex.Domain.Apps.Entities.Schemas; namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types { - public sealed class InputFieldVisitor : IFieldVisitor + public sealed class InputFieldVisitor : IFieldVisitor { - private readonly ISchemaEntity schema; - private readonly IGraphModel model; - private readonly string fieldName; + private static readonly InputFieldVisitor Instance = new InputFieldVisitor(); - public InputFieldVisitor(ISchemaEntity schema, IGraphModel model, string fieldName) + public readonly struct Args { - this.model = model; - this.schema = schema; - this.fieldName = fieldName; + public readonly IGraphModel Model; + + public readonly ISchemaEntity Schema; + + public readonly string SchemaField; + + public Args(IGraphModel model, ISchemaEntity schema, string fieldName) + { + Model = model; + Schema = schema; + SchemaField = fieldName; + } + } + + private InputFieldVisitor() + { + } + + public static IGraphType? Build(IField field, IGraphModel model, ISchemaEntity schema, string fieldName) + { + var args = new Args(model, schema, fieldName); + + return field.Accept(Instance, args); } - public IGraphType? Visit(IArrayField field) + public IGraphType? Visit(IArrayField field, Args args) { - var schemaFieldType = new ListGraphType(new NonNullGraphType(new NestedInputGraphType(model, schema, field, fieldName))); + var schemaFieldType = + new ListGraphType( + new NonNullGraphType( + new NestedInputGraphType(args.Model, args.Schema, field, args.SchemaField))); return schemaFieldType; } - public IGraphType? Visit(IField field) + public IGraphType? Visit(IField field, Args args) { return AllTypes.References; } - public IGraphType? Visit(IField field) + public IGraphType? Visit(IField field, Args args) { return AllTypes.Boolean; } - public IGraphType? Visit(IField field) + public IGraphType? Visit(IField field, Args args) { return AllTypes.Date; } - public IGraphType? Visit(IField field) + public IGraphType? Visit(IField field, Args args) { return GeolocationInputGraphType.Nullable; } - public IGraphType? Visit(IField field) + public IGraphType? Visit(IField field, Args args) { return AllTypes.Json; } - public IGraphType? Visit(IField field) + public IGraphType? Visit(IField field, Args args) { return AllTypes.Float; } - public IGraphType? Visit(IField field) + public IGraphType? Visit(IField field, Args args) { return AllTypes.Json; } - public IGraphType? Visit(IField field) + public IGraphType? Visit(IField field, Args args) { return AllTypes.String; } - public IGraphType? Visit(IField field) + public IGraphType? Visit(IField field, Args args) { return AllTypes.Tags; } - public IGraphType? Visit(IField field) + public IGraphType? Visit(IField field, Args args) { return null; } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Schemas/DomainObject/Guards/FieldPropertiesValidator.cs b/backend/src/Squidex.Domain.Apps.Entities/Schemas/DomainObject/Guards/FieldPropertiesValidator.cs index 6e215d20f..dfe2f51da 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Schemas/DomainObject/Guards/FieldPropertiesValidator.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Schemas/DomainObject/Guards/FieldPropertiesValidator.cs @@ -9,12 +9,13 @@ using System; using System.Collections.Generic; using System.Linq; using Squidex.Domain.Apps.Core.Schemas; +using Squidex.Infrastructure; using Squidex.Infrastructure.Translations; using Squidex.Infrastructure.Validation; namespace Squidex.Domain.Apps.Entities.Schemas.DomainObject.Guards { - public sealed class FieldPropertiesValidator : IFieldPropertiesVisitor> + public sealed class FieldPropertiesValidator : IFieldPropertiesVisitor, None> { private static readonly FieldPropertiesValidator Instance = new FieldPropertiesValidator(); @@ -26,14 +27,14 @@ namespace Squidex.Domain.Apps.Entities.Schemas.DomainObject.Guards { if (properties != null) { - foreach (var error in properties.Accept(Instance)) + foreach (var error in properties.Accept(Instance, None.Value)) { yield return error; } } } - public IEnumerable Visit(ArrayFieldProperties properties) + public IEnumerable Visit(ArrayFieldProperties properties, None args) { if (IsMaxGreaterThanMin(properties.MaxItems, properties.MinItems)) { @@ -43,7 +44,7 @@ namespace Squidex.Domain.Apps.Entities.Schemas.DomainObject.Guards } } - public IEnumerable Visit(AssetsFieldProperties properties) + public IEnumerable Visit(AssetsFieldProperties properties, None args) { if (IsMaxGreaterThanMin(properties.MaxItems, properties.MinItems)) { @@ -81,7 +82,7 @@ namespace Squidex.Domain.Apps.Entities.Schemas.DomainObject.Guards } } - public IEnumerable Visit(BooleanFieldProperties properties) + public IEnumerable Visit(BooleanFieldProperties properties, None args) { if (!properties.Editor.IsEnumValue()) { @@ -90,7 +91,7 @@ namespace Squidex.Domain.Apps.Entities.Schemas.DomainObject.Guards } } - public IEnumerable Visit(DateTimeFieldProperties properties) + public IEnumerable Visit(DateTimeFieldProperties properties, None args) { if (!properties.Editor.IsEnumValue()) { @@ -122,7 +123,7 @@ namespace Squidex.Domain.Apps.Entities.Schemas.DomainObject.Guards } } - public IEnumerable Visit(GeolocationFieldProperties properties) + public IEnumerable Visit(GeolocationFieldProperties properties, None args) { if (!properties.Editor.IsEnumValue()) { @@ -131,12 +132,12 @@ namespace Squidex.Domain.Apps.Entities.Schemas.DomainObject.Guards } } - public IEnumerable Visit(JsonFieldProperties properties) + public IEnumerable Visit(JsonFieldProperties properties, None args) { yield break; } - public IEnumerable Visit(NumberFieldProperties properties) + public IEnumerable Visit(NumberFieldProperties properties, None args) { if (!properties.Editor.IsEnumValue()) { @@ -165,7 +166,7 @@ namespace Squidex.Domain.Apps.Entities.Schemas.DomainObject.Guards } } - public IEnumerable Visit(ReferencesFieldProperties properties) + public IEnumerable Visit(ReferencesFieldProperties properties, None args) { if (!properties.Editor.IsEnumValue()) { @@ -188,7 +189,7 @@ namespace Squidex.Domain.Apps.Entities.Schemas.DomainObject.Guards } } - public IEnumerable Visit(StringFieldProperties properties) + public IEnumerable Visit(StringFieldProperties properties, None args) { if (!properties.Editor.IsEnumValue()) { @@ -243,7 +244,7 @@ namespace Squidex.Domain.Apps.Entities.Schemas.DomainObject.Guards } } - public IEnumerable Visit(TagsFieldProperties properties) + public IEnumerable Visit(TagsFieldProperties properties, None args) { if (!properties.Editor.IsEnumValue()) { @@ -265,7 +266,7 @@ namespace Squidex.Domain.Apps.Entities.Schemas.DomainObject.Guards } } - public IEnumerable Visit(UIFieldProperties properties) + public IEnumerable Visit(UIFieldProperties properties, None args) { if (!properties.Editor.IsEnumValue()) { diff --git a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/Converters/FieldPropertiesDtoFactory.cs b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/Converters/FieldPropertiesDtoFactory.cs index 60cff4b5f..5f6b4108e 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/Converters/FieldPropertiesDtoFactory.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/Converters/FieldPropertiesDtoFactory.cs @@ -7,11 +7,12 @@ using Squidex.Areas.Api.Controllers.Schemas.Models.Fields; using Squidex.Domain.Apps.Core.Schemas; +using Squidex.Infrastructure; using Squidex.Infrastructure.Reflection; namespace Squidex.Areas.Api.Controllers.Schemas.Models.Converters { - public class FieldPropertiesDtoFactory : IFieldPropertiesVisitor + internal sealed class FieldPropertiesDtoFactory : IFieldPropertiesVisitor { private static readonly FieldPropertiesDtoFactory Instance = new FieldPropertiesDtoFactory(); @@ -21,60 +22,60 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models.Converters public static FieldPropertiesDto Create(FieldProperties properties) { - return properties.Accept(Instance); + return properties.Accept(Instance, None.Value); } - public FieldPropertiesDto Visit(ArrayFieldProperties properties) + public FieldPropertiesDto Visit(ArrayFieldProperties properties, None args) { return SimpleMapper.Map(properties, new ArrayFieldPropertiesDto()); } - public FieldPropertiesDto Visit(AssetsFieldProperties properties) + public FieldPropertiesDto Visit(AssetsFieldProperties properties, None args) { return SimpleMapper.Map(properties, new AssetsFieldPropertiesDto()); } - public FieldPropertiesDto Visit(BooleanFieldProperties properties) + public FieldPropertiesDto Visit(BooleanFieldProperties properties, None args) { return SimpleMapper.Map(properties, new BooleanFieldPropertiesDto()); } - public FieldPropertiesDto Visit(DateTimeFieldProperties properties) + public FieldPropertiesDto Visit(DateTimeFieldProperties properties, None args) { return SimpleMapper.Map(properties, new DateTimeFieldPropertiesDto()); } - public FieldPropertiesDto Visit(GeolocationFieldProperties properties) + public FieldPropertiesDto Visit(GeolocationFieldProperties properties, None args) { return SimpleMapper.Map(properties, new GeolocationFieldPropertiesDto()); } - public FieldPropertiesDto Visit(JsonFieldProperties properties) + public FieldPropertiesDto Visit(JsonFieldProperties properties, None args) { return SimpleMapper.Map(properties, new JsonFieldPropertiesDto()); } - public FieldPropertiesDto Visit(NumberFieldProperties properties) + public FieldPropertiesDto Visit(NumberFieldProperties properties, None args) { return SimpleMapper.Map(properties, new NumberFieldPropertiesDto()); } - public FieldPropertiesDto Visit(ReferencesFieldProperties properties) + public FieldPropertiesDto Visit(ReferencesFieldProperties properties, None args) { return SimpleMapper.Map(properties, new ReferencesFieldPropertiesDto()); } - public FieldPropertiesDto Visit(StringFieldProperties properties) + public FieldPropertiesDto Visit(StringFieldProperties properties, None args) { return SimpleMapper.Map(properties, new StringFieldPropertiesDto()); } - public FieldPropertiesDto Visit(TagsFieldProperties properties) + public FieldPropertiesDto Visit(TagsFieldProperties properties, None args) { return SimpleMapper.Map(properties, new TagsFieldPropertiesDto()); } - public FieldPropertiesDto Visit(UIFieldProperties properties) + public FieldPropertiesDto Visit(UIFieldProperties properties, None args) { return SimpleMapper.Map(properties, new UIFieldPropertiesDto()); } diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Apps/AppClientsTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Apps/AppClientsTests.cs index 318548338..56a3a4986 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Apps/AppClientsTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Apps/AppClientsTests.cs @@ -5,7 +5,6 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== -using System; using FluentAssertions; using Squidex.Domain.Apps.Core.Apps; using Xunit; diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/StringFormatterTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/StringFormatterTests.cs index bf7b99b38..d8240644a 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/StringFormatterTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/StringFormatterTests.cs @@ -19,7 +19,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent { var field = Fields.Array(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(null, field); + var formatted = StringFormatter.Format(field, null); Assert.Empty(formatted); } @@ -29,7 +29,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent { var field = Fields.Array(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(JsonValue.Null, field); + var formatted = StringFormatter.Format(field, JsonValue.Null); Assert.Empty(formatted); } @@ -41,7 +41,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.Array(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Equal("0 Items", formatted); } @@ -53,7 +53,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.Array(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Equal("1 Item", formatted); } @@ -65,7 +65,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.Array(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Equal("2 Items", formatted); } @@ -77,7 +77,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.Array(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Equal("0 Items", formatted); } @@ -89,7 +89,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.Assets(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Equal("0 Assets", formatted); } @@ -101,7 +101,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.Assets(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Equal("1 Asset", formatted); } @@ -113,7 +113,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.Assets(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Equal("2 Assets", formatted); } @@ -125,7 +125,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.Assets(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Equal("0 Assets", formatted); } @@ -137,7 +137,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.Boolean(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Equal("Yes", formatted); } @@ -149,7 +149,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.Boolean(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Equal("No", formatted); } @@ -161,7 +161,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.Boolean(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Equal("No", formatted); } @@ -173,7 +173,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.DateTime(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Equal("2019-01-19T12:00:00Z", formatted); } @@ -185,7 +185,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.Geolocation(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Equal("18.9, 10.9", formatted); } @@ -197,7 +197,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.Geolocation(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Empty(formatted); } @@ -209,7 +209,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.Geolocation(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Empty(formatted); } @@ -221,7 +221,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.Json(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Equal("", formatted); } @@ -233,7 +233,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.Number(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Equal("123", formatted); } @@ -245,7 +245,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.References(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Equal("0 References", formatted); } @@ -257,7 +257,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.References(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Equal("1 Reference", formatted); } @@ -269,7 +269,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.References(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Equal("2 References", formatted); } @@ -281,7 +281,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.References(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Equal("0 References", formatted); } @@ -293,7 +293,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.String(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Equal("hello", formatted); } @@ -305,7 +305,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.String(1, "field", Partitioning.Invariant, new StringFieldProperties { Editor = StringFieldEditor.StockPhoto }); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Equal("[Photo]", formatted); } @@ -317,7 +317,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.Tags(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Equal("hello, squidex, and, team", formatted); } @@ -329,7 +329,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent var field = Fields.Tags(1, "field", Partitioning.Invariant); - var formatted = StringFormatter.Format(value, field); + var formatted = StringFormatter.Format(field, value); Assert.Empty(formatted); } diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemasIndexIntegrationTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemasIndexIntegrationTests.cs index 57c03e653..d442b2e9c 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemasIndexIntegrationTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemasIndexIntegrationTests.cs @@ -6,10 +6,7 @@ // ========================================================================== using System; -using System.Collections.Concurrent; -using System.Collections.Generic; using System.Linq; -using System.Threading; using System.Threading.Tasks; using FakeItEasy; using Microsoft.Extensions.Caching.Memory; @@ -17,7 +14,6 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Orleans; using Orleans.Hosting; -using Orleans.Runtime; using Orleans.TestingHost; using Squidex.Caching; using Squidex.Domain.Apps.Core;