From 03a5fbe09b66a146576bfa9e8c2a6e83572a1cd1 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Sun, 10 Dec 2017 21:19:24 +0100 Subject: [PATCH] Mongo Queries fixed --- .../Contents/MongoContentEntity.cs | 3 ++- .../Contents/MongoContentRepository.cs | 25 ++++++++++++++++--- .../Apps/State/AppState.cs | 3 ++- .../Contents/QueryContext.cs | 4 +-- .../Contents/State/ContentState.cs | 4 ++- .../Controllers/Content/ContentsController.cs | 2 +- src/Squidex/Config/Domain/WriteServices.cs | 1 - 7 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentEntity.cs b/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentEntity.cs index c1b815624..f5127af9e 100644 --- a/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentEntity.cs +++ b/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentEntity.cs @@ -85,7 +85,8 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents [BsonJson] public IdContentData DataByIds { get; set; } - NamedContentData IContentEntity.Data + [BsonIgnore] + public NamedContentData Data { get { return data; } } diff --git a/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs b/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs index 720cab81b..b2e894f4f 100644 --- a/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs +++ b/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs @@ -50,6 +50,11 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents protected override async Task SetupCollectionAsync(IMongoCollection collection) { + await collection.Indexes.CreateOneAsync( + Index + .Ascending(x => x.Id) + .Ascending(x => x.Version)); + await collection.Indexes.CreateOneAsync( Index .Ascending(x => x.Id) @@ -84,12 +89,15 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents DocumentId = documentId, DataText = idData?.ToFullText(), DataByIds = idData, + IsLatest = true, ReferencedIds = idData?.ToReferencedIds(schema.SchemaDef), }); try { await Collection.InsertOneAsync(document); + + await Collection.UpdateManyAsync(x => x.Id == value.Id && x.Version < value.Version, Update.Set(x => x.IsLatest, false)); } catch (MongoWriteException ex) { @@ -115,13 +123,22 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents { var id = Guid.Parse(key); - var existing = + var contentEntity = await Collection.Find(x => x.Id == id && x.IsLatest) .FirstOrDefaultAsync(); - if (existing != null) + if (contentEntity != null) { - return (SimpleMapper.Map(existing, new ContentState()), existing.Version); + var schema = await appProvider.GetSchemaAsync(contentEntity.AppId, contentEntity.SchemaId); + + if (schema == null) + { + throw new InvalidOperationException($"Cannot find schema {contentEntity.SchemaId}"); + } + + contentEntity?.ParseData(schema.SchemaDef); + + return (SimpleMapper.Map(contentEntity, new ContentState()), contentEntity.Version); } return (null, EtagVersion.NotFound); @@ -212,7 +229,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents public async Task FindContentAsync(IAppEntity app, ISchemaEntity schema, Guid id, long version) { var contentEntity = - await Collection.Find(x => x.Id == id && x.Version == version) + await Collection.Find(x => x.Id == id && x.Version >= version).SortBy(x => x.Version) .FirstOrDefaultAsync(); contentEntity?.ParseData(schema.SchemaDef); diff --git a/src/Squidex.Domain.Apps.Entities/Apps/State/AppState.cs b/src/Squidex.Domain.Apps.Entities/Apps/State/AppState.cs index 34988ff0f..35ed457a5 100644 --- a/src/Squidex.Domain.Apps.Entities/Apps/State/AppState.cs +++ b/src/Squidex.Domain.Apps.Entities/Apps/State/AppState.cs @@ -17,7 +17,8 @@ using Squidex.Infrastructure.Reflection; namespace Squidex.Domain.Apps.Entities.Apps.State { - public class AppState : DomainObjectState, IAppEntity + public class AppState : DomainObjectState, + IAppEntity { private static readonly LanguagesConfig English = LanguagesConfig.Build(Language.EN); diff --git a/src/Squidex.Domain.Apps.Entities/Contents/QueryContext.cs b/src/Squidex.Domain.Apps.Entities/Contents/QueryContext.cs index fc5ccd4ea..01288799e 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/QueryContext.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/QueryContext.cs @@ -121,7 +121,7 @@ namespace Squidex.Domain.Apps.Entities.Contents } } - return ids.Select(id => cachedAssets.GetOrDefault(id)).Where(x => x != null).ToList(); + return ids.Select(cachedAssets.GetOrDefault).Where(x => x != null).ToList(); } public async Task> GetReferencedContentsAsync(Guid schemaId, ICollection ids) @@ -140,7 +140,7 @@ namespace Squidex.Domain.Apps.Entities.Contents } } - return ids.Select(id => cachedContents.GetOrDefault(id)).Where(x => x != null).ToList(); + return ids.Select(cachedContents.GetOrDefault).Where(x => x != null).ToList(); } } } diff --git a/src/Squidex.Domain.Apps.Entities/Contents/State/ContentState.cs b/src/Squidex.Domain.Apps.Entities/Contents/State/ContentState.cs index 356137ea9..f3d09dca4 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/State/ContentState.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/State/ContentState.cs @@ -16,7 +16,9 @@ using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Entities.Contents.State { - public class ContentState : DomainObjectState, IContentEntity + public class ContentState : DomainObjectState, + IContentEntity, + IUpdateableEntityWithAppRef { [JsonProperty] public NamedContentData Data { get; set; } diff --git a/src/Squidex/Areas/Api/Controllers/Content/ContentsController.cs b/src/Squidex/Areas/Api/Controllers/Content/ContentsController.cs index c01ee14ec..875b451cc 100644 --- a/src/Squidex/Areas/Api/Controllers/Content/ContentsController.cs +++ b/src/Squidex/Areas/Api/Controllers/Content/ContentsController.cs @@ -151,7 +151,7 @@ namespace Squidex.Areas.Api.Controllers.Contents Response.Headers["ETag"] = new StringValues(version.ToString()); - return Ok(response); + return Ok(response.Data); } [MustBeAppEditor] diff --git a/src/Squidex/Config/Domain/WriteServices.cs b/src/Squidex/Config/Domain/WriteServices.cs index 56dba6359..6a910e333 100644 --- a/src/Squidex/Config/Domain/WriteServices.cs +++ b/src/Squidex/Config/Domain/WriteServices.cs @@ -13,7 +13,6 @@ using Squidex.Domain.Apps.Entities.Assets; using Squidex.Domain.Apps.Entities.Contents; using Squidex.Domain.Apps.Entities.Rules; using Squidex.Domain.Apps.Entities.Schemas; -using Squidex.Domain.Apps.Entities.State.SchemaDefs; using Squidex.Domain.Users; using Squidex.Infrastructure.Commands; using Squidex.Pipeline.CommandMiddlewares;