From ee3287fe68abe4c7e1a5e29dde5abbba48306c62 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Fri, 18 Dec 2020 21:58:42 +0100 Subject: [PATCH] Improve field. --- .../Assets/MongoAssetFolderRepository.cs | 4 +- .../Assets/MongoAssetRepository.cs | 8 ++- .../FullText/MongoTextIndex.cs | 12 +++-- .../MongoDb/Field.cs | 22 +++++++++ .../MongoDb/MongoExtensions.cs | 14 ++---- .../MongoDb/FieldTests.cs | 49 +++++++++++++++++++ 6 files changed, 92 insertions(+), 17 deletions(-) create mode 100644 backend/src/Squidex.Infrastructure.MongoDb/MongoDb/Field.cs create mode 100644 backend/tests/Squidex.Infrastructure.Tests/MongoDb/FieldTests.cs diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/MongoAssetFolderRepository.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/MongoAssetFolderRepository.cs index bd499abb3..9dc2492f4 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/MongoAssetFolderRepository.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/MongoAssetFolderRepository.cs @@ -66,7 +66,9 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Assets await Collection.Find(filter).Only(x => x.Id) .ToListAsync(); - return assetFolderEntities.Select(x => DomainId.Create(x[Fields.AssetFolderId].AsString)).ToList(); + var field = Field.Of(x => nameof(x.Id)); + + return assetFolderEntities.Select(x => DomainId.Create(x[field].AsString)).ToList(); } } diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/MongoAssetRepository.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/MongoAssetRepository.cs index 611c5be9e..729994f66 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/MongoAssetRepository.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/MongoAssetRepository.cs @@ -141,7 +141,9 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Assets await Collection.Find(BuildFilter(appId, ids)).Only(x => x.Id) .ToListAsync(); - return assetEntities.Select(x => DomainId.Create(x[Fields.AssetId].AsString)).ToList(); + var field = Field.Of(x => nameof(x.Id)); + + return assetEntities.Select(x => DomainId.Create(x[field].AsString)).ToList(); } } @@ -153,7 +155,9 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Assets await Collection.Find(x => x.IndexedAppId == appId && !x.IsDeleted && x.ParentId == parentId).Only(x => x.Id) .ToListAsync(); - return assetEntities.Select(x => DomainId.Create(x[Fields.AssetId].AsString)).ToList(); + var field = Field.Of(x => nameof(x.Id)); + + return assetEntities.Select(x => DomainId.Create(x[field].AsString)).ToList(); } } diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/FullText/MongoTextIndex.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/FullText/MongoTextIndex.cs index dffe58a9a..796b2627c 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/FullText/MongoTextIndex.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/FullText/MongoTextIndex.cs @@ -132,10 +132,12 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.FullText Filter.In(x => x.SchemaId, filter.SchemaIds), Filter_ByScope(scope), Filter.Text(queryText, "none"))) - .Only(x => x.ContentId).Limit(limit) + .Limit(limit).Only(x => x.ContentId) .ToListAsync(); - return bySchema.Select(x => DomainId.Create(x["_ci"].AsString)).Distinct().ToList(); + var field = Field.Of(x => nameof(x.ContentId)); + + return bySchema.Select(x => DomainId.Create(x[field].AsString)).Distinct().ToList(); } private async Task> SearchByAppAsync(string queryText, IAppEntity app, SearchScope scope, int limit) @@ -147,10 +149,12 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.FullText Filter.Exists(x => x.SchemaId), Filter_ByScope(scope), Filter.Text(queryText, "none"))) - .Only(x => x.ContentId).Limit(limit) + .Limit(limit).Only(x => x.ContentId) .ToListAsync(); - return bySchema.Select(x => DomainId.Create(x["_ci"].AsString)).Distinct().ToList(); + var field = Field.Of(x => nameof(x.ContentId)); + + return bySchema.Select(x => DomainId.Create(x[field].AsString)).Distinct().ToList(); } private static FilterDefinition Filter_ByScope(SearchScope scope) diff --git a/backend/src/Squidex.Infrastructure.MongoDb/MongoDb/Field.cs b/backend/src/Squidex.Infrastructure.MongoDb/MongoDb/Field.cs new file mode 100644 index 000000000..50ebc572e --- /dev/null +++ b/backend/src/Squidex.Infrastructure.MongoDb/MongoDb/Field.cs @@ -0,0 +1,22 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; +using MongoDB.Bson.Serialization; + +namespace Squidex.Infrastructure.MongoDb +{ + public static class Field + { + public static string Of(Func mapper) + { + var name = mapper(default!); + + return BsonClassMap.LookupClassMap(typeof(T)).GetMemberMap(name).ElementName; + } + } +} diff --git a/backend/src/Squidex.Infrastructure.MongoDb/MongoDb/MongoExtensions.cs b/backend/src/Squidex.Infrastructure.MongoDb/MongoDb/MongoExtensions.cs index 9193d6180..1059c8d7e 100644 --- a/backend/src/Squidex.Infrastructure.MongoDb/MongoDb/MongoExtensions.cs +++ b/backend/src/Squidex.Infrastructure.MongoDb/MongoDb/MongoExtensions.cs @@ -120,9 +120,9 @@ namespace Squidex.Infrastructure.MongoDb if (existingVersion != null) { - var versionField = GetVersionField(); + var field = Field.Of(x => nameof(x.Version)); - throw new InconsistentStateException(existingVersion[versionField].AsInt64, oldVersion, ex); + throw new InconsistentStateException(existingVersion[field].AsInt64, oldVersion, ex); } else { @@ -156,9 +156,9 @@ namespace Squidex.Infrastructure.MongoDb if (existingVersion != null) { - var versionField = GetVersionField(); + var field = Field.Of(x => nameof(x.Version)); - throw new InconsistentStateException(existingVersion[versionField].AsInt64, oldVersion, ex); + throw new InconsistentStateException(existingVersion[field].AsInt64, oldVersion, ex); } else { @@ -167,12 +167,6 @@ namespace Squidex.Infrastructure.MongoDb } } - private static string GetVersionField() - where T : IVersionedEntity where TKey : notnull - { - return BsonClassMap.LookupClassMap(typeof(T)).GetMemberMap(nameof(IVersionedEntity.Version)).ElementName; - } - public static async Task ForEachPipedAsync(this IAsyncCursorSource source, Func processor, CancellationToken cancellationToken = default) { using (var cursor = await source.ToCursorAsync(cancellationToken)) diff --git a/backend/tests/Squidex.Infrastructure.Tests/MongoDb/FieldTests.cs b/backend/tests/Squidex.Infrastructure.Tests/MongoDb/FieldTests.cs new file mode 100644 index 000000000..f2ef16efa --- /dev/null +++ b/backend/tests/Squidex.Infrastructure.Tests/MongoDb/FieldTests.cs @@ -0,0 +1,49 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using MongoDB.Bson.Serialization.Attributes; +using Xunit; + +namespace Squidex.Infrastructure.MongoDb +{ + public class FieldTests + { + public sealed class Entity + { + public string Id { get; set; } + + public string Default { get; set; } + + [BsonElement("_c")] + public string Custom { get; set; } + } + + [Fact] + public void Should_resolve_id_field() + { + var name = Field.Of(x => nameof(x.Id)); + + Assert.Equal("_id", name); + } + + [Fact] + public void Should_resolve_default_field() + { + var name = Field.Of(x => nameof(x.Default)); + + Assert.Equal("Default", name); + } + + [Fact] + public void Should_resolve_custom_field() + { + var name = Field.Of(x => nameof(x.Custom)); + + Assert.Equal("_c", name); + } + } +}