From b0040382f139480d5af55b0cfa178a389edf09ed Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Mon, 25 Jan 2021 11:45:34 +0100 Subject: [PATCH] Data simplified (#624) * Simplified data usage. * Code simplified. * Fixed tests. * Migration fixed. --- .../CreateContentActionHandler.cs | 2 +- .../Validation/CompositeUniqueValidator.cs | 4 +- backend/src/Migrations/MigrationPath.cs | 27 +--- .../Migrations/OldEvents/ContentCreated.cs | 2 +- .../OldEvents/ContentUpdateProposed.cs | 2 +- .../Contents/ContentData.cs | 64 ++++++-- .../Contents/GeoJsonParseResult.cs | 17 ++ .../Contents/GeoJsonValue.cs | 75 +++++++++ .../Contents/IdContentData.cs | 57 ------- .../Contents/NamedContentData.cs | 79 ---------- .../EnrichedEvents/EnrichedContentEvent.cs | 4 +- .../ConvertContent/ContentConverter.cs | 109 +------------ .../ConvertContent/ContentConverterFlat.cs | 4 +- .../ConvertContent/FieldConverters.cs | 4 +- .../ConvertContent/FieldIdentifier.cs | 53 ------- .../ConvertContent/ValueConverters.cs | 35 +---- .../DefaultValues/DefaultValueExtensions.cs | 2 +- .../DefaultValues/DefaultValueGenerator.cs | 2 +- .../ContentReferencesExtensions.cs | 14 +- .../HandleRules/RuleVariable.cs | 2 +- .../ContentWrapper/ContentDataObject.cs | 6 +- .../Scripting/DefaultConverter.cs | 2 +- .../Scripting/IScriptEngine.cs | 2 +- .../Scripting/JintScriptEngine.cs | 4 +- .../Scripting/ScriptVars.cs | 8 +- .../Tags/TagNormalizer.cs | 6 +- .../Extensions/ContentFluidExtension.cs | 2 +- .../ValidateContent/ContentValidator.cs | 6 +- .../ValidateContent/JsonValueConverter.cs | 68 ++------ .../ValidateContent/JsonValueValidator.cs | 148 ++++++++++++++++++ .../Assets/Fields.cs | 32 ---- .../Assets/Visitors/FindExtensions.cs | 10 +- .../Contents/MongoContentCollection.cs | 16 +- .../Contents/MongoContentEntity.cs | 26 +-- .../Contents/MongoContentRepository.cs | 15 +- .../MongoContentRepository_SnapshotStore.cs | 43 +---- .../Contents/Operations/Adapt.cs | 105 ++++++------- .../Contents/Operations/AdaptionVisitor.cs | 12 +- .../Contents/Operations/DataConverter.cs | 47 ------ .../Contents/Operations/OperationBase.cs | 7 - .../Contents/Operations/QueryAsStream.cs | 17 +- .../Contents/Operations/QueryById.cs | 7 - .../Contents/Operations/QueryByIds.cs | 14 -- .../Contents/Operations/QueryByQuery.cs | 21 +-- .../Contents/Operations/QueryReferences.cs | 3 +- .../Contents/Operations/QueryReferrers.cs | 5 - .../Contents/Operations/QueryScheduled.cs | 8 +- .../Templates/CreateBlogCommandMiddleware.cs | 4 +- .../CreateProfileCommandMiddleware.cs | 2 +- .../Contents/BackupContents.cs | 2 +- .../Contents/Commands/BulkUpdateJob.cs | 2 +- .../Contents/Commands/ContentDataCommand.cs | 2 +- .../Contents/ContentEntity.cs | 4 +- .../Contents/ContentsSearchSource.cs | 2 +- .../Contents/DefaultContentWorkflow.cs | 2 +- .../DomainObject/ContentDomainObject.State.cs | 2 +- .../DomainObject/ContentDomainObject.cs | 4 +- .../DomainObject/ContentOperationContext.cs | 14 +- .../Contents/DomainObject/ContentVersion.cs | 6 +- .../Contents/DynamicContentWorkflow.cs | 4 +- .../Contents/GraphQL/Types/ContentActions.cs | 4 +- .../GraphQL/Types/ContentDataGraphType.cs | 2 +- .../GraphQL/Types/ContentResolvers.cs | 2 +- .../GraphQL/Types/Utils/Converters.cs | 4 +- .../Contents/IContentEntity.cs | 2 +- .../Contents/IContentWorkflow.cs | 2 +- .../Contents/IEnrichedContentEntity.cs | 2 +- .../Contents/Queries/Steps/ConvertData.cs | 2 +- .../Contents/Queries/Steps/ResolveAssets.cs | 2 +- .../Queries/Steps/ResolveReferences.cs | 2 +- .../Contents/SingletonCommandMiddleware.cs | 2 +- .../Contents/Text/Extensions.cs | 55 +------ .../Contents/Text/TextIndexingProcess.cs | 4 +- .../Contents/ContentCreated.cs | 2 +- .../Contents/ContentDraftCreated.cs | 2 +- .../Contents/ContentUpdated.cs | 2 +- .../EventSourcing/StreamPosition.cs | 10 +- .../EventSourcing/StreamPosition.cs | 10 +- .../MongoDb/BsonHelper.cs | 5 +- .../DefaultEventDataFormatter.cs | 10 +- .../ObjectPool/DefaultPools.cs | 22 +++ .../MemoryStreamPooledObjectPolicy.cs | 36 +++++ .../Squidex.Infrastructure.csproj | 8 +- .../States/ISnapshotStore.cs | 1 + .../Contents/ContentsController.cs | 8 +- .../Contents/Models/BulkUpdateJobDto.cs | 2 +- .../Controllers/Contents/Models/ContentDto.cs | 2 +- .../Contents/Models/ImportContentsDto.cs | 2 +- .../Controllers/Schemas/Models/FieldDto.cs | 1 - .../Model/Contents/ContentDataTests.cs | 88 ++--------- .../ContentConversionFlatTests.cs | 4 +- .../ConvertContent/ContentConversionTests.cs | 93 +---------- .../ConvertContent/FieldConvertersTests.cs | 18 --- .../ConvertContent/ValueConvertersTests.cs | 69 +------- .../DefaultValues/DefaultValuesTests.cs | 4 +- .../ReferenceExtractionTests.cs | 10 +- .../ReferenceFormattingTests.cs | 6 +- .../RuleEventFormatterCompareTests.cs | 24 +-- .../HandleRules/RuleEventFormatterTests.cs | 4 +- .../Scripting/ContentDataObjectTests.cs | 56 +++---- .../Scripting/JintScriptEngineTests.cs | 34 ++-- .../Operations/Tags/TagNormalizerTests.cs | 6 +- .../Templates/FluidTemplateEngineTests.cs | 2 +- .../ValidateContent/ContentValidationTests.cs | 42 ++--- .../ValidateContent/TagsFieldTests.cs | 4 +- .../ValidateContent/UIFieldTests.cs | 4 +- .../ValidationTestExtensions.cs | 4 +- .../Assets/MongoDb/MongoDbQueryTests.cs | 77 ++++----- .../Contents/BackupContentsTests.cs | 4 +- .../BulkUpdateCommandMiddlewareTests.cs | 6 +- .../ContentChangedTriggerHandlerTests.cs | 4 +- .../Contents/ContentsSearchSourceTests.cs | 10 +- .../DomainObject/ContentDomainObjectTests.cs | 24 +-- .../DomainObject/Guards/GuardContentTests.cs | 20 +-- .../Contents/DynamicContentWorkflowTests.cs | 2 +- .../Contents/GraphQL/GraphQLQueriesTests.cs | 2 +- .../Contents/GraphQL/TestContent.cs | 6 +- .../Contents/MongoDb/ContentsQueryFixture.cs | 11 +- .../Contents/MongoDb/MongoDbQueryTests.cs | 24 +-- .../Contents/Queries/ContentEnricherTests.cs | 6 +- .../Queries/ContentQueryServiceTests.cs | 4 +- .../Contents/Queries/ConvertDataTests.cs | 12 +- .../Contents/Queries/ResolveAssetsTests.cs | 6 +- .../Queries/ResolveReferencesTests.cs | 12 +- .../Contents/Queries/ScriptContentTests.cs | 4 +- .../Contents/ReferenceFluidExtensionTests.cs | 4 +- .../Contents/Text/TextIndexerTestsBase.cs | 8 +- 127 files changed, 815 insertions(+), 1359 deletions(-) create mode 100644 backend/src/Squidex.Domain.Apps.Core.Model/Contents/GeoJsonParseResult.cs create mode 100644 backend/src/Squidex.Domain.Apps.Core.Model/Contents/GeoJsonValue.cs delete mode 100644 backend/src/Squidex.Domain.Apps.Core.Model/Contents/IdContentData.cs delete mode 100644 backend/src/Squidex.Domain.Apps.Core.Model/Contents/NamedContentData.cs delete mode 100644 backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/FieldIdentifier.cs create mode 100644 backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/JsonValueValidator.cs delete mode 100644 backend/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/Fields.cs delete mode 100644 backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/DataConverter.cs create mode 100644 backend/src/Squidex.Infrastructure/ObjectPool/DefaultPools.cs create mode 100644 backend/src/Squidex.Infrastructure/ObjectPool/MemoryStreamPooledObjectPolicy.cs diff --git a/backend/extensions/Squidex.Extensions/Actions/CreateContent/CreateContentActionHandler.cs b/backend/extensions/Squidex.Extensions/Actions/CreateContent/CreateContentActionHandler.cs index b7108e782..26a2a0673 100644 --- a/backend/extensions/Squidex.Extensions/Actions/CreateContent/CreateContentActionHandler.cs +++ b/backend/extensions/Squidex.Extensions/Actions/CreateContent/CreateContentActionHandler.cs @@ -57,7 +57,7 @@ namespace Squidex.Extensions.Actions.CreateContent var json = await FormatAsync(action.Data, @event); - ruleJob.Data = jsonSerializer.Deserialize(json); + ruleJob.Data = jsonSerializer.Deserialize(json); if (!string.IsNullOrEmpty(action.Client)) { diff --git a/backend/extensions/Squidex.Extensions/Validation/CompositeUniqueValidator.cs b/backend/extensions/Squidex.Extensions/Validation/CompositeUniqueValidator.cs index b1eb3c71a..c274d0191 100644 --- a/backend/extensions/Squidex.Extensions/Validation/CompositeUniqueValidator.cs +++ b/backend/extensions/Squidex.Extensions/Validation/CompositeUniqueValidator.cs @@ -32,7 +32,7 @@ namespace Squidex.Extensions.Validation public async Task ValidateAsync(object value, ValidationContext context, AddError addError) { - if (value is NamedContentData data) + if (value is ContentData data) { var validateableFields = context.Schema.Fields.Where(IsValidateableField); @@ -62,7 +62,7 @@ namespace Squidex.Extensions.Validation } } - private static ClrValue TryGetValue(IRootField field, NamedContentData data) + private static ClrValue TryGetValue(IRootField field, ContentData data) { var value = JsonValue.Null; diff --git a/backend/src/Migrations/MigrationPath.cs b/backend/src/Migrations/MigrationPath.cs index 4711f8e1d..24a8eb610 100644 --- a/backend/src/Migrations/MigrationPath.cs +++ b/backend/src/Migrations/MigrationPath.cs @@ -18,7 +18,7 @@ namespace Migrations { public sealed class MigrationPath : IMigrationPath { - private const int CurrentVersion = 24; + private const int CurrentVersion = 25; private readonly IServiceProvider serviceProvider; public MigrationPath(IServiceProvider serviceProvider) @@ -96,12 +96,6 @@ namespace Migrations } else { - // Version 17: Rename slug field. - if (version < 17) - { - yield return serviceProvider.GetService(); - } - // Version 20: Rename slug field. if (version < 20) { @@ -117,17 +111,16 @@ namespace Migrations } // Version 21: Introduce content drafts V2. - if (version < 21) + // Version 25: Convert content ids to names. + if (version < 25) { yield return serviceProvider.GetRequiredService(); } - else + + // Version 16: Introduce file name slugs for assets. + if (version < 16) { - // Version 22: Introduce domain id. - if (version < 22) - { - yield return serviceProvider.GetRequiredService().ForContents(); - } + yield return serviceProvider.GetRequiredService(); } } @@ -137,12 +130,6 @@ namespace Migrations yield return serviceProvider.GetRequiredService(); } - // Version 16: Introduce file name slugs for assets. - if (version < 16) - { - yield return serviceProvider.GetRequiredService(); - } - // Version 19: Unify indexes. if (version < 19) { diff --git a/backend/src/Migrations/OldEvents/ContentCreated.cs b/backend/src/Migrations/OldEvents/ContentCreated.cs index 280349dde..e66497e88 100644 --- a/backend/src/Migrations/OldEvents/ContentCreated.cs +++ b/backend/src/Migrations/OldEvents/ContentCreated.cs @@ -21,7 +21,7 @@ namespace Migrations.OldEvents { public Status Status { get; set; } - public NamedContentData Data { get; set; } + public ContentData Data { get; set; } public IEvent Migrate() { diff --git a/backend/src/Migrations/OldEvents/ContentUpdateProposed.cs b/backend/src/Migrations/OldEvents/ContentUpdateProposed.cs index 5a0cbb3f9..c6a11e5df 100644 --- a/backend/src/Migrations/OldEvents/ContentUpdateProposed.cs +++ b/backend/src/Migrations/OldEvents/ContentUpdateProposed.cs @@ -18,7 +18,7 @@ namespace Migrations.OldEvents [Obsolete("New Event introduced")] public sealed class ContentUpdateProposed : ContentEvent, IMigrated { - public NamedContentData Data { get; set; } + public ContentData Data { get; set; } public IEvent Migrate() { diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Contents/ContentData.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/ContentData.cs index 9e2c924a3..a415085cd 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Contents/ContentData.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/ContentData.cs @@ -13,29 +13,38 @@ using Squidex.Infrastructure.Json.Objects; namespace Squidex.Domain.Apps.Core.Contents { - public abstract class ContentData : Dictionary, IEquatable> where T : notnull + public sealed class ContentData : Dictionary, IEquatable { - public IEnumerable> ValidValues + public IEnumerable> ValidValues { get { return this.Where(x => x.Value != null); } } - protected ContentData(IEqualityComparer comparer) - : base(comparer) + public ContentData() + : base(StringComparer.Ordinal) { } - protected ContentData(ContentData source, IEqualityComparer comparer) - : base(source, comparer) + public ContentData(ContentData source) + : base(source, StringComparer.Ordinal) { } - protected ContentData(int capacity, IEqualityComparer comparer) - : base(capacity, comparer) + public ContentData(int capacity) + : base(capacity, StringComparer.Ordinal) { } - protected static TResult MergeTo(TResult target, params TResult[] sources) where TResult : ContentData + public ContentData AddField(string name, ContentFieldData? data) + { + Guard.NotNullOrEmpty(name, nameof(name)); + + this[name] = data; + + return this; + } + + private static ContentData MergeTo(ContentData target, params ContentData[] sources) { Guard.NotEmpty(sources, nameof(sources)); @@ -66,9 +75,21 @@ namespace Squidex.Domain.Apps.Core.Contents return target; } - protected static TResult Clean(TResult source, TResult target) where TResult : ContentData + public static ContentData Merge(params ContentData[] contents) + { + return MergeTo(new ContentData(), contents); + } + + public ContentData MergeInto(ContentData target) + { + return Merge(target, this); + } + + public ContentData ToCleaned() { - foreach (var fieldValue in source.ValidValues) + var target = new ContentData(); + + foreach (var fieldValue in ValidValues) { if (fieldValue.Value != null) { @@ -91,10 +112,10 @@ namespace Squidex.Domain.Apps.Core.Contents public override bool Equals(object? obj) { - return Equals(obj as ContentData); + return Equals(obj as ContentData); } - public bool Equals(ContentData? other) + public bool Equals(ContentData? other) { return other != null && (ReferenceEquals(this, other) || this.EqualsDictionary(other)); } @@ -103,5 +124,22 @@ namespace Squidex.Domain.Apps.Core.Contents { return this.DictionaryHashCode(); } + + public override string ToString() + { + return $"{{{string.Join(", ", this.Select(x => $"\"{x.Key}\":{x.Value}"))}}}"; + } + + public ContentData Clone() + { + var clone = new ContentData(Count); + + foreach (var (key, value) in this) + { + clone[key] = value?.Clone()!; + } + + return clone; + } } } diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Contents/GeoJsonParseResult.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/GeoJsonParseResult.cs new file mode 100644 index 000000000..bd3191887 --- /dev/null +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/GeoJsonParseResult.cs @@ -0,0 +1,17 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +namespace Squidex.Domain.Apps.Core.Contents +{ + public enum GeoJsonParseResult + { + Success, + InvalidLatitude, + InvalidLongitude, + InvalidValue + } +} diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Contents/GeoJsonValue.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/GeoJsonValue.cs new file mode 100644 index 000000000..80f763cb4 --- /dev/null +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/GeoJsonValue.cs @@ -0,0 +1,75 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using GeoJSON.Net; +using GeoJSON.Net.Geometry; +using Squidex.Infrastructure; +using Squidex.Infrastructure.Json; +using Squidex.Infrastructure.Json.Objects; +using Squidex.Infrastructure.ObjectPool; +using Squidex.Infrastructure.Validation; + +namespace Squidex.Domain.Apps.Core.Contents +{ + public static class GeoJsonValue + { + public static GeoJsonParseResult TryParse(IJsonValue value, IJsonSerializer serializer, out GeoJSONObject geoJSON) + { + Guard.NotNull(serializer, nameof(serializer)); + Guard.NotNull(value, nameof(value)); + + geoJSON = null!; + + if (value is JsonObject geoObject) + { + try + { + var stream = DefaultPools.MemoryStream.Get(); + + try + { + serializer.Serialize(value, stream, true); + + stream.Position = 0; + + geoJSON = serializer.Deserialize(stream, null, leaveOpen: true); + + return GeoJsonParseResult.Success; + } + finally + { + DefaultPools.MemoryStream.Return(stream); + } + } + catch + { + if (geoObject.TryGetValue("latitude", out var lat)) + { + if (!lat.Value.IsBetween(-90, 90)) + { + return GeoJsonParseResult.InvalidLatitude; + } + } + + if (geoObject.TryGetValue("longitude", out var lon)) + { + if (!lon.Value.IsBetween(-180, 180)) + { + return GeoJsonParseResult.InvalidLongitude; + } + } + + geoJSON = new Point(new Position(lat!.Value, lon!.Value)); + + return GeoJsonParseResult.Success; + } + } + + return GeoJsonParseResult.InvalidValue; + } + } +} diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Contents/IdContentData.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/IdContentData.cs deleted file mode 100644 index 83a6f2f6d..000000000 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Contents/IdContentData.cs +++ /dev/null @@ -1,57 +0,0 @@ -// ========================================================================== -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex UG (haftungsbeschränkt) -// All rights reserved. Licensed under the MIT license. -// ========================================================================== - -using System; -using System.Collections.Generic; -using Squidex.Infrastructure; - -#pragma warning disable CA1067 // Override Object.Equals(object) when implementing IEquatable - -namespace Squidex.Domain.Apps.Core.Contents -{ - public sealed class IdContentData : ContentData, IEquatable - { - public IdContentData() - : base(EqualityComparer.Default) - { - } - - public IdContentData(int capacity) - : base(capacity, EqualityComparer.Default) - { - } - - public static IdContentData Merge(params IdContentData[] contents) - { - return MergeTo(new IdContentData(), contents); - } - - public IdContentData MergeInto(IdContentData target) - { - return Merge(target, this); - } - - public IdContentData ToCleaned() - { - return Clean(this, new IdContentData()); - } - - public IdContentData AddField(long id, ContentFieldData? data) - { - Guard.GreaterThan(id, 0, nameof(id)); - - this[id] = data; - - return this; - } - - public bool Equals(IdContentData? other) - { - return base.Equals(other); - } - } -} diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Contents/NamedContentData.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/NamedContentData.cs deleted file mode 100644 index 8f997da0f..000000000 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Contents/NamedContentData.cs +++ /dev/null @@ -1,79 +0,0 @@ -// ========================================================================== -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex UG (haftungsbeschränkt) -// All rights reserved. Licensed under the MIT license. -// ========================================================================== - -using System; -using System.Linq; -using Squidex.Infrastructure; - -#pragma warning disable CA1067 // Override Object.Equals(object) when implementing IEquatable - -namespace Squidex.Domain.Apps.Core.Contents -{ - public sealed class NamedContentData : ContentData, IEquatable - { - public NamedContentData() - : base(StringComparer.Ordinal) - { - } - - public NamedContentData(NamedContentData source) - : base(source, StringComparer.Ordinal) - { - } - - public NamedContentData(int capacity) - : base(capacity, StringComparer.Ordinal) - { - } - - public static NamedContentData Merge(params NamedContentData[] contents) - { - return MergeTo(new NamedContentData(), contents); - } - - public NamedContentData MergeInto(NamedContentData target) - { - return Merge(target, this); - } - - public NamedContentData ToCleaned() - { - return Clean(this, new NamedContentData()); - } - - public NamedContentData AddField(string name, ContentFieldData? data) - { - Guard.NotNullOrEmpty(name, nameof(name)); - - this[name] = data; - - return this; - } - - public NamedContentData Clone() - { - var clone = new NamedContentData(Count); - - foreach (var (key, value) in this) - { - clone[key] = value?.Clone()!; - } - - return clone; - } - - public bool Equals(NamedContentData? other) - { - return base.Equals(other); - } - - public override string ToString() - { - return $"{{{string.Join(", ", this.Select(x => $"\"{x.Key}\":{x.Value}"))}}}"; - } - } -} diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Rules/EnrichedEvents/EnrichedContentEvent.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Rules/EnrichedEvents/EnrichedContentEvent.cs index 3a8cb228a..f7f26017e 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Rules/EnrichedEvents/EnrichedContentEvent.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Rules/EnrichedEvents/EnrichedContentEvent.cs @@ -25,9 +25,9 @@ namespace Squidex.Domain.Apps.Core.Rules.EnrichedEvents public RefToken LastModifiedBy { get; set; } - public NamedContentData Data { get; set; } + public ContentData Data { get; set; } - public NamedContentData? DataOld { get; set; } + public ContentData? DataOld { get; set; } public Status Status { get; set; } diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ContentConverter.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ContentConverter.cs index d8b6ce562..8658b9864 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ContentConverter.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ContentConverter.cs @@ -5,52 +5,19 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== -using System.Linq; using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.Schemas; using Squidex.Infrastructure; -using Squidex.Infrastructure.Json.Objects; namespace Squidex.Domain.Apps.Core.ConvertContent { public static class ContentConverter { - public static NamedContentData ConvertId2Name(this IdContentData content, Schema schema, params FieldConverter[] converters) + public static ContentData Convert(this ContentData content, Schema schema, params FieldConverter[] converters) { Guard.NotNull(schema, nameof(schema)); - var result = new NamedContentData(content.Count); - - foreach (var (fieldId, data) in content) - { - if (data == null || !schema.FieldsById.TryGetValue(fieldId, out var field)) - { - continue; - } - - ContentFieldData? newData = data; - - ConvertArray(newData, field, FieldIdentifier.ById, FieldIdentifier.ByName); - - if (newData != null) - { - newData = ConvertData(converters, field, newData); - } - - if (newData != null) - { - result.Add(field.Name, newData); - } - } - - return result; - } - - public static NamedContentData ConvertName2Name(this NamedContentData content, Schema schema, params FieldConverter[] converters) - { - Guard.NotNull(schema, nameof(schema)); - - var result = new NamedContentData(content.Count); + var result = new ContentData(content.Count); foreach (var (fieldName, data) in content) { @@ -75,40 +42,6 @@ namespace Squidex.Domain.Apps.Core.ConvertContent return result; } - public static IdContentData ConvertName2IdCloned(this NamedContentData content, Schema schema, params FieldConverter[] converters) - { - Guard.NotNull(schema, nameof(schema)); - - var result = new IdContentData(content.Count); - - foreach (var (fieldName, data) in content) - { - if (data == null || !schema.FieldsByName.TryGetValue(fieldName, out var field)) - { - continue; - } - - ContentFieldData? newData = data.Clone(); - - if (newData != null) - { - newData = ConvertData(converters, field, newData); - } - - if (newData != null) - { - ConvertArray(newData, field, FieldIdentifier.ByName, FieldIdentifier.ById); - } - - if (newData != null) - { - result.Add(field.Id, newData); - } - } - - return result; - } - private static ContentFieldData? ConvertData(FieldConverter[] converters, IRootField field, ContentFieldData data) { if (converters != null) @@ -126,43 +59,5 @@ namespace Squidex.Domain.Apps.Core.ConvertContent return data; } - - private static void ConvertArray(ContentFieldData data, IRootField? field, FieldIdentifier sourceIdentifier, FieldIdentifier targetIdentifier) - { - if (field is IArrayField arrayField) - { - foreach (var (_, value) in data) - { - if (value is JsonArray array) - { - foreach (var nested in array.OfType()) - { - var properties = nested.ToList(); - - nested.Clear(); - - foreach (var (nestedKey, nestedValue) in properties) - { - if (nestedValue == null) - { - continue; - } - - var nestedField = sourceIdentifier.GetField(arrayField, nestedKey); - - if (nestedField == null) - { - continue; - } - - var targetKey = targetIdentifier.GetStringKey(nestedField); - - nested[targetKey] = nestedValue; - } - } - } - } - } - } } } \ No newline at end of file diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ContentConverterFlat.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ContentConverterFlat.cs index 3d10a06a3..3bf44df0e 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ContentConverterFlat.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ContentConverterFlat.cs @@ -14,7 +14,7 @@ namespace Squidex.Domain.Apps.Core.ConvertContent { public static class ContentConverterFlat { - public static Dictionary ToFlatten(this NamedContentData content) + public static Dictionary ToFlatten(this ContentData content) { var result = new Dictionary(); @@ -31,7 +31,7 @@ namespace Squidex.Domain.Apps.Core.ConvertContent return result; } - public static FlatContentData ToFlatten(this NamedContentData content, string fallback) + public static FlatContentData ToFlatten(this ContentData content, string fallback) { var result = new FlatContentData(); diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/FieldConverters.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/FieldConverters.cs index ada1f5adf..fa581db56 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/FieldConverters.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/FieldConverters.cs @@ -42,9 +42,7 @@ namespace Squidex.Domain.Apps.Core.ConvertContent try { - var (_, error) = JsonValueConverter.ConvertValue(field, value, jsonSerializer); - - if (error != null) + if (!JsonValueValidator.IsValid(field, value, jsonSerializer)) { return null; } diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/FieldIdentifier.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/FieldIdentifier.cs deleted file mode 100644 index b94619db9..000000000 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/FieldIdentifier.cs +++ /dev/null @@ -1,53 +0,0 @@ -// ========================================================================== -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex UG (haftungsbeschraenkt) -// All rights reserved. Licensed under the MIT license. -// ========================================================================== - -using System.Collections.Generic; -using Squidex.Domain.Apps.Core.Schemas; - -namespace Squidex.Domain.Apps.Core.ConvertContent -{ - public abstract class FieldIdentifier - { - public static readonly FieldIdentifier ByName = new FieldByName(); - public static readonly FieldIdentifier ById = new FieldById(); - - public abstract IField? GetField(IArrayField arrayField, string key); - - public abstract string GetStringKey(IField field); - - private sealed class FieldByName : FieldIdentifier - { - public override IField? GetField(IArrayField arrayField, string key) - { - return arrayField.FieldsByName.GetValueOrDefault(key); - } - - public override string GetStringKey(IField field) - { - return field.Name; - } - } - - private sealed class FieldById : FieldIdentifier - { - public override IField? GetField(IArrayField arrayField, string key) - { - if (long.TryParse(key, out var id)) - { - return arrayField.FieldsById.GetValueOrDefault(id); - } - - return null; - } - - public override string GetStringKey(IField field) - { - return field.Id.ToString(); - } - } - } -} diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ValueConverters.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ValueConverters.cs index c68bf429e..9ad674552 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ValueConverters.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ValueConverters.cs @@ -8,7 +8,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Core.ValidateContent; using Squidex.Infrastructure; @@ -39,9 +38,7 @@ namespace Squidex.Domain.Apps.Core.ConvertContent try { - var (_, error) = JsonValueConverter.ConvertValue(field, value, jsonSerializer); - - if (error != null) + if (!JsonValueValidator.IsValid(field, value, jsonSerializer)) { return null; } @@ -55,36 +52,6 @@ namespace Squidex.Domain.Apps.Core.ConvertContent }; } - public static ValueConverter DecodeJson(IJsonSerializer jsonSerializer) - { - return (value, field, parent) => - { - if (field is IField && value is JsonString s) - { - var decoded = Encoding.UTF8.GetString(Convert.FromBase64String(s.Value)); - - return jsonSerializer.Deserialize(decoded); - } - - return value; - }; - } - - public static ValueConverter EncodeJson(IJsonSerializer jsonSerializer) - { - return (value, field, parent) => - { - if (value.Type != JsonValueType.Null && field is IField) - { - var encoded = Convert.ToBase64String(Encoding.UTF8.GetBytes(jsonSerializer.Serialize(value))); - - return JsonValue.Create(encoded); - } - - return value; - }; - } - public static ValueConverter ResolveAssetUrls(NamedId appId, IReadOnlyCollection? fields, IUrlGenerator urlGenerator) { if (fields?.Any() != true) diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/DefaultValues/DefaultValueExtensions.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/DefaultValues/DefaultValueExtensions.cs index b8006651f..dcf4a5c5f 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/DefaultValues/DefaultValueExtensions.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/DefaultValues/DefaultValueExtensions.cs @@ -12,7 +12,7 @@ namespace Squidex.Domain.Apps.Core.DefaultValues { public static class DefaultValueExtensions { - public static void GenerateDefaultValues(this NamedContentData data, Schema schema, PartitionResolver partitionResolver) + public static void GenerateDefaultValues(this ContentData data, Schema schema, PartitionResolver partitionResolver) { var enricher = new DefaultValueGenerator(schema, partitionResolver); diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/DefaultValues/DefaultValueGenerator.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/DefaultValues/DefaultValueGenerator.cs index da162f013..faf826823 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/DefaultValues/DefaultValueGenerator.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/DefaultValues/DefaultValueGenerator.cs @@ -28,7 +28,7 @@ namespace Squidex.Domain.Apps.Core.DefaultValues this.partitionResolver = partitionResolver; } - public void Enrich(NamedContentData data) + public void Enrich(ContentData data) { Guard.NotNull(data, nameof(data)); 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 75808fe0b..74cf2c2d2 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ContentReferencesExtensions.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ContentReferencesExtensions.cs @@ -16,7 +16,7 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds { public static class ContentReferencesExtensions { - public static HashSet GetReferencedIds(this NamedContentData source, Schema schema, int referencesPerField = int.MaxValue) + public static HashSet GetReferencedIds(this ContentData source, Schema schema, int referencesPerField = int.MaxValue) { Guard.NotNull(schema, nameof(schema)); @@ -27,14 +27,14 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds return result; } - public static void AddReferencedIds(this NamedContentData source, Schema schema, HashSet result, int referencesPerField = int.MaxValue) + public static void AddReferencedIds(this ContentData source, Schema schema, HashSet result, int referencesPerField = int.MaxValue) { Guard.NotNull(schema, nameof(schema)); AddReferencedIds(source, schema.Fields, result, referencesPerField); } - public static void AddReferencedIds(this NamedContentData source, IEnumerable fields, HashSet result, int referencesPerField = int.MaxValue) + public static void AddReferencedIds(this ContentData source, IEnumerable fields, HashSet result, int referencesPerField = int.MaxValue) { Guard.NotNull(fields, nameof(fields)); Guard.NotNull(result, nameof(result)); @@ -45,7 +45,7 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds } } - public static void AddReferencedIds(this NamedContentData source, IField field, HashSet result, int referencesPerField = int.MaxValue) + public static void AddReferencedIds(this ContentData source, IField field, HashSet result, int referencesPerField = int.MaxValue) { Guard.NotNull(field, nameof(field)); Guard.NotNull(result, nameof(result)); @@ -59,7 +59,7 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds } } - private static void AddReferencedIds(NamedContentData source, HashSet result, int referencesPerField, IField field) + private static void AddReferencedIds(ContentData source, HashSet result, int referencesPerField, IField field) { if (source.TryGetValue(field.Name, out var fieldData) && fieldData != null) { @@ -82,7 +82,7 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds return result; } - public static JsonObject FormatReferences(this NamedContentData data, Schema schema, IFieldPartitioning partitioning, string separator = ", ") + public static JsonObject FormatReferences(this ContentData data, Schema schema, IFieldPartitioning partitioning, string separator = ", ") { Guard.NotNull(schema, nameof(schema)); Guard.NotNull(partitioning, nameof(partitioning)); @@ -97,7 +97,7 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds return result; } - private static string FormatReferenceFields(this NamedContentData data, Schema schema, string partitionKey, string separator) + private static string FormatReferenceFields(this ContentData data, Schema schema, string partitionKey, string separator) { Guard.NotNull(schema, nameof(schema)); diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleVariable.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleVariable.cs index f4a1f7665..900ea396f 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleVariable.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleVariable.cs @@ -27,7 +27,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules { var segment = path[i]; - if (current is NamedContentData data) + if (current is ContentData data) { if (!data.TryGetValue(segment, out var temp) || temp == null) { diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ContentWrapper/ContentDataObject.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ContentWrapper/ContentDataObject.cs index 6af5181b9..41545d2a2 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ContentWrapper/ContentDataObject.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ContentWrapper/ContentDataObject.cs @@ -20,14 +20,14 @@ namespace Squidex.Domain.Apps.Core.Scripting.ContentWrapper { public sealed class ContentDataObject : ObjectInstance { - private readonly NamedContentData contentData; + private readonly ContentData contentData; private HashSet fieldsToDelete; private Dictionary fieldProperties; private bool isChanged; public override bool Extensible => true; - public ContentDataObject(Engine engine, NamedContentData contentData) + public ContentDataObject(Engine engine, ContentData contentData) : base(engine) { this.contentData = contentData; @@ -38,7 +38,7 @@ namespace Squidex.Domain.Apps.Core.Scripting.ContentWrapper isChanged = true; } - public bool TryUpdate(out NamedContentData result) + public bool TryUpdate(out ContentData result) { result = contentData; diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/DefaultConverter.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/DefaultConverter.cs index 17de5000d..e69393de0 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/DefaultConverter.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/DefaultConverter.cs @@ -53,7 +53,7 @@ namespace Squidex.Domain.Apps.Core.Scripting case Status status: result = status.ToString(); return true; - case NamedContentData content: + case ContentData content: result = new ContentDataObject(engine, content); return true; } diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/IScriptEngine.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/IScriptEngine.cs index 39d0944b2..75a4c4481 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/IScriptEngine.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/IScriptEngine.cs @@ -15,7 +15,7 @@ namespace Squidex.Domain.Apps.Core.Scripting { Task ExecuteAsync(ScriptVars vars, string script, ScriptOptions options = default); - Task TransformAsync(ScriptVars vars, string script, ScriptOptions options = default); + Task TransformAsync(ScriptVars vars, string script, ScriptOptions options = default); IJsonValue Execute(ScriptVars vars, string script, ScriptOptions options = default); diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptEngine.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptEngine.cs index 04d60fe36..cc7e42ed8 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptEngine.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptEngine.cs @@ -71,14 +71,14 @@ namespace Squidex.Domain.Apps.Core.Scripting } } - public async Task TransformAsync(ScriptVars vars, string script, ScriptOptions options = default) + public async Task TransformAsync(ScriptVars vars, string script, ScriptOptions options = default) { Guard.NotNull(vars, nameof(vars)); Guard.NotNullOrEmpty(script, nameof(script)); using (var cts = new CancellationTokenSource(TimeoutExecution)) { - var tcs = new TaskCompletionSource(); + var tcs = new TaskCompletionSource(); using (cts.Token.Register(() => tcs.TrySetCanceled())) { diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptVars.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptVars.cs index 6692ebdc7..ac10430e3 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptVars.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptVars.cs @@ -57,15 +57,15 @@ namespace Squidex.Domain.Apps.Core.Scripting set => SetValue(value); } - public NamedContentData? Data + public ContentData? Data { - get => GetValue(); + get => GetValue(); set => SetValue(value); } - public NamedContentData? DataOld + public ContentData? DataOld { - get => GetValue(); + get => GetValue(); set { SetValue(value, "oldData"); diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Tags/TagNormalizer.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Tags/TagNormalizer.cs index c3cd66078..ae1294bcb 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Tags/TagNormalizer.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Tags/TagNormalizer.cs @@ -16,7 +16,7 @@ namespace Squidex.Domain.Apps.Core.Tags { public static class TagNormalizer { - public static async Task NormalizeAsync(this ITagService tagService, DomainId appId, DomainId schemaId, Schema schema, NamedContentData newData, NamedContentData? oldData) + public static async Task NormalizeAsync(this ITagService tagService, DomainId appId, DomainId schemaId, Schema schema, ContentData newData, ContentData? oldData) { Guard.NotNull(tagService, nameof(tagService)); Guard.NotNull(schema, nameof(schema)); @@ -52,7 +52,7 @@ namespace Squidex.Domain.Apps.Core.Tags } } - public static async Task DenormalizeAsync(this ITagService tagService, DomainId appId, DomainId schemaId, Schema schema, params NamedContentData[] datas) + public static async Task DenormalizeAsync(this ITagService tagService, DomainId appId, DomainId schemaId, Schema schema, params ContentData[] datas) { Guard.NotNull(tagService, nameof(tagService)); Guard.NotNull(schema, nameof(schema)); @@ -79,7 +79,7 @@ namespace Squidex.Domain.Apps.Core.Tags } } - private static void GetValues(Schema schema, HashSet values, List arrays, params NamedContentData[] datas) + private static void GetValues(Schema schema, HashSet values, List arrays, params ContentData[] datas) { foreach (var field in schema.Fields) { diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Templates/Extensions/ContentFluidExtension.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Templates/Extensions/ContentFluidExtension.cs index ca4f8dd4f..067f093e2 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Templates/Extensions/ContentFluidExtension.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Templates/Extensions/ContentFluidExtension.cs @@ -24,7 +24,7 @@ namespace Squidex.Domain.Apps.Core.Templates.Extensions FluidValue.SetTypeMapping(x => FluidValue.Create(x.Value)); FluidValue.SetTypeMapping(x => FluidValue.Create(null)); - memberAccessStrategy.Register( + memberAccessStrategy.Register( (value, name) => value.GetOrDefault(name)); memberAccessStrategy.Register( diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/ContentValidator.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/ContentValidator.cs index 946bfc91e..2b4b5a338 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/ContentValidator.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/ContentValidator.cs @@ -53,7 +53,7 @@ namespace Squidex.Domain.Apps.Core.ValidateContent errors.Add(new ValidationError(message, pathString)); } - public Task ValidateInputPartialAsync(NamedContentData data) + public Task ValidateInputPartialAsync(ContentData data) { Guard.NotNull(data, nameof(data)); @@ -62,7 +62,7 @@ namespace Squidex.Domain.Apps.Core.ValidateContent return validator.ValidateAsync(data, context, AddError); } - public Task ValidateInputAsync(NamedContentData data) + public Task ValidateInputAsync(ContentData data) { Guard.NotNull(data, nameof(data)); @@ -71,7 +71,7 @@ namespace Squidex.Domain.Apps.Core.ValidateContent return validator.ValidateAsync(data, context, AddError); } - public Task ValidateContentAsync(NamedContentData data) + public Task ValidateContentAsync(ContentData data) { Guard.NotNull(data, nameof(data)); 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 4ac7e0ce9..f3bbf6f2b 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/JsonValueConverter.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/JsonValueConverter.cs @@ -6,16 +6,13 @@ // ========================================================================== using System.Collections.Generic; -using System.IO; -using GeoJSON.Net; -using GeoJSON.Net.Geometry; using NodaTime.Text; +using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.Schemas; using Squidex.Infrastructure; using Squidex.Infrastructure.Json; using Squidex.Infrastructure.Json.Objects; using Squidex.Infrastructure.Translations; -using Squidex.Infrastructure.Validation; namespace Squidex.Domain.Apps.Core.ValidateContent { @@ -124,54 +121,19 @@ namespace Squidex.Domain.Apps.Core.ValidateContent public (object? Result, JsonError? Error) Visit(IField field, Args args) { - if (args.Value is JsonObject geoObject) - { - try - { - using (var stream = new MemoryStream()) - { - args.JsonSerializer.Serialize(args.Value, stream, true); - - stream.Position = 0; - - var geoJson = args.JsonSerializer.Deserialize(stream); - - return (geoJson, null); - } - } - catch - { - if (geoObject.TryGetValue("latitude", out var lat)) - { - if (!lat.Value.IsBetween(-90, 90)) - { - return (null, new JsonError(T.Get("contents.invalidGeolocationLatitude"))); - } - } - else - { - return (null, new JsonError(T.Get("contents.invalidGeolocation"))); - } + var result = GeoJsonValue.TryParse(args.Value, args.JsonSerializer, out var value); - if (geoObject.TryGetValue("longitude", out var lon)) - { - if (!lon.Value.IsBetween(-180, 180)) - { - return (null, new JsonError(T.Get("contents.invalidGeolocationLongitude"))); - } - } - else - { - return (null, new JsonError(T.Get("contents.invalidGeolocation"))); - } - - var position = new Point(new Position(lat.Value, lon.Value)); - - return (position, null); - } + switch (result) + { + case GeoJsonParseResult.InvalidLatitude: + return (null, new JsonError(T.Get("contents.invalidGeolocationLatitude"))); + case GeoJsonParseResult.InvalidLongitude: + return (null, new JsonError(T.Get("contents.invalidGeolocationLongitude"))); + case GeoJsonParseResult.InvalidValue: + return (null, new JsonError(T.Get("contents.invalidGeolocation"))); + default: + return (value, null); } - - return (null, new JsonError(T.Get("contents.invalidGeolocation"))); } public (object? Result, JsonError? Error) Visit(IField field, Args args) @@ -211,11 +173,7 @@ namespace Squidex.Domain.Apps.Core.ValidateContent foreach (var item in array) { - if (item is JsonNull) - { - result.Add(null); - } - else if (item is JsonString s) + if (item is JsonString s && !string.IsNullOrWhiteSpace(s.Value)) { result.Add(s.Value); } diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/JsonValueValidator.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/JsonValueValidator.cs new file mode 100644 index 000000000..d1e380816 --- /dev/null +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/JsonValueValidator.cs @@ -0,0 +1,148 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschränkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using NodaTime.Text; +using Squidex.Domain.Apps.Core.Contents; +using Squidex.Domain.Apps.Core.Schemas; +using Squidex.Infrastructure; +using Squidex.Infrastructure.Json; +using Squidex.Infrastructure.Json.Objects; + +namespace Squidex.Domain.Apps.Core.ValidateContent +{ + public sealed class JsonValueValidator : IFieldVisitor + { + private static readonly JsonValueValidator Instance = new JsonValueValidator(); + + public readonly struct Args + { + public readonly IJsonValue Value; + public readonly IJsonSerializer JsonSerializer; + + public Args(IJsonValue value, IJsonSerializer jsonSerializer) + { + Value = value; + + JsonSerializer = jsonSerializer; + } + } + + private JsonValueValidator() + { + } + + public static bool IsValid(IField field, IJsonValue value, IJsonSerializer jsonSerializer) + { + Guard.NotNull(field, nameof(field)); + Guard.NotNull(value, nameof(value)); + + var args = new Args(value, jsonSerializer); + + return field.Accept(Instance, args); + } + + public bool Visit(IArrayField field, Args args) + { + return IsValidObjectList(args.Value); + } + + public bool Visit(IField field, Args args) + { + return IsValidStringList(args.Value); + } + + public bool Visit(IField field, Args args) + { + return IsValidStringList(args.Value); + } + + public bool Visit(IField field, Args args) + { + return IsValidStringList(args.Value); + } + + public bool Visit(IField field, Args args) + { + return args.Value is JsonBoolean; + } + + public bool Visit(IField field, Args args) + { + return args.Value is JsonNumber; + } + + public bool Visit(IField field, Args args) + { + return args.Value is JsonString; + } + + public bool Visit(IField field, Args args) + { + return true; + } + + public bool Visit(IField field, Args args) + { + if (args.Value.Type == JsonValueType.String) + { + var parseResult = InstantPattern.General.Parse(args.Value.ToString()); + + return parseResult.Success; + } + + return false; + } + + public bool Visit(IField field, Args args) + { + var result = GeoJsonValue.TryParse(args.Value, args.JsonSerializer, out _); + + return result == GeoJsonParseResult.Success; + } + + public bool Visit(IField field, Args args) + { + return true; + } + + private static bool IsValidStringList(IJsonValue value) + { + if (value is JsonArray array) + { + foreach (var item in array) + { + if (item is not JsonString) + { + return false; + } + } + + return true; + } + + return false; + } + + private static bool IsValidObjectList(IJsonValue value) + { + if (value is JsonArray array) + { + foreach (var item in array) + { + if (item is not JsonObject) + { + return false; + } + } + + return true; + } + + return false; + } + } +} diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/Fields.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/Fields.cs deleted file mode 100644 index 4e1c0dd2e..000000000 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/Fields.cs +++ /dev/null @@ -1,32 +0,0 @@ -// ========================================================================== -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex UG (haftungsbeschraenkt) -// All rights reserved. Licensed under the MIT license. -// ========================================================================== - -using System; -using MongoDB.Bson.Serialization; - -namespace Squidex.Domain.Apps.Entities.MongoDb.Assets -{ - internal static class Fields - { - private static readonly Lazy AssetIdField = new Lazy(GetAssetIdField); - private static readonly Lazy AssetFolderIdField = new Lazy(GetAssetFolderIdField); - - public static string AssetId => AssetIdField.Value; - - public static string AssetFolderId => AssetFolderIdField.Value; - - private static string GetAssetIdField() - { - return BsonClassMap.LookupClassMap(typeof(MongoAssetEntity)).GetMemberMap(nameof(MongoAssetEntity.Id)).ElementName; - } - - private static string GetAssetFolderIdField() - { - return BsonClassMap.LookupClassMap(typeof(MongoAssetFolderEntity)).GetMemberMap(nameof(MongoAssetFolderEntity.Id)).ElementName; - } - } -} diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/Visitors/FindExtensions.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/Visitors/FindExtensions.cs index e062fce13..aab6da707 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/Visitors/FindExtensions.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/Visitors/FindExtensions.cs @@ -25,12 +25,10 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Assets.Visitors query.Filter = FirstPascalPathConverter.Transform(query.Filter); } - query.Sort = query.Sort - .Select(x => - new SortNode( - x.Path.ToFirstPascalCase(), - x.Order)) - .ToList(); + if (query.Sort != null) + { + query.Sort = query.Sort.Select(x => new SortNode(x.Path.ToFirstPascalCase(), x.Order)).ToList(); + } return query; } diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentCollection.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentCollection.cs index 742ad134e..6943e1f39 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentCollection.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentCollection.cs @@ -34,18 +34,18 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents private readonly QueryScheduled queryScheduled; private readonly string name; - public MongoContentCollection(string name, IMongoDatabase database, IAppProvider appProvider, DataConverter dataConverter) + public MongoContentCollection(string name, IMongoDatabase database, IAppProvider appProvider) : base(database) { this.name = name; - queryAsStream = new QueryAsStream(dataConverter, appProvider); - queryBdId = new QueryById(dataConverter); - queryByIds = new QueryByIds(dataConverter); - queryByQuery = new QueryByQuery(dataConverter, appProvider); - queryReferences = new QueryReferences(dataConverter, queryByIds); - queryReferrers = new QueryReferrers(dataConverter); - queryScheduled = new QueryScheduled(dataConverter); + queryAsStream = new QueryAsStream(); + queryBdId = new QueryById(); + queryByIds = new QueryByIds(); + queryByQuery = new QueryByQuery(appProvider); + queryReferences = new QueryReferences(queryByIds); + queryReferrers = new QueryReferrers(); + queryScheduled = new QueryScheduled(); } public IMongoCollection GetInternalCollection() diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentEntity.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentEntity.cs index 3e3203d67..214c1cddf 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentEntity.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentEntity.cs @@ -6,14 +6,10 @@ // ========================================================================== using System.Collections.Generic; -using System.Linq; using MongoDB.Bson.Serialization.Attributes; using NodaTime; using Squidex.Domain.Apps.Core.Contents; -using Squidex.Domain.Apps.Core.ExtractReferenceIds; -using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Entities.Contents; -using Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations; using Squidex.Infrastructure; using Squidex.Infrastructure.MongoDb; @@ -22,8 +18,6 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents [BsonIgnoreExtraElements] public sealed class MongoContentEntity : IContentEntity, IVersionedEntity { - private NamedContentData data; - [BsonId] [BsonElement("_id")] public DomainId DocumentId { get; set; } @@ -63,7 +57,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents [BsonIgnoreIfNull] [BsonElement("do")] [BsonJson] - public IdContentData DataByIds { get; set; } + public ContentData Data { get; set; } [BsonIgnoreIfNull] [BsonElement("sa")] @@ -97,27 +91,9 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents [BsonElement("mb")] public RefToken LastModifiedBy { get; set; } - [BsonIgnore] - public NamedContentData Data - { - get { return data; } - } - public DomainId UniqueId { get { return DocumentId; } } - - public void LoadData(NamedContentData data, Schema schema, DataConverter converter) - { - ReferencedIds = data.GetReferencedIds(schema).ToHashSet(); - - DataByIds = converter.ToMongoModel(data, schema); - } - - public void ParseData(Schema schema, DataConverter converter) - { - data = converter.FromMongoModel(DataByIds, schema); - } } } diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs index 180d7eb18..764a4c7c9 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs @@ -15,19 +15,15 @@ using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Entities.Apps; using Squidex.Domain.Apps.Entities.Contents; using Squidex.Domain.Apps.Entities.Contents.Repositories; -using Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations; using Squidex.Domain.Apps.Entities.Schemas; using Squidex.Hosting; using Squidex.Infrastructure; -using Squidex.Infrastructure.Json; using Squidex.Infrastructure.Queries; namespace Squidex.Domain.Apps.Entities.MongoDb.Contents { public partial class MongoContentRepository : IContentRepository, IInitializable { - private readonly IAppProvider appProvider; - private readonly DataConverter converter; private readonly MongoContentCollection collectionAll; private readonly MongoContentCollection collectionPublished; @@ -36,22 +32,17 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents StatusSerializer.Register(); } - public MongoContentRepository(IMongoDatabase database, IAppProvider appProvider, IJsonSerializer serializer) + public MongoContentRepository(IMongoDatabase database, IAppProvider appProvider) { Guard.NotNull(appProvider, nameof(appProvider)); - Guard.NotNull(serializer, nameof(serializer)); - - this.appProvider = appProvider; - - converter = new DataConverter(serializer); collectionAll = new MongoContentCollection( - "States_Contents_All2", database, appProvider, converter); + "States_Contents_All3", database, appProvider); collectionPublished = new MongoContentCollection( - "States_Contents_Published2", database, appProvider, converter); + "States_Contents_Published3", database, appProvider); } public async Task InitializeAsync(CancellationToken ct = default) diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository_SnapshotStore.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository_SnapshotStore.cs index f28534fda..ed89ce498 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository_SnapshotStore.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository_SnapshotStore.cs @@ -10,7 +10,6 @@ using System.Threading; using System.Threading.Tasks; using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Entities.Contents.DomainObject; -using Squidex.Domain.Apps.Entities.Schemas; using Squidex.Infrastructure; using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.States; @@ -51,15 +50,6 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents if (contentEntity != null) { - var schema = await GetSchemaAsync(contentEntity.IndexedAppId, contentEntity.IndexedSchemaId); - - if (schema == null) - { - return (null!, EtagVersion.NotFound); - } - - contentEntity.ParseData(schema.SchemaDef, converter); - return (SimpleMapper.Map(contentEntity, new ContentDomainObject.State()), contentEntity.Version); } @@ -76,25 +66,17 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents return; } - var schema = await GetSchemaAsync(value.AppId.Id, value.SchemaId.Id); - - if (schema == null) - { - return; - } - - var saveDraft = UpsertDraftContentAsync(value, oldVersion, newVersion, schema); - var savePublic = UpsertOrDeletePublishedAsync(value, oldVersion, newVersion, schema); - - await Task.WhenAll(saveDraft, savePublic); + await Task.WhenAll( + UpsertDraftContentAsync(value, oldVersion, newVersion), + UpsertOrDeletePublishedAsync(value, oldVersion, newVersion)); } } - private async Task UpsertOrDeletePublishedAsync(ContentDomainObject.State value, long oldVersion, long newVersion, ISchemaEntity schema) + private async Task UpsertOrDeletePublishedAsync(ContentDomainObject.State value, long oldVersion, long newVersion) { if (value.Status == Status.Published && !value.IsDeleted) { - await UpsertPublishedContentAsync(value, oldVersion, newVersion, schema); + await UpsertPublishedContentAsync(value, oldVersion, newVersion); } else { @@ -109,7 +91,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents return collectionPublished.RemoveAsync(documentId); } - private async Task UpsertDraftContentAsync(ContentDomainObject.State value, long oldVersion, long newVersion, ISchemaEntity schema) + private async Task UpsertDraftContentAsync(ContentDomainObject.State value, long oldVersion, long newVersion) { var content = SimpleMapper.Map(value, new MongoContentEntity { @@ -123,12 +105,10 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents content.ScheduleJob = value.ScheduleJob; content.NewStatus = value.NewStatus; - content.LoadData(value.Data, schema.SchemaDef, converter); - await collectionAll.UpsertVersionedAsync(content.DocumentId, oldVersion, content); } - private async Task UpsertPublishedContentAsync(ContentDomainObject.State value, long oldVersion, long newVersion, ISchemaEntity schema) + private async Task UpsertPublishedContentAsync(ContentDomainObject.State value, long oldVersion, long newVersion) { var content = SimpleMapper.Map(value, new MongoContentEntity { @@ -142,16 +122,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents content.ScheduleJob = null; content.NewStatus = null; - content.LoadData(value.CurrentVersion.Data, schema.SchemaDef, converter); - await collectionPublished.UpsertVersionedAsync(content.DocumentId, oldVersion, content); } - - private async Task GetSchemaAsync(DomainId appId, DomainId schemaId) - { - var schema = await appProvider.GetSchemaAsync(appId, schemaId, true); - - return schema; - } } } diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/Adapt.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/Adapt.cs index 71939448c..39f80f14d 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/Adapt.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/Adapt.cs @@ -8,96 +8,93 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Reflection; -using MongoDB.Bson.Serialization.Attributes; +using MongoDB.Bson.Serialization; using Squidex.Domain.Apps.Core.GenerateEdmSchema; -using Squidex.Domain.Apps.Core.Schemas; using Squidex.Infrastructure; +using Squidex.Infrastructure.MongoDb; using Squidex.Infrastructure.Queries; namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations { public static class Adapt { - private static readonly Dictionary PropertyMap = - typeof(MongoContentEntity).GetProperties() - .ToDictionary( - ToElementName, - ToName, - StringComparer.OrdinalIgnoreCase); + private static Dictionary pathMap; + private static Dictionary propertyMap; - private static string ToName(PropertyInfo x) + public static IReadOnlyDictionary PropertyMap { - return x.GetCustomAttribute()?.ElementName ?? x.Name; - } + get + { + if (propertyMap == null) + { + propertyMap = + BsonClassMap.LookupClassMap(typeof(MongoContentEntity)).AllMemberMaps + .ToDictionary( + x => x.MemberName, + x => x.ElementName, + StringComparer.OrdinalIgnoreCase); + } - private static string ToElementName(PropertyInfo x) - { - return x.Name; + return propertyMap; + } } - public static Func Path(Schema? schema) + public static IReadOnlyDictionary PathMap { - return propertyNames => + get { - var result = new List(propertyNames); - - if (result.Count > 1 && schema != null) + if (pathMap == null) { - var rootEdmName = result[1].UnescapeEdmField(); - var rootField = schema.FieldsByName[rootEdmName]; + pathMap = PropertyMap.ToDictionary(x => x.Key, x => (PropertyPath)x.Value); + } - result[1] = rootField.Id.ToString(); + return pathMap; + } + } - if (rootField is IArrayField arrayField && result.Count > 3) - { - var nestedEdmName = result[3].UnescapeEdmField(); - var nestedField = arrayField.FieldsByName[nestedEdmName]; + public static PropertyPath MapPath(PropertyPath path) + { + if (path.Count == 1 && PathMap.TryGetValue(path[0], out var mappedPath)) + { + return mappedPath; + } - result[3] = nestedField.Id.ToString(); - } - } + var result = new List(path); - if (result.Count > 2) + if (result.Count > 0) + { + if (PropertyMap.TryGetValue(path[0], out var mapped)) { - result[2] = result[2].UnescapeEdmField(); + result[0] = mapped; } + } - if (result.Count > 0) - { - if (result[0].Equals("Data", StringComparison.CurrentCultureIgnoreCase)) - { - result[0] = "do"; - } - else - { - result[0] = PropertyMap[propertyNames[0]]; - } - } + for (var i = 1; i < path.Count; i++) + { + result[i] = result[i].UnescapeEdmField().EscapeJson(); + } - return result; - }; + return result; } - public static ClrQuery AdjustToModel(this ClrQuery query, DomainId appId, Schema? schema) + public static ClrQuery AdjustToModel(this ClrQuery query, DomainId appId) { - var pathConverter = Path(schema); - if (query.Filter != null) { - query.Filter = AdaptionVisitor.Adapt(query.Filter, pathConverter, appId); + query.Filter = AdaptionVisitor.AdaptFilter(query.Filter, appId); } - query.Sort = query.Sort.Select(x => new SortNode(pathConverter(x.Path), x.Order)).ToList(); + if (query.Sort != null) + { + query.Sort = query.Sort.Select(x => new SortNode(MapPath(x.Path), x.Order)).ToList(); + } return query; } - public static FilterNode? AdjustToModel(this FilterNode filter, DomainId appId, Schema schema) + public static FilterNode? AdjustToModel(this FilterNode filter, DomainId appId) { - var pathConverter = Path(schema); - - return AdaptionVisitor.Adapt(filter, pathConverter, appId); + return AdaptionVisitor.AdaptFilter(filter, appId); } } } diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/AdaptionVisitor.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/AdaptionVisitor.cs index 762e63788..651bba150 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/AdaptionVisitor.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/AdaptionVisitor.cs @@ -20,14 +20,10 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations public struct Args { - public readonly Func PathConverter; - public readonly DomainId AppId; - public Args(Func pathConverter, DomainId appId) + public Args(DomainId appId) { - PathConverter = pathConverter; - AppId = appId; } } @@ -36,9 +32,9 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations { } - public static FilterNode? Adapt(FilterNode filter, Func pathConverter, DomainId appId) + public static FilterNode? AdaptFilter(FilterNode filter, DomainId appId) { - var args = new Args(pathConverter, appId); + var args = new Args(appId); return filter.Accept(Instance, args); } @@ -74,7 +70,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations } else { - path = args.PathConverter(path); + path = Adapt.MapPath(path); if (clrValue is List guidList) { diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/DataConverter.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/DataConverter.cs deleted file mode 100644 index e4cb65582..000000000 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/DataConverter.cs +++ /dev/null @@ -1,47 +0,0 @@ -// ========================================================================== -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex UG (haftungsbeschränkt) -// All rights reserved. Licensed under the MIT license. -// ========================================================================== - -using Squidex.Domain.Apps.Core.Contents; -using Squidex.Domain.Apps.Core.ConvertContent; -using Squidex.Domain.Apps.Core.Schemas; -using Squidex.Infrastructure.Json; - -namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations -{ - public sealed class DataConverter - { - private readonly FieldConverter[] decodeJsonConverters; - private readonly FieldConverter[] encodeJsonConverters; - - public DataConverter(IJsonSerializer serializer) - { - var decoder = ValueConverters.DecodeJson(serializer); - - decodeJsonConverters = new[] - { - FieldConverters.ForValues(decoder, ValueConverters.ForNested(decoder)) - }; - - var encoder = ValueConverters.EncodeJson(serializer); - - encodeJsonConverters = new[] - { - FieldConverters.ForValues(encoder, ValueConverters.ForNested(encoder)) - }; - } - - public NamedContentData FromMongoModel(IdContentData result, Schema schema) - { - return result.ConvertId2Name(schema, decodeJsonConverters); - } - - public IdContentData ToMongoModel(NamedContentData result, Schema schema) - { - return result.ConvertName2IdCloned(schema, encodeJsonConverters); - } - } -} diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/OperationBase.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/OperationBase.cs index 16b037b57..edac8aac1 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/OperationBase.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/OperationBase.cs @@ -21,13 +21,6 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations public IMongoCollection Collection { get; private set; } - public DataConverter DataConverter { get; } - - protected OperationBase(DataConverter dataConverter) - { - DataConverter = dataConverter; - } - public Task PrepareAsync(IMongoCollection collection, CancellationToken ct = default) { Collection = collection; diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryAsStream.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryAsStream.cs index 0d4d6d0f0..f87844456 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryAsStream.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryAsStream.cs @@ -16,14 +16,6 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations { public sealed class QueryAsStream : OperationBase { - private readonly IAppProvider appProvider; - - public QueryAsStream(DataConverter converter, IAppProvider appProvider) - : base(converter) - { - this.appProvider = appProvider; - } - protected override async Task PrepareAsync(CancellationToken ct = default) { var indexBySchema = @@ -48,14 +40,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations { foreach (var entity in cursor.Current) { - var schema = await appProvider.GetSchemaAsync(appId, entity.SchemaId.Id, false); - - if (schema != null) - { - entity.ParseData(schema.SchemaDef, DataConverter); - - yield return entity; - } + yield return entity; } } } diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryById.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryById.cs index ca46d44e5..d60afce3f 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryById.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryById.cs @@ -15,11 +15,6 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations { internal sealed class QueryById : OperationBase { - public QueryById(DataConverter dataConverter) - : base(dataConverter) - { - } - public async Task QueryAsync(ISchemaEntity schema, DomainId id) { Guard.NotNull(schema, nameof(schema)); @@ -36,8 +31,6 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations { return null; } - - contentEntity?.ParseData(schema.SchemaDef, DataConverter); } return contentEntity; diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryByIds.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryByIds.cs index 1af002a3b..d8727dec3 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryByIds.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryByIds.cs @@ -20,11 +20,6 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations { internal sealed class QueryByIds : OperationBase { - public QueryByIds(DataConverter dataConverter) - : base(dataConverter) - { - } - public async Task> QueryIdsAsync(DomainId appId, HashSet ids) { if (ids == null || ids.Count == 0) @@ -59,15 +54,6 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations { contentTotal = await Collection.Find(filter).CountDocumentsAsync(); } - - var contentSchemas = schemas.ToDictionary(x => x.Id); - - foreach (var content in contentEntities) - { - var schema = contentSchemas[content.SchemaId.Id]; - - content.ParseData(schema.SchemaDef, DataConverter); - } } return ResultList.Create(contentTotal, contentEntities); diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryByQuery.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryByQuery.cs index aac1a4e26..e6939cc85 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryByQuery.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryByQuery.cs @@ -36,8 +36,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations public MongoContentEntity[] Joined { get; set; } } - public QueryByQuery(DataConverter dataConverter, IAppProvider appProvider) - : base(dataConverter) + public QueryByQuery(IAppProvider appProvider) { this.appProvider = appProvider; } @@ -76,7 +75,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations return new List<(DomainId SchemaId, DomainId Id, Status Status)>(); } - var filter = BuildFilter(appId, schemaId, filterNode.AdjustToModel(appId, schema.SchemaDef)); + var filter = BuildFilter(appId, schemaId, filterNode.AdjustToModel(appId)); var contentItems = await Collection.FindStatusAsync(filter); @@ -99,7 +98,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations try { - var query = q.Query.AdjustToModel(app.Id, null); + var query = q.Query.AdjustToModel(app.Id); var filter = CreateFilter(app.Id, schemas.Select(x => x.Id), query, q.Reference); @@ -112,13 +111,6 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations { contentTotal = await Collection.Find(filter).CountDocumentsAsync(); } - - var contentSchemas = schemas.ToDictionary(x => x.Id); - - foreach (var entity in contentEntities) - { - entity.ParseData(contentSchemas[entity.IndexedSchemaId].SchemaDef, DataConverter); - } } return ResultList.Create(contentTotal, contentEntities); @@ -141,7 +133,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations try { - var query = q.Query.AdjustToModel(app.Id, schema.SchemaDef); + var query = q.Query.AdjustToModel(app.Id); var filter = CreateFilter(schema.AppId.Id, Enumerable.Repeat(schema.Id, 1), query, q.Reference); @@ -154,11 +146,6 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations { contentTotal = await Collection.Find(filter).CountDocumentsAsync(); } - - foreach (var entity in contentEntities) - { - entity.ParseData(schema.SchemaDef, DataConverter); - } } return ResultList.Create(contentTotal, contentEntities); diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryReferences.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryReferences.cs index 6e4909df5..177c59503 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryReferences.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryReferences.cs @@ -31,8 +31,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations public HashSet? ReferencedIds { get; set; } } - public QueryReferences(DataConverter dataConverter, QueryByIds queryByIds) - : base(dataConverter) + public QueryReferences(QueryByIds queryByIds) { this.queryByIds = queryByIds; } diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryReferrers.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryReferrers.cs index f8c0bd15a..5770f17b5 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryReferrers.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryReferrers.cs @@ -15,11 +15,6 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations { internal sealed class QueryReferrers : OperationBase { - public QueryReferrers(DataConverter dataConverter) - : base(dataConverter) - { - } - protected override Task PrepareAsync(CancellationToken ct = default) { var index = diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryScheduled.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryScheduled.cs index 35655a4d3..46c6d3c97 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryScheduled.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryScheduled.cs @@ -18,11 +18,6 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations { internal sealed class QueryScheduled : OperationBase { - public QueryScheduled(DataConverter dataConverter) - : base(dataConverter) - { - } - protected override Task PrepareAsync(CancellationToken ct = default) { var index = @@ -37,8 +32,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Operations { Guard.NotNull(callback, nameof(callback)); - return Collection.Find(x => x.ScheduledAt < now && x.IsDeleted != true) - .Not(x => x.DataByIds) + return Collection.Find(x => x.ScheduledAt < now && x.IsDeleted != true).Not(x => x.Data) .ForEachAsync(c => { callback(c); diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateBlogCommandMiddleware.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateBlogCommandMiddleware.cs index dcdab7867..aab340eea 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateBlogCommandMiddleware.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateBlogCommandMiddleware.cs @@ -57,7 +57,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.Templates { SchemaId = postsId, Data = - new NamedContentData() + new ContentData() .AddField("title", new ContentFieldData() .AddValue("My first post with Squidex")) @@ -76,7 +76,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.Templates { SchemaId = pagesId, Data = - new NamedContentData() + new ContentData() .AddField("title", new ContentFieldData() .AddValue("About Me")) diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateProfileCommandMiddleware.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateProfileCommandMiddleware.cs index ea435007f..7f3f5a9e2 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateProfileCommandMiddleware.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateProfileCommandMiddleware.cs @@ -61,7 +61,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.Templates { ContentId = postsId.Id, Data = - new NamedContentData() + new ContentData() .AddField("firstName", new ContentFieldData() .AddValue("John")) diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/BackupContents.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/BackupContents.cs index a3512a0fe..c016178c5 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/BackupContents.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/BackupContents.cs @@ -106,7 +106,7 @@ namespace Squidex.Domain.Apps.Entities.Contents return true; } - private void ReplaceAssetUrl(NamedContentData data) + private void ReplaceAssetUrl(ContentData data) { foreach (var field in data.Values) { diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Commands/BulkUpdateJob.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Commands/BulkUpdateJob.cs index 96fc920d9..c694d72ad 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Commands/BulkUpdateJob.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Commands/BulkUpdateJob.cs @@ -25,7 +25,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Commands public BulkUpdateType Type { get; set; } - public NamedContentData? Data { get; set; } + public ContentData? Data { get; set; } public string? Schema { get; set; } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Commands/ContentDataCommand.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Commands/ContentDataCommand.cs index c03f5ca5f..e0c6782a3 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Commands/ContentDataCommand.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Commands/ContentDataCommand.cs @@ -15,6 +15,6 @@ namespace Squidex.Domain.Apps.Entities.Contents.Commands public bool OptimizeValidation { get; set; } - public NamedContentData Data { get; set; } + public ContentData Data { get; set; } } } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentEntity.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentEntity.cs index 0c2b6ea25..3b87681a5 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentEntity.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentEntity.cs @@ -30,9 +30,9 @@ namespace Squidex.Domain.Apps.Entities.Contents public RefToken LastModifiedBy { get; set; } - public NamedContentData Data { get; set; } + public ContentData Data { get; set; } - public NamedContentData? ReferenceData { get; set; } + public ContentData? ReferenceData { get; set; } public ScheduleJob? ScheduleJob { get; set; } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentsSearchSource.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentsSearchSource.cs index c263cac59..f3b5fdd9d 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentsSearchSource.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentsSearchSource.cs @@ -114,7 +114,7 @@ namespace Squidex.Domain.Apps.Entities.Contents { var sb = new StringBuilder(); - IJsonValue? GetValue(NamedContentData? data, RootField field) + IJsonValue? GetValue(ContentData? data, RootField field) { if (data != null && data.TryGetValue(field.Name, out var fieldValue) && fieldValue != null) { diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/DefaultContentWorkflow.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/DefaultContentWorkflow.cs index 16a5de6d5..e2a8bb524 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/DefaultContentWorkflow.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/DefaultContentWorkflow.cs @@ -52,7 +52,7 @@ namespace Squidex.Domain.Apps.Entities.Contents return Task.FromResult(Status.Draft); } - public Task CanPublishOnCreateAsync(ISchemaEntity schema, NamedContentData data, ClaimsPrincipal user) + public Task CanPublishOnCreateAsync(ISchemaEntity schema, ContentData data, ClaimsPrincipal user) { return Task.FromResult(true); } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/DomainObject/ContentDomainObject.State.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/DomainObject/ContentDomainObject.State.cs index 1d3f28511..f9e28c8b9 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/DomainObject/ContentDomainObject.State.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/DomainObject/ContentDomainObject.State.cs @@ -35,7 +35,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject } [IgnoreDataMember] - public NamedContentData Data + public ContentData Data { get { return NewVersion?.Data ?? CurrentVersion.Data; } } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/DomainObject/ContentDomainObject.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/DomainObject/ContentDomainObject.cs index 5fd279f54..18a72698f 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/DomainObject/ContentDomainObject.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/DomainObject/ContentDomainObject.cs @@ -264,7 +264,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject } } - private async Task UpdateAsync(ContentUpdateCommand command, Func newDataFunc, bool partial) + private async Task UpdateAsync(ContentUpdateCommand command, Func newDataFunc, bool partial) { var currentData = Snapshot.Data; @@ -337,7 +337,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject Raise(command, new ContentDraftDeleted()); } - public void Update(ContentCommand command, NamedContentData data) + public void Update(ContentCommand command, ContentData data) { Raise(command, new ContentUpdated { Data = data }); } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/DomainObject/ContentOperationContext.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/DomainObject/ContentOperationContext.cs index 586b64089..acc54f95b 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/DomainObject/ContentOperationContext.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/DomainObject/ContentOperationContext.cs @@ -111,14 +111,14 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject return contentWorkflow.GetInitialStatusAsync(schema); } - public Task GenerateDefaultValuesAsync(NamedContentData data) + public Task GenerateDefaultValuesAsync(ContentData data) { data.GenerateDefaultValues(schema.SchemaDef, Partition()); return Task.CompletedTask; } - public async Task ValidateInputAsync(NamedContentData data, bool publish) + public async Task ValidateInputAsync(ContentData data, bool publish) { var validator = new ContentValidator(Partition(), @@ -129,7 +129,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject CheckErrors(validator); } - public async Task ValidateInputPartialAsync(NamedContentData data) + public async Task ValidateInputPartialAsync(ContentData data) { var validator = new ContentValidator(Partition(), @@ -140,7 +140,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject CheckErrors(validator); } - public async Task ValidateContentAsync(NamedContentData data) + public async Task ValidateContentAsync(ContentData data) { var validator = new ContentValidator(Partition(), @@ -151,7 +151,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject CheckErrors(validator); } - public async Task ValidateContentAndInputAsync(NamedContentData data) + public async Task ValidateContentAndInputAsync(ContentData data) { var validator = new ContentValidator(Partition(), @@ -163,7 +163,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject CheckErrors(validator); } - public Task ValidateOnPublishAsync(NamedContentData data) + public Task ValidateOnPublishAsync(ContentData data) { if (!schema.SchemaDef.Properties.ValidateOnPublish) { @@ -186,7 +186,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject return !string.IsNullOrWhiteSpace(GetScript(script)); } - public async Task ExecuteScriptAndTransformAsync(Func script, ScriptVars context) + public async Task ExecuteScriptAndTransformAsync(Func script, ScriptVars context) { Enrich(context); diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/DomainObject/ContentVersion.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/DomainObject/ContentVersion.cs index 3a7f3e0c9..417909fd3 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/DomainObject/ContentVersion.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/DomainObject/ContentVersion.cs @@ -14,9 +14,9 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject { public Status Status { get; } - public NamedContentData Data { get; } + public ContentData Data { get; } - public ContentVersion(Status status, NamedContentData data) + public ContentVersion(Status status, ContentData data) { Guard.NotNull(data, nameof(data)); @@ -30,7 +30,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject return new ContentVersion(status, Data); } - public ContentVersion WithData(NamedContentData data) + public ContentVersion WithData(ContentData data) { return new ContentVersion(Status, data); } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/DynamicContentWorkflow.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/DynamicContentWorkflow.cs index 05cfbd6ee..c132bbf5b 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/DynamicContentWorkflow.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/DynamicContentWorkflow.cs @@ -45,7 +45,7 @@ namespace Squidex.Domain.Apps.Entities.Contents return workflow.TryGetTransition(status, next, out var transition) && IsTrue(transition, content.Data, user); } - public async Task CanPublishOnCreateAsync(ISchemaEntity schema, NamedContentData data, ClaimsPrincipal user) + public async Task CanPublishOnCreateAsync(ISchemaEntity schema, ContentData data, ClaimsPrincipal user) { var workflow = await GetWorkflowAsync(schema.AppId.Id, schema.Id); @@ -102,7 +102,7 @@ namespace Squidex.Domain.Apps.Entities.Contents return result.ToArray(); } - private bool IsTrue(WorkflowCondition condition, NamedContentData data, ClaimsPrincipal user) + private bool IsTrue(WorkflowCondition condition, ContentData data, ClaimsPrincipal user) { if (condition?.Roles != null && user != null) { diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentActions.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentActions.cs index 6a9654efe..f3630783e 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentActions.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentActions.cs @@ -442,11 +442,11 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types } } - private static NamedContentData GetContentData(IResolveFieldContext c) + private static ContentData GetContentData(IResolveFieldContext c) { var source = c.GetArgument>("data"); - return source.ToNamedContentData((IComplexGraphType)c.FieldDefinition.Arguments.Find("data").Flatten()); + return source.ToContentData((IComplexGraphType)c.FieldDefinition.Arguments.Find("data").Flatten()); } private static IFieldResolver ResolveAsync(NamedId appId, NamedId schemaId, Func action) diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentDataGraphType.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentDataGraphType.cs index f5f435315..f5b9f8abf 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentDataGraphType.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentDataGraphType.cs @@ -12,7 +12,7 @@ using Squidex.Domain.Apps.Entities.Schemas; namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types { - public sealed class ContentDataGraphType : ObjectGraphType + public sealed class ContentDataGraphType : ObjectGraphType { public ContentDataGraphType(ISchemaEntity schema, string schemaName, string schemaType, IGraphModel model) { diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentResolvers.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentResolvers.cs index fc942e223..4239e17c5 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentResolvers.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentResolvers.cs @@ -62,7 +62,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types { var fieldName = field.Name; - return new FuncFieldResolver?>(c => + return new FuncFieldResolver?>(c => { return c.Source?.GetOrDefault(fieldName); }); diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Utils/Converters.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Utils/Converters.cs index 2c8e5077b..12900b1f4 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Utils/Converters.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Utils/Converters.cs @@ -14,9 +14,9 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Utils { public static class Converters { - public static NamedContentData ToNamedContentData(this IDictionary source, IComplexGraphType type) + public static ContentData ToContentData(this IDictionary source, IComplexGraphType type) { - var result = new NamedContentData(); + var result = new ContentData(); foreach (var field in type.Fields) { diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/IContentEntity.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/IContentEntity.cs index b2271c7ae..f12571c74 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/IContentEntity.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/IContentEntity.cs @@ -25,7 +25,7 @@ namespace Squidex.Domain.Apps.Entities.Contents Status Status { get; } - NamedContentData Data { get; } + ContentData Data { get; } ScheduleJob? ScheduleJob { get; } } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/IContentWorkflow.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/IContentWorkflow.cs index ce824f558..6c87762ac 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/IContentWorkflow.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/IContentWorkflow.cs @@ -16,7 +16,7 @@ namespace Squidex.Domain.Apps.Entities.Contents { Task GetInitialStatusAsync(ISchemaEntity schema); - Task CanPublishOnCreateAsync(ISchemaEntity schema, NamedContentData data, ClaimsPrincipal user); + Task CanPublishOnCreateAsync(ISchemaEntity schema, ContentData data, ClaimsPrincipal user); Task CanMoveToAsync(IContentEntity content, Status status, Status next, ClaimsPrincipal user); diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/IEnrichedContentEntity.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/IEnrichedContentEntity.cs index f3beecbc2..51bd57dae 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/IEnrichedContentEntity.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/IEnrichedContentEntity.cs @@ -30,6 +30,6 @@ namespace Squidex.Domain.Apps.Entities.Contents StatusInfo[]? NextStatuses { get; } - NamedContentData? ReferenceData { get; } + ContentData? ReferenceData { get; } } } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ConvertData.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ConvertData.cs index d5a5dd98d..c1fdcb579 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ConvertData.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ConvertData.cs @@ -61,7 +61,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries.Steps foreach (var content in group) { - content.Data = content.Data.ConvertName2Name(schema.SchemaDef, converters); + content.Data = content.Data.Convert(schema.SchemaDef, converters); } } } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ResolveAssets.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ResolveAssets.cs index 3652bc177..d6f4e2e00 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ResolveAssets.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ResolveAssets.cs @@ -70,7 +70,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries.Steps { foreach (var content in contents) { - content.ReferenceData ??= new NamedContentData(); + content.ReferenceData ??= new ContentData(); var fieldReference = content.ReferenceData.GetOrAdd(field.Name, _ => new ContentFieldData())!; diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ResolveReferences.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ResolveReferences.cs index 4fa18aa2d..3c8e3893f 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ResolveReferences.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ResolveReferences.cs @@ -73,7 +73,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries.Steps { foreach (var content in contents) { - content.ReferenceData ??= new NamedContentData(); + content.ReferenceData ??= new ContentData(); var fieldReference = content.ReferenceData.GetOrAdd(field.Name, _ => new ContentFieldData())!; diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/SingletonCommandMiddleware.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/SingletonCommandMiddleware.cs index 0d77147a9..2f5b9dcef 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/SingletonCommandMiddleware.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/SingletonCommandMiddleware.cs @@ -27,7 +27,7 @@ namespace Squidex.Domain.Apps.Entities.Contents { var schemaId = NamedId.Of(createSchema.SchemaId, createSchema.Name); - var data = new NamedContentData(); + var data = new ContentData(); var contentId = schemaId.Id; var content = new CreateContent diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Extensions.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Extensions.cs index 885255917..68065f505 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Extensions.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Extensions.cs @@ -6,26 +6,18 @@ // ========================================================================== using System.Collections.Generic; -using System.IO; using System.Text; using GeoJSON.Net; -using GeoJSON.Net.Geometry; -using Microsoft.Extensions.ObjectPool; using Squidex.Domain.Apps.Core.Contents; using Squidex.Infrastructure.Json; using Squidex.Infrastructure.Json.Objects; +using Squidex.Infrastructure.ObjectPool; namespace Squidex.Domain.Apps.Entities.Contents.Text { public static class Extensions { - private static readonly ObjectPool StringBuilderPool = - new DefaultObjectPool(new StringBuilderPooledObjectPolicy()); - - private static readonly ObjectPool MemoryStreamPool = - new DefaultObjectPool(new DefaultPooledObjectPolicy()); - - public static Dictionary? ToGeo(this NamedContentData data, IJsonSerializer jsonSerializer) + public static Dictionary? ToGeo(this ContentData data, IJsonSerializer jsonSerializer) { Dictionary? result = null; @@ -35,9 +27,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text { foreach (var (key, jsonValue) in value) { - var geoJson = GetGeoJson(jsonSerializer, jsonValue); - - if (geoJson != null) + if (GeoJsonValue.TryParse(jsonValue, jsonSerializer, out var geoJson) == GeoJsonParseResult.Success) { result ??= new Dictionary(); result[$"{field}.{key}"] = geoJson; @@ -49,40 +39,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text return result; } - private static GeoJSONObject? GetGeoJson(IJsonSerializer jsonSerializer, IJsonValue value) - { - if (value is JsonObject geoObject) - { - var stream = MemoryStreamPool.Get(); - - try - { - stream.Position = 0; - - jsonSerializer.Serialize(geoObject, stream, true); - - stream.Position = 0; - - return jsonSerializer.Deserialize(stream, null, true); - } - catch - { - if (geoObject.TryGetValue("latitude", out var lat) && - geoObject.TryGetValue("longitude", out var lon)) - { - return new Point(new Position(lat.Value, lon.Value)); - } - } - finally - { - MemoryStreamPool.Return(stream); - } - } - - return null; - } - - public static Dictionary? ToTexts(this NamedContentData data) + public static Dictionary? ToTexts(this ContentData data) { Dictionary? result = null; @@ -115,7 +72,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text { foreach (var (_, sb) in languages) { - StringBuilderPool.Return(sb); + DefaultPools.StringBuilder.Return(sb); } } } @@ -151,7 +108,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text { if (!languages.TryGetValue(language, out var sb)) { - sb = StringBuilderPool.Get(); + sb = DefaultPools.StringBuilder.Get(); languages[language] = sb; } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexingProcess.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexingProcess.cs index 1253a2f0d..cc8e3a016 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexingProcess.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexingProcess.cs @@ -112,7 +112,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text } } - private void Create(ContentEvent @event, NamedContentData data) + private void Create(ContentEvent @event, ContentData data) { var uniqueId = DomainId.Combine(@event.AppId, @event.ContentId); @@ -172,7 +172,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text } } - private void Update(ContentEvent @event, NamedContentData data) + private void Update(ContentEvent @event, ContentData data) { var uniqueId = DomainId.Combine(@event.AppId, @event.ContentId); diff --git a/backend/src/Squidex.Domain.Apps.Events/Contents/ContentCreated.cs b/backend/src/Squidex.Domain.Apps.Events/Contents/ContentCreated.cs index 0aeb82997..4de101047 100644 --- a/backend/src/Squidex.Domain.Apps.Events/Contents/ContentCreated.cs +++ b/backend/src/Squidex.Domain.Apps.Events/Contents/ContentCreated.cs @@ -15,6 +15,6 @@ namespace Squidex.Domain.Apps.Events.Contents { public Status Status { get; set; } - public NamedContentData Data { get; set; } + public ContentData Data { get; set; } } } diff --git a/backend/src/Squidex.Domain.Apps.Events/Contents/ContentDraftCreated.cs b/backend/src/Squidex.Domain.Apps.Events/Contents/ContentDraftCreated.cs index 85a6d25ec..500922834 100644 --- a/backend/src/Squidex.Domain.Apps.Events/Contents/ContentDraftCreated.cs +++ b/backend/src/Squidex.Domain.Apps.Events/Contents/ContentDraftCreated.cs @@ -13,7 +13,7 @@ namespace Squidex.Domain.Apps.Events.Contents [EventType(nameof(ContentDraftCreated))] public sealed class ContentDraftCreated : ContentEvent { - public NamedContentData? MigratedData { get; set; } + public ContentData? MigratedData { get; set; } public Status Status { get; set; } } diff --git a/backend/src/Squidex.Domain.Apps.Events/Contents/ContentUpdated.cs b/backend/src/Squidex.Domain.Apps.Events/Contents/ContentUpdated.cs index 1012d42d7..76d7c6df2 100644 --- a/backend/src/Squidex.Domain.Apps.Events/Contents/ContentUpdated.cs +++ b/backend/src/Squidex.Domain.Apps.Events/Contents/ContentUpdated.cs @@ -13,7 +13,7 @@ namespace Squidex.Domain.Apps.Events.Contents [EventType(nameof(ContentUpdated))] public sealed class ContentUpdated : ContentEvent { - public NamedContentData Data { get; set; } + public ContentData Data { get; set; } public bool NewVersion { get; set; } } diff --git a/backend/src/Squidex.Infrastructure.Azure/EventSourcing/StreamPosition.cs b/backend/src/Squidex.Infrastructure.Azure/EventSourcing/StreamPosition.cs index 98d934a15..dfcf9a848 100644 --- a/backend/src/Squidex.Infrastructure.Azure/EventSourcing/StreamPosition.cs +++ b/backend/src/Squidex.Infrastructure.Azure/EventSourcing/StreamPosition.cs @@ -5,16 +5,12 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== -using System.Text; -using Microsoft.Extensions.ObjectPool; +using Squidex.Infrastructure.ObjectPool; namespace Squidex.Infrastructure.EventSourcing { internal sealed class StreamPosition { - private static readonly ObjectPool StringBuilderPool = - new DefaultObjectPool(new StringBuilderPooledObjectPolicy()); - public static readonly StreamPosition Empty = new StreamPosition(0, -1, -1); public long Timestamp { get; } @@ -38,7 +34,7 @@ namespace Squidex.Infrastructure.EventSourcing public static implicit operator string(StreamPosition position) { - var sb = StringBuilderPool.Get(); + var sb = DefaultPools.StringBuilder.Get(); try { sb.Append(position.Timestamp); @@ -51,7 +47,7 @@ namespace Squidex.Infrastructure.EventSourcing } finally { - StringBuilderPool.Return(sb); + DefaultPools.StringBuilder.Return(sb); } } diff --git a/backend/src/Squidex.Infrastructure.MongoDb/EventSourcing/StreamPosition.cs b/backend/src/Squidex.Infrastructure.MongoDb/EventSourcing/StreamPosition.cs index 9e937cf6e..b56b48ca5 100644 --- a/backend/src/Squidex.Infrastructure.MongoDb/EventSourcing/StreamPosition.cs +++ b/backend/src/Squidex.Infrastructure.MongoDb/EventSourcing/StreamPosition.cs @@ -5,17 +5,13 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== -using System.Text; -using Microsoft.Extensions.ObjectPool; using MongoDB.Bson; +using Squidex.Infrastructure.ObjectPool; namespace Squidex.Infrastructure.EventSourcing { internal sealed class StreamPosition { - private static readonly ObjectPool StringBuilderPool = - new DefaultObjectPool(new StringBuilderPooledObjectPolicy()); - public static readonly StreamPosition Empty = new StreamPosition(new BsonTimestamp(0, 0), -1, -1); public BsonTimestamp Timestamp { get; } @@ -38,7 +34,7 @@ namespace Squidex.Infrastructure.EventSourcing public static implicit operator string(StreamPosition position) { - var sb = StringBuilderPool.Get(); + var sb = DefaultPools.StringBuilder.Get(); try { sb.Append(position.Timestamp.Timestamp); @@ -53,7 +49,7 @@ namespace Squidex.Infrastructure.EventSourcing } finally { - StringBuilderPool.Return(sb); + DefaultPools.StringBuilder.Return(sb); } } diff --git a/backend/src/Squidex.Infrastructure.MongoDb/MongoDb/BsonHelper.cs b/backend/src/Squidex.Infrastructure.MongoDb/MongoDb/BsonHelper.cs index 8c63fe0b8..09608b744 100644 --- a/backend/src/Squidex.Infrastructure.MongoDb/MongoDb/BsonHelper.cs +++ b/backend/src/Squidex.Infrastructure.MongoDb/MongoDb/BsonHelper.cs @@ -11,6 +11,7 @@ namespace Squidex.Infrastructure.MongoDb { private const string TypeBson = "§type"; private const string TypeJson = "$type"; + private const string DotReplacement = "_§§_"; public static string UnescapeBson(this string value) { @@ -19,7 +20,7 @@ namespace Squidex.Infrastructure.MongoDb return TypeJson; } - return ReplaceFirstCharacter(value, '§', '$'); + return ReplaceFirstCharacter(value, '§', '$').Replace(DotReplacement, "."); } public static string EscapeJson(this string value) @@ -29,7 +30,7 @@ namespace Squidex.Infrastructure.MongoDb return TypeBson; } - return ReplaceFirstCharacter(value, '$', '§'); + return ReplaceFirstCharacter(value, '$', '§').Replace(".", DotReplacement); } private static string ReplaceFirstCharacter(string value, char toReplace, char replacement) diff --git a/backend/src/Squidex.Infrastructure/EventSourcing/DefaultEventDataFormatter.cs b/backend/src/Squidex.Infrastructure/EventSourcing/DefaultEventDataFormatter.cs index 7b1e4b496..b952018c2 100644 --- a/backend/src/Squidex.Infrastructure/EventSourcing/DefaultEventDataFormatter.cs +++ b/backend/src/Squidex.Infrastructure/EventSourcing/DefaultEventDataFormatter.cs @@ -47,19 +47,19 @@ namespace Squidex.Infrastructure.EventSourcing var eventData = storedEvent.Data; var payloadType = typeNameRegistry.GetType(eventData.Type); - var payloadObj = serializer.Deserialize(eventData.Payload, payloadType); + var payloadValue = serializer.Deserialize(eventData.Payload, payloadType); - if (payloadObj is IMigrated migratedEvent) + if (payloadValue is IMigrated migratedEvent) { - payloadObj = migratedEvent.Migrate(); + payloadValue = migratedEvent.Migrate(); - if (ReferenceEquals(migratedEvent, payloadObj)) + if (ReferenceEquals(migratedEvent, payloadValue)) { Debug.WriteLine("Migration should return new event."); } } - var envelope = new Envelope(payloadObj, eventData.Headers); + var envelope = new Envelope(payloadValue, eventData.Headers); envelope.SetEventPosition(storedEvent.EventPosition); envelope.SetEventStreamNumber(storedEvent.EventStreamNumber); diff --git a/backend/src/Squidex.Infrastructure/ObjectPool/DefaultPools.cs b/backend/src/Squidex.Infrastructure/ObjectPool/DefaultPools.cs new file mode 100644 index 000000000..7335bc38e --- /dev/null +++ b/backend/src/Squidex.Infrastructure/ObjectPool/DefaultPools.cs @@ -0,0 +1,22 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System.IO; +using System.Text; +using Microsoft.Extensions.ObjectPool; + +namespace Squidex.Infrastructure.ObjectPool +{ + public static class DefaultPools + { + public static readonly ObjectPool MemoryStream = + new DefaultObjectPool(new MemoryStreamPooledObjectPolicy()); + + public static readonly ObjectPool StringBuilder = + new DefaultObjectPool(new StringBuilderPooledObjectPolicy()); + } +} diff --git a/backend/src/Squidex.Infrastructure/ObjectPool/MemoryStreamPooledObjectPolicy.cs b/backend/src/Squidex.Infrastructure/ObjectPool/MemoryStreamPooledObjectPolicy.cs new file mode 100644 index 000000000..53a44fc6a --- /dev/null +++ b/backend/src/Squidex.Infrastructure/ObjectPool/MemoryStreamPooledObjectPolicy.cs @@ -0,0 +1,36 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System.IO; +using Microsoft.Extensions.ObjectPool; + +namespace Squidex.Infrastructure.ObjectPool +{ + public sealed class MemoryStreamPooledObjectPolicy : PooledObjectPolicy + { + public int InitialCapacity { get; set; } = 100; + + public int MaximumRetainedCapacity { get; set; } = 4 * 1024; + + public override MemoryStream Create() + { + return new MemoryStream(InitialCapacity); + } + + public override bool Return(MemoryStream obj) + { + if (obj.Capacity > MaximumRetainedCapacity) + { + return false; + } + + obj.Position = 0; + + return true; + } + } +} \ No newline at end of file diff --git a/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj b/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj index 62e9af3aa..7e6a78bf7 100644 --- a/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj +++ b/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj @@ -8,11 +8,6 @@ full True - - - - - @@ -50,4 +45,7 @@ + + + diff --git a/backend/src/Squidex.Infrastructure/States/ISnapshotStore.cs b/backend/src/Squidex.Infrastructure/States/ISnapshotStore.cs index 68243db74..c8f3ee41a 100644 --- a/backend/src/Squidex.Infrastructure/States/ISnapshotStore.cs +++ b/backend/src/Squidex.Infrastructure/States/ISnapshotStore.cs @@ -6,6 +6,7 @@ // ========================================================================== using System; +using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; diff --git a/backend/src/Squidex/Areas/Api/Controllers/Contents/ContentsController.cs b/backend/src/Squidex/Areas/Api/Controllers/Contents/ContentsController.cs index 451ab462a..05785cb50 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Contents/ContentsController.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Contents/ContentsController.cs @@ -433,7 +433,7 @@ namespace Squidex.Areas.Api.Controllers.Contents [ProducesResponseType(typeof(ContentsDto), 201)] [ApiPermissionOrAnonymous(Permissions.AppContentsCreate)] [ApiCosts(1)] - public async Task PostContent(string app, string name, [FromBody] NamedContentData request, [FromQuery] bool publish = false, [FromQuery] DomainId? id = null) + public async Task PostContent(string app, string name, [FromBody] ContentData request, [FromQuery] bool publish = false, [FromQuery] DomainId? id = null) { var command = new CreateContent { Data = request.ToCleaned(), Publish = publish }; @@ -530,7 +530,7 @@ namespace Squidex.Areas.Api.Controllers.Contents [ProducesResponseType(typeof(ContentsDto), StatusCodes.Status200OK)] [ApiPermissionOrAnonymous(Permissions.AppContentsUpsert)] [ApiCosts(1)] - public async Task PostContent(string app, string name, DomainId id, [FromBody] NamedContentData request, [FromQuery] bool publish = false) + public async Task PostContent(string app, string name, DomainId id, [FromBody] ContentData request, [FromQuery] bool publish = false) { var command = new UpsertContent { ContentId = id, Data = request.ToCleaned(), Publish = publish }; @@ -559,7 +559,7 @@ namespace Squidex.Areas.Api.Controllers.Contents [ProducesResponseType(typeof(ContentsDto), StatusCodes.Status200OK)] [ApiPermissionOrAnonymous(Permissions.AppContentsUpdate)] [ApiCosts(1)] - public async Task PutContent(string app, string name, DomainId id, [FromBody] NamedContentData request) + public async Task PutContent(string app, string name, DomainId id, [FromBody] ContentData request) { var command = new UpdateContent { ContentId = id, Data = request.ToCleaned() }; @@ -588,7 +588,7 @@ namespace Squidex.Areas.Api.Controllers.Contents [ProducesResponseType(typeof(ContentsDto), StatusCodes.Status200OK)] [ApiPermissionOrAnonymous(Permissions.AppContentsUpdate)] [ApiCosts(1)] - public async Task PatchContent(string app, string name, DomainId id, [FromBody] NamedContentData request) + public async Task PatchContent(string app, string name, DomainId id, [FromBody] ContentData request) { var command = new PatchContent { ContentId = id, Data = request.ToCleaned() }; diff --git a/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/BulkUpdateJobDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/BulkUpdateJobDto.cs index 14680492f..7e8886824 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/BulkUpdateJobDto.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/BulkUpdateJobDto.cs @@ -30,7 +30,7 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models /// /// The data of the content when type is set to 'Upsert', 'Create', 'Update' or 'Patch. /// - public NamedContentData? Data { get; set; } + public ContentData? Data { get; set; } /// /// The new status when the type is set to 'ChangeStatus'. diff --git a/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentDto.cs index 693158bc2..f7e1d15e3 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentDto.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentDto.cs @@ -46,7 +46,7 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models /// /// The reference data for the frontend UI. /// - public NamedContentData? ReferenceData { get; set; } + public ContentData? ReferenceData { get; set; } /// /// The date and time when the content item has been created. diff --git a/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ImportContentsDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ImportContentsDto.cs index 2d20e1c7a..1803ba11f 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ImportContentsDto.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ImportContentsDto.cs @@ -19,7 +19,7 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models /// The data to import. /// [LocalizedRequired] - public List Datas { get; set; } + public List Datas { get; set; } /// /// True to automatically publish the content. diff --git a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/FieldDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/FieldDto.cs index f0657055f..d878b5cf1 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/FieldDto.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/FieldDto.cs @@ -69,7 +69,6 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models SimpleMapper.Map(field, new NestedFieldDto { - FieldId = field.Id, Properties = properties }); diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/ContentDataTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/ContentDataTests.cs index ca6ce94c5..2d9689d7a 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/ContentDataTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/ContentDataTests.cs @@ -17,7 +17,7 @@ namespace Squidex.Domain.Apps.Core.Model.Contents public void Should_remove_null_values_from_name_model_when_cleaning() { var input = - new NamedContentData() + new ContentData() .AddField("field1", null) .AddField("field2", new ContentFieldData() @@ -27,7 +27,7 @@ namespace Squidex.Domain.Apps.Core.Model.Contents var actual = input.ToCleaned(); var expected = - new NamedContentData() + new ContentData() .AddField("field2", new ContentFieldData() .AddValue("en", 2)); @@ -35,33 +35,11 @@ namespace Squidex.Domain.Apps.Core.Model.Contents Assert.Equal(expected, actual); } - [Fact] - public void Should_remove_null_values_from_id_model_when_cleaning() - { - var input = - new IdContentData() - .AddField(1, null) - .AddField(2, - new ContentFieldData() - .AddValue("en", 2) - .AddValue("it", null)); - - var actual = input.ToCleaned(); - - var expected = - new IdContentData() - .AddField(2, - new ContentFieldData() - .AddValue("en", 2)); - - Assert.Equal(expected, actual); - } - [Fact] public void Should_return_same_content_if_merging_same_references() { var source = - new NamedContentData() + new ContentData() .AddField("field1", new ContentFieldData() .AddValue("iv", 1)) @@ -78,7 +56,7 @@ namespace Squidex.Domain.Apps.Core.Model.Contents public void Should_merge_two_name_models() { var lhs = - new NamedContentData() + new ContentData() .AddField("field1", new ContentFieldData() .AddValue("iv", 1)) @@ -88,7 +66,7 @@ namespace Squidex.Domain.Apps.Core.Model.Contents .AddValue("it", 2)); var rhs = - new NamedContentData() + new ContentData() .AddField("field2", new ContentFieldData() .AddValue("it", 3) @@ -98,7 +76,7 @@ namespace Squidex.Domain.Apps.Core.Model.Contents .AddValue("iv", 4)); var expected = - new NamedContentData() + new ContentData() .AddField("field1", new ContentFieldData() .AddValue("iv", 1)) @@ -118,55 +96,11 @@ namespace Squidex.Domain.Apps.Core.Model.Contents Assert.NotSame(expected, lhs); } - [Fact] - public void Should_merge_two_id_models() - { - var lhs = - new IdContentData() - .AddField(1, - new ContentFieldData() - .AddValue("iv", 1)) - .AddField(2, - new ContentFieldData() - .AddValue("de", 2) - .AddValue("it", 2)); - - var rhs = - new IdContentData() - .AddField(2, - new ContentFieldData() - .AddValue("it", 3) - .AddValue("en", 3)) - .AddField(3, - new ContentFieldData() - .AddValue("iv", 4)); - - var expected = - new IdContentData() - .AddField(1, - new ContentFieldData() - .AddValue("iv", 1)) - .AddField(2, - new ContentFieldData() - .AddValue("it", 2) - .AddValue("de", 2) - .AddValue("en", 3)) - .AddField(3, - new ContentFieldData() - .AddValue("iv", 4)); - - var actual = lhs.MergeInto(rhs); - - Assert.Equal(expected, actual); - Assert.NotSame(expected, rhs); - Assert.NotSame(expected, lhs); - } - [Fact] public void Should_be_equal_when_data_have_same_structure() { var lhs = - new NamedContentData() + new ContentData() .AddField("field1", new ContentFieldData() .AddValue("iv", 2)) @@ -175,7 +109,7 @@ namespace Squidex.Domain.Apps.Core.Model.Contents .AddValue("iv", 2)); var rhs = - new NamedContentData() + new ContentData() .AddField("field1", new ContentFieldData() .AddValue("iv", 2)) @@ -192,7 +126,7 @@ namespace Squidex.Domain.Apps.Core.Model.Contents public void Should_not_be_equal_when_data_have_not_same_structure() { var lhs = - new NamedContentData() + new ContentData() .AddField("field1", new ContentFieldData() .AddValue("iv", 2)) @@ -201,7 +135,7 @@ namespace Squidex.Domain.Apps.Core.Model.Contents .AddValue("iv", 2)); var rhs = - new NamedContentData() + new ContentData() .AddField("field1", new ContentFieldData() .AddValue("en", 2)) @@ -233,7 +167,7 @@ namespace Squidex.Domain.Apps.Core.Model.Contents [Fact] public void Should_clone_named_value_and_also_children() { - var source = new NamedContentData + var source = new ContentData { ["field1"] = new ContentFieldData(), ["field2"] = new ContentFieldData() diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/ContentConversionFlatTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/ContentConversionFlatTests.cs index f0b061c45..e49a80a4d 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/ContentConversionFlatTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/ContentConversionFlatTests.cs @@ -16,8 +16,8 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent { public class ContentConversionFlatTests { - private readonly NamedContentData source = - new NamedContentData() + private readonly ContentData source = + new ContentData() .AddField("field1", new ContentFieldData() .AddValue("de", 1) diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/ContentConversionTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/ContentConversionTests.cs index d253f2a8d..c68dc363a 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/ContentConversionTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/ContentConversionTests.cs @@ -8,7 +8,6 @@ using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.ConvertContent; using Squidex.Domain.Apps.Core.Schemas; -using Squidex.Infrastructure.Json.Objects; using Xunit; namespace Squidex.Domain.Apps.Core.Operations.ConvertContent @@ -35,54 +34,11 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent .UpdateField(3, f => f.Hide()); } - [Fact] - public void Should_convert_name_to_id() - { - var input = - new NamedContentData() - .AddField("field1", - new ContentFieldData() - .AddValue("en", "EN")) - .AddField("field2", - new ContentFieldData() - .AddValue("iv", 1)) - .AddField("array", - new ContentFieldData() - .AddValue("iv", - JsonValue.Array( - JsonValue.Object() - .Add("nested1", 100) - .Add("nested2", 200) - .Add("invalid", 300)))) - .AddField("invalid", - new ContentFieldData() - .AddValue("iv", 2)); - - var hideRoot = FieldConverters.ExcludeHidden; - var hideNested = FieldConverters.ForValues(ValueConverters.ForNested(ValueConverters.ExcludeHidden)); - - var actual = input.ConvertName2IdCloned(schema, hideRoot, hideNested); - - var expected = - new IdContentData() - .AddField(1, - new ContentFieldData() - .AddValue("en", "EN")) - .AddField(7, - new ContentFieldData() - .AddValue("iv", - JsonValue.Array( - JsonValue.Object() - .Add("72", 200)))); - - Assert.Equal(expected, actual); - } - [Fact] public void Should_convert_name_to_name() { var input = - new NamedContentData() + new ContentData() .AddField("field1", new ContentFieldData() .AddValue("en", "EN")) @@ -93,10 +49,10 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent new ContentFieldData() .AddValue("iv", 2)); - var actual = input.ConvertName2Name(schema, (data, field) => field.Name == "field2" ? null : data); + var actual = input.Convert(schema, (data, field) => field.Name == "field2" ? null : data); var expected = - new NamedContentData() + new ContentData() .AddField("field1", new ContentFieldData() .AddValue("en", "EN")); @@ -104,49 +60,6 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent Assert.Equal(expected, actual); } - [Fact] - public void Should_convert_id_to_name() - { - var input = - new IdContentData() - .AddField(1, - new ContentFieldData() - .AddValue("en", "EN")) - .AddField(2, - new ContentFieldData() - .AddValue("iv", 1)) - .AddField(7, - new ContentFieldData() - .AddValue("iv", - JsonValue.Array( - JsonValue.Object() - .Add("71", 100) - .Add("72", 200) - .Add("799", 300)))) - .AddField(99, - new ContentFieldData() - .AddValue("iv", 2)); - - var hideRoot = FieldConverters.ExcludeHidden; - var hideNested = FieldConverters.ForValues(ValueConverters.ForNested(ValueConverters.ExcludeHidden)); - - var actual = input.ConvertId2Name(schema, hideRoot, hideNested); - - var expected = - new NamedContentData() - .AddField("field1", - new ContentFieldData() - .AddValue("en", "EN")) - .AddField("array", - new ContentFieldData() - .AddValue("iv", - JsonValue.Array( - JsonValue.Object() - .Add("nested2", 200)))); - - Assert.Equal(expected, actual); - } - [Fact] public void Should_be_equal_fields_when_they_have_same_value() { diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/FieldConvertersTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/FieldConvertersTests.cs index f93d48086..6eb98ddb5 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/FieldConvertersTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/FieldConvertersTests.cs @@ -37,24 +37,6 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent Assert.Equal(expected, result); } - [Fact] - public void Should_convert_for_value_conversion() - { - var field = Fields.Json(1, "json", Partitioning.Invariant); - - var source = - new ContentFieldData() - .AddJsonValue(JsonValue.Object()); - - var result = FieldConverters.ForValues(ValueConverters.EncodeJson(TestUtils.DefaultSerializer))(source, field); - - var expected = - new ContentFieldData() - .AddValue("iv", "e30="); - - Assert.Equal(expected, result); - } - [Fact] public void Should_return_same_values_when_excluding_changed_types_if_all_values_are_valid() { diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/ValueConvertersTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/ValueConvertersTests.cs index cc4d30983..032655651 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/ValueConvertersTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/ValueConvertersTests.cs @@ -21,9 +21,12 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent private readonly NamedId appId = NamedId.Of(DomainId.NewGuid(), "my-app"); private readonly DomainId id1 = DomainId.NewGuid(); private readonly DomainId id2 = DomainId.NewGuid(); - private readonly RootField stringField = Fields.String(1, "1", Partitioning.Invariant); - private readonly RootField jsonField = Fields.Json(1, "1", Partitioning.Invariant); - private readonly RootField numberField = Fields.Number(1, "1", Partitioning.Invariant); + + private readonly RootField stringField + = Fields.String(1, "1", Partitioning.Invariant); + + private readonly RootField numberField + = Fields.Number(1, "1", Partitioning.Invariant); public ValueConvertersTests() { @@ -31,66 +34,6 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent .ReturnsLazily(ctx => $"url/to/{ctx.GetArgument(1)}"); } - [Fact] - public void Should_encode_json_value() - { - var source = JsonValue.Object(); - - var result = ValueConverters.EncodeJson(TestUtils.DefaultSerializer)(source, jsonField); - - Assert.Equal(JsonValue.Create("e30="), result); - } - - [Fact] - public void Should_return_same_value_if_encoding_null_value() - { - var source = JsonValue.Null; - - var result = ValueConverters.EncodeJson(TestUtils.DefaultSerializer)(source, jsonField); - - Assert.Same(source, result); - } - - [Fact] - public void Should_return_same_value_if_encoding_non_json_field() - { - var source = JsonValue.Create("NO-JSON"); - - var result = ValueConverters.EncodeJson(TestUtils.DefaultSerializer)(source, stringField); - - Assert.Same(source, result); - } - - [Fact] - public void Should_decode_json_values() - { - var source = JsonValue.Create("e30="); - - var result = ValueConverters.DecodeJson(TestUtils.DefaultSerializer)(source, jsonField); - - Assert.Equal(JsonValue.Object(), result); - } - - [Fact] - public void Should_return_same_value_if_decoding_null_value() - { - var source = JsonValue.Null; - - var result = ValueConverters.DecodeJson(TestUtils.DefaultSerializer)(source, jsonField); - - Assert.Same(source, result); - } - - [Fact] - public void Should_return_same_value_if_decoding_non_json_field() - { - var source = JsonValue.Null; - - var result = ValueConverters.EncodeJson(TestUtils.DefaultSerializer)(source, stringField); - - Assert.Same(source, result); - } - [Fact] public void Should_return_null_if_field_hidden() { diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/DefaultValues/DefaultValuesTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/DefaultValues/DefaultValuesTests.cs index 6783bdb2c..678ce3afa 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/DefaultValues/DefaultValuesTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/DefaultValues/DefaultValuesTests.cs @@ -41,7 +41,7 @@ namespace Squidex.Domain.Apps.Core.Operations.DefaultValues public void Should_enrich_with_default_values() { var data = - new NamedContentData() + new ContentData() .AddField("my-string", new ContentFieldData() .AddValue("de", "de-string")) @@ -65,7 +65,7 @@ namespace Squidex.Domain.Apps.Core.Operations.DefaultValues public void Should_also_enrich_with_default_values_when_string_is_empty() { var data = - new NamedContentData() + new ContentData() .AddField("my-string", new ContentFieldData() .AddValue("de", string.Empty)) diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ExtractReferenceIds/ReferenceExtractionTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ExtractReferenceIds/ReferenceExtractionTests.cs index b1f874bcf..8fc429a61 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ExtractReferenceIds/ReferenceExtractionTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ExtractReferenceIds/ReferenceExtractionTests.cs @@ -38,7 +38,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ExtractReferenceIds var id2 = DomainId.NewGuid(); var input = - new NamedContentData() + new ContentData() .AddField("assets", new ContentFieldData() .AddJsonValue(JsonValue.Array(id1.ToString(), id2.ToString()))); @@ -57,7 +57,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ExtractReferenceIds var id2 = DomainId.NewGuid(); var input = - new NamedContentData() + new ContentData() .AddField("assets", new ContentFieldData() .AddJsonValue(JsonValue.Array(id1.ToString(), id2.ToString()))); @@ -76,7 +76,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ExtractReferenceIds var id2 = DomainId.NewGuid(); var source = - new NamedContentData() + new ContentData() .AddField("references", new ContentFieldData() .AddJsonValue(JsonValue.Array(id1, id2))) @@ -91,7 +91,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ExtractReferenceIds .Add("nested", JsonValue.Array(id1, id2))))); var expected = - new NamedContentData() + new ContentData() .AddField("references", new ContentFieldData() .AddJsonValue(JsonValue.Array(id2))) @@ -110,7 +110,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ExtractReferenceIds var converter = FieldConverters.ForValues(cleaner, cleanNested); - var actual = source.ConvertName2Name(schema, converter); + var actual = source.Convert(schema, converter); Assert.Equal(expected, actual); } diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ExtractReferenceIds/ReferenceFormattingTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ExtractReferenceIds/ReferenceFormattingTests.cs index 73d523fdb..1726400fb 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ExtractReferenceIds/ReferenceFormattingTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ExtractReferenceIds/ReferenceFormattingTests.cs @@ -63,7 +63,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ExtractReferenceIds [Fact] public void Should_return_default_value_if_no_value_found() { - var data = new NamedContentData(); + var data = new ContentData(); var schema = CreateNoRefSchema(); @@ -85,9 +85,9 @@ namespace Squidex.Domain.Apps.Core.Operations.ExtractReferenceIds .AddString(3, "non-ref", Partitioning.Invariant); } - private static NamedContentData CreateData() + private static ContentData CreateData() { - return new NamedContentData() + return new ContentData() .AddField("ref1", new ContentFieldData() .AddValue("en", "EN") diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterCompareTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterCompareTests.cs index 8969ae945..63b229c4a 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterCompareTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterCompareTests.cs @@ -508,7 +508,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules var @event = new EnrichedContentEvent { Data = - new NamedContentData() + new ContentData() .AddField("country", new ContentFieldData() .AddValue("zh-TW", "Berlin")) @@ -531,7 +531,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules var @event = new EnrichedContentEvent { Data = - new NamedContentData() + new ContentData() .AddField("city", new ContentFieldData() .AddValue("iv", "Berlin")) @@ -554,7 +554,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules var @event = new EnrichedContentEvent { Data = - new NamedContentData() + new ContentData() .AddField("city", new ContentFieldData() .AddValue("iv", "Berlin")) @@ -577,7 +577,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules var @event = new EnrichedContentEvent { Data = - new NamedContentData() + new ContentData() .AddField("city", new ContentFieldData() .AddJsonValue(JsonValue.Array())) @@ -600,7 +600,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules var @event = new EnrichedContentEvent { Data = - new NamedContentData() + new ContentData() .AddField("city", new ContentFieldData() .AddJsonValue(JsonValue.Object().Add("name", "Berlin"))) @@ -623,7 +623,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules var @event = new EnrichedContentEvent { Data = - new NamedContentData() + new ContentData() .AddField("city", new ContentFieldData() .AddValue("iv", "Berlin")) @@ -646,7 +646,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules var @event = new EnrichedContentEvent { Data = - new NamedContentData() + new ContentData() .AddField("city", new ContentFieldData() .AddJsonValue(JsonValue.Array("Berlin"))) @@ -669,7 +669,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules var @event = new EnrichedContentEvent { Data = - new NamedContentData() + new ContentData() .AddField("city", new ContentFieldData() .AddJsonValue(JsonValue.Object().Add("name", "Berlin"))) @@ -692,7 +692,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules var @event = new EnrichedContentEvent { Data = - new NamedContentData() + new ContentData() .AddField("city", new ContentFieldData() .AddJsonValue(JsonValue.Object().Add("name", "Berlin"))) @@ -715,7 +715,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules var @event = new EnrichedContentEvent { Data = - new NamedContentData() + new ContentData() .AddField("city", new ContentFieldData() .AddJsonValue(JsonValue.Array(1, 2, 3))) @@ -738,7 +738,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules var @event = new EnrichedContentEvent { Data = - new NamedContentData() + new ContentData() .AddField("city", new ContentFieldData() .AddJsonValue(JsonValue.Object().Add("name", "Berlin"))) @@ -792,7 +792,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules var @event = new EnrichedContentEvent { Data = - new NamedContentData() + new ContentData() .AddField("time", new ContentFieldData() .AddValue(JsonValue.Create("2020-06-01T10:10:20Z"))) diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterTests.cs index 9fbe977a5..7f56ddfa5 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterTests.cs @@ -146,7 +146,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules var @event = new EnrichedContentEvent { Data = - new NamedContentData() + new ContentData() .AddField("city", new ContentFieldData() .AddJsonValue(JsonValue.Array())) @@ -285,7 +285,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules var @event = new EnrichedContentEvent { Data = - new NamedContentData() + new ContentData() .AddField("categories", new ContentFieldData() .AddJsonValue(JsonValue.Array("ref1", "ref2", "ref3"))) diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/ContentDataObjectTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/ContentDataObjectTests.cs index f9dd981fe..1ced9dcfb 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/ContentDataObjectTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/ContentDataObjectTests.cs @@ -19,10 +19,10 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting [Fact] public void Should_update_data_when_setting_field() { - var original = new NamedContentData(); + var original = new ContentData(); var expected = - new NamedContentData() + new ContentData() .AddField("number", new ContentFieldData() .AddValue("iv", 1.0)); @@ -35,10 +35,10 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting [Fact] public void Should_update_data_when_setting_lazy_field() { - var original = new NamedContentData(); + var original = new ContentData(); var expected = - new NamedContentData() + new ContentData() .AddField("number", new ContentFieldData() .AddValue("iv", 1.0)); @@ -51,10 +51,10 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting [Fact] public void Should_update_data_defining_property_for_content() { - var original = new NamedContentData(); + var original = new ContentData(); var expected = - new NamedContentData() + new ContentData() .AddField("number", new ContentFieldData() .AddValue("iv", 1.0)); @@ -67,7 +67,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting [Fact] public void Should_throw_exception_when_assigning_non_object_as_field() { - var original = new NamedContentData(); + var original = new ContentData(); Assert.Throws(() => ExecuteScript(original, @"data.number = 1")); } @@ -76,12 +76,12 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting public void Should_update_data_when_deleting_field() { var original = - new NamedContentData() + new ContentData() .AddField("number", new ContentFieldData() .AddValue("iv", 1.0)); - var expected = new NamedContentData(); + var expected = new ContentData(); var result = ExecuteScript(original, @"delete data.number"); @@ -92,13 +92,13 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting public void Should_update_data_when_setting_field_value_with_string() { var original = - new NamedContentData() + new ContentData() .AddField("string", new ContentFieldData() .AddValue("iv", "1")); var expected = - new NamedContentData() + new ContentData() .AddField("string", new ContentFieldData() .AddValue("iv", "1new")); @@ -112,13 +112,13 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting public void Should_update_data_when_setting_field_value_with_number() { var original = - new NamedContentData() + new ContentData() .AddField("number", new ContentFieldData() .AddValue("iv", 1.0)); var expected = - new NamedContentData() + new ContentData() .AddField("number", new ContentFieldData() .AddValue("iv", 3.0)); @@ -132,13 +132,13 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting public void Should_update_data_when_setting_field_value_with_boolean() { var original = - new NamedContentData() + new ContentData() .AddField("boolean", new ContentFieldData() .AddValue("iv", false)); var expected = - new NamedContentData() + new ContentData() .AddField("boolean", new ContentFieldData() .AddValue("iv", true)); @@ -152,13 +152,13 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting public void Should_update_data_when_setting_field_value_with_array() { var original = - new NamedContentData() + new ContentData() .AddField("number", new ContentFieldData() .AddJsonValue(JsonValue.Array(1.0, 2.0))); var expected = - new NamedContentData() + new ContentData() .AddField("number", new ContentFieldData() .AddJsonValue(JsonValue.Array(1.0, 4.0, 5.0))); @@ -172,13 +172,13 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting public void Should_update_data_when_setting_field_value_with_object() { var original = - new NamedContentData() + new ContentData() .AddField("number", new ContentFieldData() .AddJsonValue(JsonValue.Object().Add("lat", 1.0))); var expected = - new NamedContentData() + new ContentData() .AddField("number", new ContentFieldData() .AddJsonValue(JsonValue.Object().Add("lat", 1.0).Add("lon", 4.0))); @@ -192,12 +192,12 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting public void Should_throw_when_defining_property_for_field() { var original = - new NamedContentData() + new ContentData() .AddField("number", new ContentFieldData()); var expected = - new NamedContentData() + new ContentData() .AddField("number", new ContentFieldData() .AddValue("iv", 1.0)); @@ -211,13 +211,13 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting public void Should_update_data_when_deleting_field_value() { var original = - new NamedContentData() + new ContentData() .AddField("string", new ContentFieldData() .AddValue("iv", "hello")); var expected = - new NamedContentData() + new ContentData() .AddField("string", new ContentFieldData()); @@ -230,7 +230,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting public void Should_be_able_to_iterate_over_fields() { var content = - new NamedContentData() + new ContentData() .AddField("f1", new ContentFieldData() .AddValue("v11", "1") @@ -262,7 +262,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting public void Should_throw_exceptions_when_changing_objects() { var original = - new NamedContentData() + new ContentData() .AddField("obj", new ContentFieldData() .AddJsonValue(JsonValue.Object().Add("readonly", 1))); @@ -275,7 +275,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting public void Should_not_throw_exceptions_when_changing_arrays() { var original = - new NamedContentData() + new ContentData() .AddField("obj", new ContentFieldData() .AddJsonValue(JsonValue.Array())); @@ -286,10 +286,10 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting [Fact] public void Should_null_propagate_unknown_fields() { - ExecuteScript(new NamedContentData(), @"data.string.iv = 'hello'"); + ExecuteScript(new ContentData(), @"data.string.iv = 'hello'"); } - private static NamedContentData ExecuteScript(NamedContentData original, string script) + private static ContentData ExecuteScript(ContentData original, string script) { var engine = new Engine(o => o.Strict()); diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineTests.cs index 3142f9937..3bd8d60e3 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineTests.cs @@ -86,7 +86,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting [Fact] public async Task TransformAsync_should_return_original_content_when_script_failed() { - var content = new NamedContentData(); + var content = new ContentData(); var context = new ScriptVars { Data = content }; const string script = @" @@ -102,7 +102,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting public async Task TransformAsync_should_transform_content() { var content = - new NamedContentData() + new ContentData() .AddField("number0", new ContentFieldData() .AddValue("iv", 1.0)) @@ -110,7 +110,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting new ContentFieldData() .AddValue("iv", 1.0)); var expected = - new NamedContentData() + new ContentData() .AddField("number1", new ContentFieldData() .AddValue("iv", 2.0)) @@ -149,7 +149,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting [Fact] public async Task TransformAsync_should_throw_when_script_failed() { - var content = new NamedContentData(); + var content = new ContentData(); var context = new ScriptVars { Data = content }; const string script = @" @@ -162,7 +162,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting [Fact] public async Task TransformAsync_should_return_original_content_when_not_replaced() { - var content = new NamedContentData(); + var content = new ContentData(); var context = new ScriptVars { Data = content }; const string script = @" @@ -177,7 +177,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting [Fact] public async Task TransformAsync_should_return_original_content_when_not_replaced_async() { - var content = new NamedContentData(); + var content = new ContentData(); var context = new ScriptVars { Data = content }; const string script = @" @@ -198,10 +198,10 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting [Fact] public async Task TransformAsync_should_transform_object() { - var content = new NamedContentData(); + var content = new ContentData(); var expected = - new NamedContentData() + new ContentData() .AddField("operation", new ContentFieldData() .AddValue("iv", "MyOperation")); @@ -224,10 +224,10 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting [Fact] public async Task TransformAsync_should_transform_object_async() { - var content = new NamedContentData(); + var content = new ContentData(); var expected = - new NamedContentData() + new ContentData() .AddField("operation", new ContentFieldData() .AddValue("iv", 42)); @@ -255,7 +255,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting [Fact] public async Task TransformAsync_should_not_ignore_transformation_when_async_not_set() { - var content = new NamedContentData(); + var content = new ContentData(); var context = new ScriptVars { Data = content, Operation = "MyOperation" }; const string script = @" @@ -277,7 +277,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting [Fact] public async Task TransformAsync_should_timeout_when_replace_never_called() { - var content = new NamedContentData(); + var content = new ContentData(); var context = new ScriptVars { Data = content, Operation = "MyOperation" }; const string script = @" @@ -298,7 +298,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting public async Task TransformAsync_should_transform_content_and_return_with_execute_transform() { var content = - new NamedContentData() + new ContentData() .AddField("number0", new ContentFieldData() .AddValue("iv", 1.0)) @@ -306,7 +306,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting new ContentFieldData() .AddValue("iv", 1.0)); var expected = - new NamedContentData() + new ContentData() .AddField("number1", new ContentFieldData() .AddValue("iv", 2.0)) @@ -336,19 +336,19 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting public async Task TransformAsync_should_transform_content_with_old_content() { var content = - new NamedContentData() + new ContentData() .AddField("number0", new ContentFieldData() .AddValue("iv", 3.0)); var oldContent = - new NamedContentData() + new ContentData() .AddField("number0", new ContentFieldData() .AddValue("iv", 5.0)); var expected = - new NamedContentData() + new ContentData() .AddField("number0", new ContentFieldData() .AddValue("iv", 13.0)); diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Tags/TagNormalizerTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Tags/TagNormalizerTests.cs index 72e1df2fb..892ce741f 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Tags/TagNormalizerTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Tags/TagNormalizerTests.cs @@ -102,7 +102,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Tags Assert.Equal(JsonValue.Array("name4"), GetNestedTags(newData)); } - private static IJsonValue GetNestedTags(NamedContentData newData) + private static IJsonValue GetNestedTags(ContentData newData) { var array = (JsonArray)newData["array"]!["iv"]; var arrayItem = (JsonObject)array[0]; @@ -110,9 +110,9 @@ namespace Squidex.Domain.Apps.Core.Operations.Tags return arrayItem["nestedTags2"]; } - private static NamedContentData GenerateData(string prefix) + private static ContentData GenerateData(string prefix) { - return new NamedContentData() + return new ContentData() .AddField("tags1", new ContentFieldData() .AddJsonValue(JsonValue.Array($"{prefix}1"))) diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Templates/FluidTemplateEngineTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Templates/FluidTemplateEngineTests.cs index cbd5961a1..b428b85d5 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Templates/FluidTemplateEngineTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Templates/FluidTemplateEngineTests.cs @@ -104,7 +104,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Templates var value = new { Data = - new NamedContentData() + new ContentData() .AddField("value", new ContentFieldData() .AddValue("en", "Hello")) diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/ContentValidationTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/ContentValidationTests.cs index 0a7273c4d..926579c77 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/ContentValidationTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/ContentValidationTests.cs @@ -46,7 +46,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent new NumberFieldProperties()); var data = - new NamedContentData() + new ContentData() .AddField("my-field", new ContentFieldData() .AddValue("iv", 1000)); @@ -77,7 +77,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent new NumberFieldProperties()); var data = - new NamedContentData() + new ContentData() .AddField("my-field", new ContentFieldData() .AddValue("iv", 1000)); @@ -95,7 +95,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent public async Task Should_add_error_if_validating_data_with_unknown_field() { var data = - new NamedContentData() + new ContentData() .AddField("unknown", new ContentFieldData()); @@ -115,7 +115,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent new NumberFieldProperties { MaxValue = 100 }); var data = - new NamedContentData() + new ContentData() .AddField("my-field", new ContentFieldData() .AddValue("iv", 1000)); @@ -135,7 +135,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent schema = schema.AddNumber(1, "my-field", Partitioning.Invariant); var data = - new NamedContentData() + new ContentData() .AddField("my-field", new ContentFieldData() .AddValue("es", 1) @@ -158,7 +158,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent new NumberFieldProperties { IsRequired = true }); var data = - new NamedContentData(); + new ContentData(); await data.ValidateAsync(languagesConfig.ToResolver(), errors, schema); @@ -177,7 +177,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent new NumberFieldProperties { IsRequired = true }); var data = - new NamedContentData(); + new ContentData(); await data.ValidateAsync(languagesConfig.ToResolver(), errors, schema); @@ -195,7 +195,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent new StringFieldProperties { IsRequired = true }); var data = - new NamedContentData(); + new ContentData(); await data.ValidateAsync(languagesConfig.ToResolver(), errors, schema); @@ -212,7 +212,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent schema = schema.AddNumber(1, "my-field", Partitioning.Language); var data = - new NamedContentData() + new ContentData() .AddField("my-field", new ContentFieldData() .AddValue("de", 1) @@ -240,7 +240,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent new StringFieldProperties { IsRequired = true }); var data = - new NamedContentData() + new ContentData() .AddField("my-field", new ContentFieldData() .AddValue("es", "value")); @@ -256,7 +256,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent schema = schema.AddNumber(1, "my-field", Partitioning.Language); var data = - new NamedContentData() + new ContentData() .AddField("my-field", new ContentFieldData() .AddValue("es", 1) @@ -276,7 +276,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent public async Task Should_add_error_if_validating_partial_data_with_unknown_field() { var data = - new NamedContentData() + new ContentData() .AddField("unknown", new ContentFieldData()); @@ -296,7 +296,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent new NumberFieldProperties { MaxValue = 100 }); var data = - new NamedContentData() + new ContentData() .AddField("my-field", new ContentFieldData() .AddValue("iv", 1000)); @@ -316,7 +316,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent schema = schema.AddNumber(1, "my-field", Partitioning.Invariant); var data = - new NamedContentData() + new ContentData() .AddField("my-field", new ContentFieldData() .AddValue("es", 1) @@ -339,7 +339,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent new NumberFieldProperties { IsRequired = true }); var data = - new NamedContentData(); + new ContentData(); await data.ValidatePartialAsync(languagesConfig.ToResolver(), errors, schema); @@ -353,7 +353,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent new NumberFieldProperties { IsRequired = true }); var data = - new NamedContentData(); + new ContentData(); await data.ValidatePartialAsync(languagesConfig.ToResolver(), errors, schema); @@ -366,7 +366,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent schema = schema.AddNumber(1, "my-field", Partitioning.Language); var data = - new NamedContentData() + new ContentData() .AddField("my-field", new ContentFieldData() .AddValue("de", 1) @@ -387,7 +387,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent schema = schema.AddNumber(1, "my-field", Partitioning.Language); var data = - new NamedContentData() + new ContentData() .AddField("my-field", new ContentFieldData() .AddValue("es", 1) @@ -410,7 +410,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent AddNumber(2, "my-nested", new NumberFieldProperties { IsRequired = true })); var data = - new NamedContentData() + new ContentData() .AddField("my-field", new ContentFieldData() .AddJsonValue( @@ -435,7 +435,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent schema = schema.AddUI(2, "ui", Partitioning.Invariant); var data = - new NamedContentData(); + new ContentData(); await data.ValidateAsync(languagesConfig.ToResolver(), errors, schema); @@ -449,7 +449,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent AddUI(2, "my-nested")); var data = - new NamedContentData() + new ContentData() .AddField("my-field", new ContentFieldData() .AddJsonValue( diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/TagsFieldTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/TagsFieldTests.cs index 920d8d65b..2b7ba6740 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/TagsFieldTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/TagsFieldTests.cs @@ -89,7 +89,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent await sut.ValidateAsync(JsonValue.Array(JsonValue.Null), errors); errors.Should().BeEquivalentTo( - new[] { "[1]: Field is required." }); + new[] { "Invalid json type, expected array of strings." }); } [Fact] @@ -100,7 +100,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent await sut.ValidateAsync(CreateValue(string.Empty), errors); errors.Should().BeEquivalentTo( - new[] { "[1]: Field is required." }); + new[] { "Invalid json type, expected array of strings." }); } [Fact] diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/UIFieldTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/UIFieldTests.cs index 35b9892bb..d85a61955 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/UIFieldTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/UIFieldTests.cs @@ -71,7 +71,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent .AddUI(2, "my-ui2", Partitioning.Invariant); var data = - new NamedContentData() + new ContentData() .AddField("my-ui1", new ContentFieldData()) .AddField("my-ui2", new ContentFieldData() .AddValue("iv", null)); @@ -97,7 +97,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent .AddUI(101, "my-ui")); var data = - new NamedContentData() + new ContentData() .AddField("my-array", new ContentFieldData() .AddJsonValue( JsonValue.Array( diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/ValidationTestExtensions.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/ValidationTestExtensions.cs index 809e364e4..8cb00294f 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/ValidationTestExtensions.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/ValidationTestExtensions.cs @@ -56,7 +56,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent .ValidateAsync(value, context, CreateFormatter(errors)); } - public static async Task ValidatePartialAsync(this NamedContentData data, PartitionResolver partitionResolver, IList errors, + public static async Task ValidatePartialAsync(this ContentData data, PartitionResolver partitionResolver, IList errors, Schema? schema = null, ValidationMode mode = ValidationMode.Default, ValidationUpdater? updater = null, @@ -75,7 +75,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent } } - public static async Task ValidateAsync(this NamedContentData data, PartitionResolver partitionResolver, IList errors, + public static async Task ValidateAsync(this ContentData data, PartitionResolver partitionResolver, IList errors, Schema? schema = null, ValidationMode mode = ValidationMode.Default, ValidationUpdater? updater = null, diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Assets/MongoDb/MongoDbQueryTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Assets/MongoDb/MongoDbQueryTests.cs index 23e52cc54..1ef2ca530 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Assets/MongoDb/MongoDbQueryTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Assets/MongoDb/MongoDbQueryTests.cs @@ -20,6 +20,9 @@ using Xunit; using ClrFilter = Squidex.Infrastructure.Queries.ClrFilter; using SortBuilder = Squidex.Infrastructure.Queries.SortBuilder; +#pragma warning disable SA1300 // Element should begin with upper-case letter +#pragma warning disable IDE1006 // Naming Styles + namespace Squidex.Domain.Apps.Entities.Assets.MongoDb { public class MongoDbQueryTests @@ -37,14 +40,14 @@ namespace Squidex.Domain.Apps.Entities.Assets.MongoDb [Fact] public void Should_throw_exception_for_full_text_search() { - Assert.Throws(() => Q(new ClrQuery { FullText = "Full Text" })); + Assert.Throws(() => _Q(new ClrQuery { FullText = "Full Text" })); } [Fact] public void Should_make_query_with_lastModified() { - var i = F(ClrFilter.Eq("lastModified", InstantPattern.General.Parse("1988-01-19T12:00:00Z").Value)); - var o = C("{ 'mt' : ISODate('1988-01-19T12:00:00Z') }"); + var i = _F(ClrFilter.Eq("lastModified", InstantPattern.General.Parse("1988-01-19T12:00:00Z").Value)); + var o = _C("{ 'mt' : ISODate('1988-01-19T12:00:00Z') }"); Assert.Equal(o, i); } @@ -52,8 +55,8 @@ namespace Squidex.Domain.Apps.Entities.Assets.MongoDb [Fact] public void Should_make_query_with_lastModifiedBy() { - var i = F(ClrFilter.Eq("lastModifiedBy", "Me")); - var o = C("{ 'mb' : 'Me' }"); + var i = _F(ClrFilter.Eq("lastModifiedBy", "Me")); + var o = _C("{ 'mb' : 'Me' }"); Assert.Equal(o, i); } @@ -61,8 +64,8 @@ namespace Squidex.Domain.Apps.Entities.Assets.MongoDb [Fact] public void Should_make_query_with_created() { - var i = F(ClrFilter.Eq("created", InstantPattern.General.Parse("1988-01-19T12:00:00Z").Value)); - var o = C("{ 'ct' : ISODate('1988-01-19T12:00:00Z') }"); + var i = _F(ClrFilter.Eq("created", InstantPattern.General.Parse("1988-01-19T12:00:00Z").Value)); + var o = _C("{ 'ct' : ISODate('1988-01-19T12:00:00Z') }"); Assert.Equal(o, i); } @@ -70,8 +73,8 @@ namespace Squidex.Domain.Apps.Entities.Assets.MongoDb [Fact] public void Should_make_query_with_createdBy() { - var i = F(ClrFilter.Eq("createdBy", "Me")); - var o = C("{ 'cb' : 'Me' }"); + var i = _F(ClrFilter.Eq("createdBy", "Me")); + var o = _C("{ 'cb' : 'Me' }"); Assert.Equal(o, i); } @@ -79,8 +82,8 @@ namespace Squidex.Domain.Apps.Entities.Assets.MongoDb [Fact] public void Should_make_query_with_version() { - var i = F(ClrFilter.Eq("version", 0)); - var o = C("{ 'vs' : NumberLong(0) }"); + var i = _F(ClrFilter.Eq("version", 0)); + var o = _C("{ 'vs' : NumberLong(0) }"); Assert.Equal(o, i); } @@ -88,8 +91,8 @@ namespace Squidex.Domain.Apps.Entities.Assets.MongoDb [Fact] public void Should_make_query_with_fileVersion() { - var i = F(ClrFilter.Eq("fileVersion", 2)); - var o = C("{ 'fv' : NumberLong(2) }"); + var i = _F(ClrFilter.Eq("fileVersion", 2)); + var o = _C("{ 'fv' : NumberLong(2) }"); Assert.Equal(o, i); } @@ -97,8 +100,8 @@ namespace Squidex.Domain.Apps.Entities.Assets.MongoDb [Fact] public void Should_make_query_with_tags() { - var i = F(ClrFilter.Eq("tags", "tag1")); - var o = C("{ 'td' : 'tag1' }"); + var i = _F(ClrFilter.Eq("tags", "tag1")); + var o = _C("{ 'td' : 'tag1' }"); Assert.Equal(o, i); } @@ -106,8 +109,8 @@ namespace Squidex.Domain.Apps.Entities.Assets.MongoDb [Fact] public void Should_make_query_with_fileName() { - var i = F(ClrFilter.Eq("fileName", "Logo.png")); - var o = C("{ 'fn' : 'Logo.png' }"); + var i = _F(ClrFilter.Eq("fileName", "Logo.png")); + var o = _C("{ 'fn' : 'Logo.png' }"); Assert.Equal(o, i); } @@ -115,8 +118,8 @@ namespace Squidex.Domain.Apps.Entities.Assets.MongoDb [Fact] public void Should_make_query_with_mimeType() { - var i = F(ClrFilter.Eq("mimeType", "text/json")); - var o = C("{ 'mm' : 'text/json' }"); + var i = _F(ClrFilter.Eq("mimeType", "text/json")); + var o = _C("{ 'mm' : 'text/json' }"); Assert.Equal(o, i); } @@ -124,8 +127,8 @@ namespace Squidex.Domain.Apps.Entities.Assets.MongoDb [Fact] public void Should_make_query_with_fileSize() { - var i = F(ClrFilter.Eq("fileSize", 1024)); - var o = C("{ 'fs' : NumberLong(1024) }"); + var i = _F(ClrFilter.Eq("fileSize", 1024)); + var o = _C("{ 'fs' : NumberLong(1024) }"); Assert.Equal(o, i); } @@ -133,8 +136,8 @@ namespace Squidex.Domain.Apps.Entities.Assets.MongoDb [Fact] public void Should_make_query_with_pixelHeight() { - var i = F(ClrFilter.Eq("metadata.pixelHeight", 600)); - var o = C("{ 'md.pixelHeight' : 600 }"); + var i = _F(ClrFilter.Eq("metadata.pixelHeight", 600)); + var o = _C("{ 'md.pixelHeight' : 600 }"); Assert.Equal(o, i); } @@ -142,8 +145,8 @@ namespace Squidex.Domain.Apps.Entities.Assets.MongoDb [Fact] public void Should_make_query_with_pixelWidth() { - var i = F(ClrFilter.Eq("metadata.pixelWidth", 800)); - var o = C("{ 'md.pixelWidth' : 800 }"); + var i = _F(ClrFilter.Eq("metadata.pixelWidth", 800)); + var o = _C("{ 'md.pixelWidth' : 800 }"); Assert.Equal(o, i); } @@ -151,8 +154,8 @@ namespace Squidex.Domain.Apps.Entities.Assets.MongoDb [Fact] public void Should_make_orderby_with_single_field() { - var i = S(SortBuilder.Descending("lastModified")); - var o = C("{ 'mt' : -1 }"); + var i = _S(SortBuilder.Descending("lastModified")); + var o = _C("{ 'mt' : -1 }"); Assert.Equal(o, i); } @@ -160,8 +163,8 @@ namespace Squidex.Domain.Apps.Entities.Assets.MongoDb [Fact] public void Should_make_orderby_with_multiple_fields() { - var i = S(SortBuilder.Ascending("lastModified"), SortBuilder.Descending("lastModifiedBy")); - var o = C("{ 'mt' : 1, 'mb' : -1 }"); + var i = _S(SortBuilder.Ascending("lastModified"), SortBuilder.Descending("lastModifiedBy")); + var o = _C("{ 'mt' : 1, 'mb' : -1 }"); Assert.Equal(o, i); } @@ -190,17 +193,17 @@ namespace Squidex.Domain.Apps.Entities.Assets.MongoDb .MustHaveHappened(); } - private static string C(string value) + private static string _C(string value) { return value.Replace('\'', '"'); } - private static string F(FilterNode filter) + private static string _F(FilterNode filter) { - return Q(new ClrQuery { Filter = filter }); + return _Q(new ClrQuery { Filter = filter }); } - private static string S(params SortNode[] sorts) + private static string _S(params SortNode[] sorts) { var cursor = A.Fake>(); @@ -217,11 +220,11 @@ namespace Squidex.Domain.Apps.Entities.Assets.MongoDb return i; } - private static string Q(ClrQuery query) + private static string _Q(ClrQuery query) { - var rendered = - query.AdjustToModel().BuildFilter(false).Filter! - .Render(Serializer, Registry).ToString(); + var filter = query.AdjustToModel().BuildFilter(false).Filter!; + + var rendered = filter.Render(Serializer, Registry).ToString(); return rendered; } diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/BackupContentsTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/BackupContentsTests.cs index 5b8e233e9..064b63ade 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/BackupContentsTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/BackupContentsTests.cs @@ -99,7 +99,7 @@ namespace Squidex.Domain.Apps.Entities.Contents }); var data = - new NamedContentData() + new ContentData() .AddField("asset", new ContentFieldData() .AddValue("en", $"Asset: {oldAssetsUrlApp}/my-asset.jpg.") @@ -116,7 +116,7 @@ namespace Squidex.Domain.Apps.Entities.Contents .Add("asset", $"Asset: {oldAssetsUrlApp}/my-asset.jpg."))); var updateData = - new NamedContentData() + new ContentData() .AddField("asset", new ContentFieldData() .AddValue("en", $"Asset: {newAssetsUrlApp}/my-asset.jpg.") diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/BulkUpdateCommandMiddlewareTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/BulkUpdateCommandMiddlewareTests.cs index 722809ae9..34d789ada 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/BulkUpdateCommandMiddlewareTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/BulkUpdateCommandMiddlewareTests.cs @@ -457,7 +457,7 @@ namespace Squidex.Domain.Apps.Entities.Contents } private BulkUpdateContents BulkCommand(BulkUpdateType type, Query? query = null, - DomainId? id = null, NamedContentData? data = null, Instant? dueTime = null) + DomainId? id = null, ContentData? data = null, Instant? dueTime = null) { return new BulkUpdateContents { @@ -494,12 +494,12 @@ namespace Squidex.Domain.Apps.Entities.Contents return requestContext; } - private static (DomainId Id, NamedContentData Data, Query? Query) CreateTestData(bool withQuery) + private static (DomainId Id, ContentData Data, Query? Query) CreateTestData(bool withQuery) { Query? query = withQuery ? new Query() : null; var data = - new NamedContentData() + new ContentData() .AddField("value", new ContentFieldData() .AddJsonValue("iv", JsonValue.Create(1))); diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentChangedTriggerHandlerTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentChangedTriggerHandlerTests.cs index a4180af62..75e90730f 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentChangedTriggerHandlerTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentChangedTriggerHandlerTests.cs @@ -142,8 +142,8 @@ namespace Squidex.Domain.Apps.Entities.Contents var envelope = Envelope.Create(@event).SetEventStreamNumber(12); - var dataNow = new NamedContentData(); - var dataOld = new NamedContentData(); + var dataNow = new ContentData(); + var dataOld = new ContentData(); A.CallTo(() => contentLoader.GetAsync(appId.Id, @event.ContentId, 12)) .Returns(new ContentEntity { AppId = appId, SchemaId = schemaMatch, Version = 12, Data = dataNow, Id = @event.ContentId }); diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentsSearchSourceTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentsSearchSourceTests.cs index 6bc022208..822511fa6 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentsSearchSourceTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentsSearchSourceTests.cs @@ -65,7 +65,7 @@ namespace Squidex.Domain.Apps.Entities.Contents { Id = DomainId.NewGuid(), Data = - new NamedContentData() + new ContentData() .AddField("field1", new ContentFieldData() .AddJsonValue("iv", JsonValue.Create("hello"))) @@ -90,7 +90,7 @@ namespace Squidex.Domain.Apps.Entities.Contents { Id = DomainId.NewGuid(), Data = - new NamedContentData() + new ContentData() .AddField("field", new ContentFieldData() .AddJsonValue("iv", JsonValue.Create("hello"))), @@ -111,7 +111,7 @@ namespace Squidex.Domain.Apps.Entities.Contents { Id = DomainId.NewGuid(), Data = - new NamedContentData() + new ContentData() .AddField("field", new ContentFieldData() .AddJsonValue("en", JsonValue.Create("hello"))), @@ -132,12 +132,12 @@ namespace Squidex.Domain.Apps.Entities.Contents { Id = DomainId.NewGuid(), Data = - new NamedContentData() + new ContentData() .AddField("field", new ContentFieldData() .AddJsonValue("iv", JsonValue.Create("raw"))), ReferenceData = - new NamedContentData() + new ContentData() .AddField("field", new ContentFieldData() .AddJsonValue("en", JsonValue.Create("resolved"))), diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/DomainObject/ContentDomainObjectTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/DomainObject/ContentDomainObjectTests.cs index b35ca5602..7d21bd43d 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/DomainObject/ContentDomainObjectTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/DomainObject/ContentDomainObjectTests.cs @@ -39,33 +39,33 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject private readonly ISchemaEntity schema; private readonly IScriptEngine scriptEngine = A.Fake(); - private readonly NamedContentData invalidData = - new NamedContentData() + private readonly ContentData invalidData = + new ContentData() .AddField("my-field1", new ContentFieldData() .AddValue("iv", null)) .AddField("my-field2", new ContentFieldData() .AddValue("iv", 1)); - private readonly NamedContentData data = - new NamedContentData() + private readonly ContentData data = + new ContentData() .AddField("my-field1", new ContentFieldData() .AddValue("iv", 1)); - private readonly NamedContentData patch = - new NamedContentData() + private readonly ContentData patch = + new ContentData() .AddField("my-field2", new ContentFieldData() .AddValue("iv", 2)); - private readonly NamedContentData otherData = - new NamedContentData() + private readonly ContentData otherData = + new ContentData() .AddField("my-field1", new ContentFieldData() .AddValue("iv", 2)) .AddField("my-field2", new ContentFieldData() .AddValue("iv", 2)); - private readonly NamedContentData patched; + private readonly ContentData patched; private readonly ContentDomainObject sut; protected override DomainId Id @@ -724,12 +724,12 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject return PublishAsync(CreateContentCommand(new ChangeContentStatus { Status = Status.Published })); } - private ScriptVars ScriptContext(NamedContentData? newData, NamedContentData? oldData, Status newStatus) + private ScriptVars ScriptContext(ContentData? newData, ContentData? oldData, Status newStatus) { return A.That.Matches(x => M(x, newData, oldData, newStatus, default)); } - private ScriptVars ScriptContext(NamedContentData? newData, NamedContentData? oldData, Status newStatus, Status oldStatus) + private ScriptVars ScriptContext(ContentData? newData, ContentData? oldData, Status newStatus, Status oldStatus) { return A.That.Matches(x => M(x, newData, oldData, newStatus, oldStatus)); } @@ -739,7 +739,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject return A.That.Matches(x => x.CanDisallow && x.CanReject && x.AsContext); } - private bool M(ScriptVars x, NamedContentData? newData, NamedContentData? oldData, Status newStatus, Status oldStatus) + private bool M(ScriptVars x, ContentData? newData, ContentData? oldData, Status newStatus, Status oldStatus) { return Equals(x.Data, newData) && diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/DomainObject/Guards/GuardContentTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/DomainObject/Guards/GuardContentTests.cs index d02dc567d..c5c6b70ac 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/DomainObject/Guards/GuardContentTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/DomainObject/Guards/GuardContentTests.cs @@ -46,7 +46,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject.Guards { var schema = CreateSchema(true); - var command = new CreateContent { Data = new NamedContentData() }; + var command = new CreateContent { Data = new ContentData() }; await Assert.ThrowsAsync(() => GuardContent.CanCreate(command, contentWorkflow, schema)); } @@ -56,7 +56,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject.Guards { var schema = CreateSchema(true); - var command = new CreateContent { Data = new NamedContentData(), ContentId = schema.Id }; + var command = new CreateContent { Data = new ContentData(), ContentId = schema.Id }; await GuardContent.CanCreate(command, contentWorkflow, schema); } @@ -68,7 +68,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject.Guards SetupCanCreatePublish(schema, false); - var command = new CreateContent { Data = new NamedContentData(), Publish = true }; + var command = new CreateContent { Data = new ContentData(), Publish = true }; await Assert.ThrowsAsync(() => GuardContent.CanCreate(command, contentWorkflow, schema)); } @@ -80,7 +80,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject.Guards SetupCanCreatePublish(schema, true); - var command = new CreateContent { Data = new NamedContentData(), Publish = true }; + var command = new CreateContent { Data = new ContentData(), Publish = true }; await Assert.ThrowsAsync(() => GuardContent.CanCreate(command, contentWorkflow, schema)); } @@ -90,7 +90,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject.Guards { var schema = CreateSchema(false); - var command = new CreateContent { Data = new NamedContentData() }; + var command = new CreateContent { Data = new ContentData() }; await GuardContent.CanCreate(command, contentWorkflow, schema); } @@ -113,7 +113,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject.Guards SetupCanUpdate(false); var content = CreateContent(Status.Draft); - var command = new UpdateContent { Data = new NamedContentData() }; + var command = new UpdateContent { Data = new ContentData() }; await Assert.ThrowsAsync(() => GuardContent.CanUpdate(command, content, contentWorkflow)); } @@ -124,7 +124,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject.Guards SetupCanUpdate(true); var content = CreateContent(Status.Draft); - var command = new UpdateContent { Data = new NamedContentData(), User = user }; + var command = new UpdateContent { Data = new ContentData(), User = user }; await GuardContent.CanUpdate(command, content, contentWorkflow); } @@ -147,7 +147,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject.Guards SetupCanUpdate(false); var content = CreateContent(Status.Draft); - var command = new PatchContent { Data = new NamedContentData() }; + var command = new PatchContent { Data = new ContentData() }; await Assert.ThrowsAsync(() => GuardContent.CanPatch(command, content, contentWorkflow)); } @@ -158,7 +158,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject.Guards SetupCanUpdate(true); var content = CreateContent(Status.Draft); - var command = new PatchContent { Data = new NamedContentData(), User = user }; + var command = new PatchContent { Data = new ContentData(), User = user }; await GuardContent.CanPatch(command, content, contentWorkflow); } @@ -327,7 +327,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject.Guards private void SetupCanCreatePublish(ISchemaEntity schema, bool canCreate) { - A.CallTo(() => contentWorkflow.CanPublishOnCreateAsync(schema, A._, user)) + A.CallTo(() => contentWorkflow.CanPublishOnCreateAsync(schema, A._, user)) .Returns(canCreate); } diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/DynamicContentWorkflowTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/DynamicContentWorkflowTests.cs index 1881a532a..7e83351dd 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/DynamicContentWorkflowTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/DynamicContentWorkflowTests.cs @@ -381,7 +381,7 @@ namespace Squidex.Domain.Apps.Entities.Contents } content.Data = - new NamedContentData() + new ContentData() .AddField("field", new ContentFieldData() .AddValue("iv", value)); diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/GraphQLQueriesTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/GraphQLQueriesTests.cs index 9f1adc8b4..6424c414e 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/GraphQLQueriesTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/GraphQLQueriesTests.cs @@ -808,7 +808,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL public async Task Should_not_return_data_when_field_not_part_of_content() { var contentId = DomainId.NewGuid(); - var content = TestContent.Create(appId, schemaId, contentId, DomainId.Empty, DomainId.Empty, new NamedContentData()); + var content = TestContent.Create(appId, schemaId, contentId, DomainId.Empty, DomainId.Empty, new ContentData()); var query = @" query { diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/TestContent.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/TestContent.cs index b481d48aa..f08000c7c 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/TestContent.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/TestContent.cs @@ -68,12 +68,12 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL } }"; - public static IEnrichedContentEntity Create(NamedId appId, NamedId schemaId, DomainId id, DomainId refId, DomainId assetId, NamedContentData? data = null) + public static IEnrichedContentEntity Create(NamedId appId, NamedId schemaId, DomainId id, DomainId refId, DomainId assetId, ContentData? data = null) { var now = SystemClock.Instance.GetCurrentInstant(); data ??= - new NamedContentData() + new ContentData() .AddField("my-string", new ContentFieldData() .AddValue("de", "value")) @@ -151,7 +151,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL var now = SystemClock.Instance.GetCurrentInstant(); var data = - new NamedContentData() + new ContentData() .AddField(field, new ContentFieldData() .AddValue("iv", value)); diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/MongoDb/ContentsQueryFixture.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/MongoDb/ContentsQueryFixture.cs index 72b75d71b..194405a71 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/MongoDb/ContentsQueryFixture.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/MongoDb/ContentsQueryFixture.cs @@ -61,8 +61,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.MongoDb var contentRepository = new MongoContentRepository( mongoDatabase, - CreateAppProvider(), - TestUtils.DefaultSerializer); + CreateAppProvider()); Task.Run(async () => { @@ -103,11 +102,11 @@ namespace Squidex.Domain.Apps.Entities.Contents.MongoDb for (var i = 0; i < numValues; i++) { var data = - new IdContentData() - .AddField(1, + new ContentData() + .AddField("field1", new ContentFieldData() .AddJsonValue(JsonValue.Create(i))) - .AddField(2, + .AddField("field2", new ContentFieldData() .AddJsonValue(JsonValue.Create(Lorem.Paragraph(200, 20)))); @@ -115,7 +114,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.MongoDb { DocumentId = DomainId.NewGuid(), AppId = appId, - DataByIds = data, + Data = data, IndexedAppId = appId.Id, IndexedSchemaId = schemaId.Id, IsDeleted = false, diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/MongoDb/MongoDbQueryTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/MongoDb/MongoDbQueryTests.cs index 365162fc6..f617e0e38 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/MongoDb/MongoDbQueryTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/MongoDb/MongoDbQueryTests.cs @@ -81,9 +81,9 @@ namespace Squidex.Domain.Apps.Entities.Contents.MongoDb } [Fact] - public void Should_throw_exception_for_invalid_field() + public void Should_not_throw_exception_for_invalid_field() { - Assert.Throws(() => _F(ClrFilter.Eq("data/invalid/iv", "Me"))); + _F(ClrFilter.Eq("data/invalid/iv", "Me")); } [Fact] @@ -197,7 +197,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.MongoDb public void Should_make_query_with_empty_test() { var i = _F(ClrFilter.Empty("data/firstName/iv")); - var o = _C("{ '$or' : [{ 'do.1.iv' : { '$exists' : false } }, { 'do.1.iv' : null }, { 'do.1.iv' : '' }, { 'do.1.iv' : [] }] }"); + var o = _C("{ '$or' : [{ 'do.firstName.iv' : { '$exists' : false } }, { 'do.firstName.iv' : null }, { 'do.firstName.iv' : '' }, { 'do.firstName.iv' : [] }] }"); Assert.Equal(o, i); } @@ -206,7 +206,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.MongoDb public void Should_make_query_with_datetime_data() { var i = _F(ClrFilter.Eq("data/birthday/iv", InstantPattern.General.Parse("1988-01-19T12:00:00Z").Value)); - var o = _C("{ 'do.5.iv' : '1988-01-19T12:00:00Z' }"); + var o = _C("{ 'do.birthday.iv' : '1988-01-19T12:00:00Z' }"); Assert.Equal(o, i); } @@ -215,7 +215,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.MongoDb public void Should_make_query_with_underscore_field() { var i = _F(ClrFilter.Eq("data/dashed_field/iv", "Value")); - var o = _C("{ 'do.8.iv' : 'Value' }"); + var o = _C("{ 'do.dashed-field.iv' : 'Value' }"); Assert.Equal(o, i); } @@ -224,7 +224,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.MongoDb public void Should_make_query_with_references_equals() { var i = _F(ClrFilter.Eq("data/friends/iv", "guid")); - var o = _C("{ 'do.7.iv' : 'guid' }"); + var o = _C("{ 'do.friends.iv' : 'guid' }"); Assert.Equal(o, i); } @@ -233,7 +233,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.MongoDb public void Should_make_query_with_array_field() { var i = _F(ClrFilter.Eq("data/hobbies/iv/name", "PC")); - var o = _C("{ 'do.9.iv.91' : 'PC' }"); + var o = _C("{ 'do.hobbies.iv.name' : 'PC' }"); Assert.Equal(o, i); } @@ -242,7 +242,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.MongoDb public void Should_make_query_with_assets_equals() { var i = _F(ClrFilter.Eq("data/pictures/iv", "guid")); - var o = _C("{ 'do.6.iv' : 'guid' }"); + var o = _C("{ 'do.pictures.iv' : 'guid' }"); Assert.Equal(o, i); } @@ -260,7 +260,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.MongoDb public void Should_make_orderby_with_single_field() { var i = _S(SortBuilder.Descending("data/age/iv")); - var o = _C("{ 'do.4.iv' : -1 }"); + var o = _C("{ 'do.age.iv' : -1 }"); Assert.Equal(o, i); } @@ -269,7 +269,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.MongoDb public void Should_make_orderby_with_multiple_fields() { var i = _S(SortBuilder.Ascending("data/age/iv"), SortBuilder.Descending("data/firstName/en")); - var o = _C("{ 'do.4.iv' : 1, 'do.1.en' : -1 }"); + var o = _C("{ 'do.age.iv' : 1, 'do.firstName.en' : -1 }"); Assert.Equal(o, i); } @@ -320,7 +320,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.MongoDb i = sortDefinition.Render(Serializer, Registry).ToString(); }); - cursor.QuerySort(new ClrQuery { Sort = sorts.ToList() }.AdjustToModel(appId, schemaDef)); + cursor.QuerySort(new ClrQuery { Sort = sorts.ToList() }.AdjustToModel(appId)); return i; } @@ -328,7 +328,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.MongoDb private string _Q(ClrQuery query) { var rendered = - query.AdjustToModel(appId, schemaDef).BuildFilter().Filter! + query.AdjustToModel(appId).BuildFilter().Filter! .Render(Serializer, Registry).ToString(); return rendered; diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ContentEnricherTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ContentEnricherTests.cs index ed98a310a..b7dc334b2 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ContentEnricherTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ContentEnricherTests.cs @@ -121,7 +121,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries [Fact] public async Task Should_clone_data_when_requested() { - var source = CreateContent(new NamedContentData()); + var source = CreateContent(new ContentData()); var sut = new ContentEnricher(Enumerable.Empty(), new Lazy(() => contentQuery)); @@ -133,7 +133,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries [Fact] public async Task Should_not_clone_data_when_not_requested() { - var source = CreateContent(new NamedContentData()); + var source = CreateContent(new ContentData()); var sut = new ContentEnricher(Enumerable.Empty(), new Lazy(() => contentQuery)); @@ -142,7 +142,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries Assert.Same(source.Data, result.Data); } - private ContentEntity CreateContent(NamedContentData? data = null) + private ContentEntity CreateContent(ContentData? data = null) { return new ContentEntity { SchemaId = schemaId, Data = data! }; } diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ContentQueryServiceTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ContentQueryServiceTests.cs index fc3bf9b3a..e8118b457 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ContentQueryServiceTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ContentQueryServiceTests.cs @@ -34,8 +34,8 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries private readonly DomainId contentId = DomainId.NewGuid(); private readonly NamedId appId = NamedId.Of(DomainId.NewGuid(), "my-app"); private readonly NamedId schemaId = NamedId.Of(DomainId.NewGuid(), "my-schema"); - private readonly NamedContentData contentData = new NamedContentData(); - private readonly NamedContentData contentTransformed = new NamedContentData(); + private readonly ContentData contentData = new ContentData(); + private readonly ContentData contentTransformed = new ContentData(); private readonly ContentQueryParser queryParser = A.Fake(); private readonly ContentQueryService sut; diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ConvertDataTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ConvertDataTests.cs index d02e451a7..71b8dc21a 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ConvertDataTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ConvertDataTests.cs @@ -54,7 +54,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries [Fact] public async Task Should_convert_data_and_data_draft_when_frontend_user() { - var content = CreateContent(new NamedContentData()); + var content = CreateContent(new ContentData()); var ctx = new Context(Mocks.FrontendUser(), Mocks.App(appId)); @@ -74,7 +74,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries var content = CreateContent(source); var expected = - new NamedContentData() + new ContentData() .AddField("references", new ContentFieldData() .AddJsonValue(JsonValue.Array(id2))) @@ -112,7 +112,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries var content = CreateContent(source); var expected = - new NamedContentData() + new ContentData() .AddField("references", new ContentFieldData() .AddJsonValue(JsonValue.Array())) @@ -139,9 +139,9 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries Assert.Equal(expected, content.Data); } - private static NamedContentData BuildTestData(DomainId id1, DomainId id2) + private static ContentData BuildTestData(DomainId id1, DomainId id2) { - return new NamedContentData() + return new ContentData() .AddField("references", new ContentFieldData() .AddJsonValue(JsonValue.Array(id1, id2))) @@ -156,7 +156,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries .Add("nested", JsonValue.Array(id1, id2))))); } - private ContentEntity CreateContent(NamedContentData data) + private ContentEntity CreateContent(ContentData data) { return new ContentEntity { diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ResolveAssetsTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ResolveAssetsTests.cs index a3a087f29..ff47a560c 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ResolveAssetsTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ResolveAssetsTests.cs @@ -125,7 +125,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries await sut.EnrichAsync(requestContext, contents, schemaProvider); Assert.Equal( - new NamedContentData() + new ContentData() .AddField("asset1", new ContentFieldData() .AddValue("iv", JsonValue.Array($"url/to/{img1.Id}", img1.FileName))) @@ -135,7 +135,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries contents[0].ReferenceData); Assert.Equal( - new NamedContentData() + new ContentData() .AddField("asset1", new ContentFieldData() .AddValue("iv", JsonValue.Array(doc1.FileName))) @@ -221,7 +221,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries return new ContentEntity { Data = - new NamedContentData() + new ContentData() .AddField("asset1", new ContentFieldData() .AddJsonValue("iv", JsonValue.Array(assets1.Select(x => x.ToString()).ToArray()))) diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ResolveReferencesTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ResolveReferencesTests.cs index ec1b0bb07..da5164198 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ResolveReferencesTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ResolveReferencesTests.cs @@ -145,7 +145,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries await sut.EnrichAsync(requestContext, contents, schemaProvider); Assert.Equal( - new NamedContentData() + new ContentData() .AddField("ref1", new ContentFieldData() .AddJsonValue("iv", @@ -161,7 +161,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries contents[0].ReferenceData); Assert.Equal( - new NamedContentData() + new ContentData() .AddField("ref1", new ContentFieldData() .AddJsonValue("iv", @@ -197,7 +197,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries await sut.EnrichAsync(requestContext, contents, schemaProvider); Assert.Equal( - new NamedContentData() + new ContentData() .AddField("ref1", new ContentFieldData() .AddJsonValue("iv", @@ -213,7 +213,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries contents[0].ReferenceData); Assert.Equal( - new NamedContentData() + new ContentData() .AddField("ref1", new ContentFieldData() .AddJsonValue("iv", @@ -287,7 +287,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries { Id = DomainId.NewGuid(), Data = - new NamedContentData() + new ContentData() .AddField("ref1", new ContentFieldData() .AddJsonValue("iv", JsonValue.Array(ref1.Select(x => x.ToString()).ToArray()))) @@ -305,7 +305,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries { Id = id, Data = - new NamedContentData() + new ContentData() .AddField("name", new ContentFieldData() .AddValue("iv", name)) diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ScriptContentTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ScriptContentTests.cs index 357e37e0d..0ca218bd1 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ScriptContentTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ScriptContentTests.cs @@ -87,12 +87,12 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries { var ctx = new Context(Mocks.ApiUser(), Mocks.App(appId)); - var oldData = new NamedContentData(); + var oldData = new ContentData(); var content = new ContentEntity { SchemaId = schemaWithScriptId, Data = oldData }; A.CallTo(() => scriptEngine.TransformAsync(A._, "my-query", ScriptOptions())) - .Returns(new NamedContentData()); + .Returns(new ContentData()); await sut.EnrichAsync(ctx, new[] { content }, schemaProvider); diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ReferenceFluidExtensionTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ReferenceFluidExtensionTests.cs index 86fdb27cb..01cd6b3a5 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ReferenceFluidExtensionTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ReferenceFluidExtensionTests.cs @@ -48,7 +48,7 @@ namespace Squidex.Domain.Apps.Entities.Contents var @event = new EnrichedContentEvent { Data = - new NamedContentData() + new ContentData() .AddField("references", new ContentFieldData() .AddJsonValue(JsonValue.Array(referenceId1, referenceId2))), @@ -88,7 +88,7 @@ namespace Squidex.Domain.Apps.Entities.Contents return new ContentEntity { Data = - new NamedContentData() + new ContentData() .AddField("field1", new ContentFieldData() .AddJsonValue(JsonValue.Create($"Hello {index}"))) diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerTestsBase.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerTestsBase.cs index 52f5f2b34..9b82314da 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerTestsBase.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerTestsBase.cs @@ -338,17 +338,17 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text return Op(id, new ContentDraftCreated { MigratedData = data }); } - private static NamedContentData TextData(string language, string text) + private static ContentData TextData(string language, string text) { - return new NamedContentData() + return new ContentData() .AddField("text", new ContentFieldData() .AddValue(language, text)); } - private static NamedContentData GeoData(string field, double latitude, double longitude) + private static ContentData GeoData(string field, double latitude, double longitude) { - return new NamedContentData() + return new ContentData() .AddField(field, new ContentFieldData() .AddValue("iv", JsonValue.Object().Add("latitude", latitude).Add("longitude", longitude)));