From 206dd60c9389eb8d34be38135133d4cd6abfbf54 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Mon, 18 Dec 2017 17:52:13 +0100 Subject: [PATCH] 1) Use String for Guids in MongoDB 2) Bugfix with reference cleaning. --- .../ExtractReferenceIds/ReferencesCleaner.cs | 17 +++++- .../Apps/MongoAppEntity.cs | 10 ++-- .../Assets/MongoAssetStatsEntity.cs | 7 ++- .../Contents/MongoContentEntity.cs | 60 ++++++++++--------- .../Contents/MongoContentRepository.cs | 2 +- .../MongoContentRepository_EventHandling.cs | 2 +- .../History/MongoHistoryEventEntity.cs | 4 +- .../Rules/MongoRuleEntity.cs | 11 ++-- .../Rules/MongoRuleEventEntity.cs | 20 ++++--- .../Schemas/MongoSchemaEntity.cs | 11 ++-- .../States/MongoState.cs | 6 +- .../ReferenceExtractionTests.cs | 2 +- 12 files changed, 90 insertions(+), 62 deletions(-) diff --git a/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesCleaner.cs b/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesCleaner.cs index 31f67410f..63197b170 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesCleaner.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesCleaner.cs @@ -17,6 +17,7 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds { public static class ReferencesCleaner { + private static readonly List EmptyIds = new List(); public static JToken CleanReferences(this Field field, JToken value, ISet oldReferences) { if ((field is AssetsField || field is ReferencesField) && !value.IsNull()) @@ -36,7 +37,7 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds private static JToken Visit(AssetsField field, JToken value, IEnumerable oldReferences) { - var oldIds = field.ExtractReferences(value).ToList(); + var oldIds = GetIds(value); var newIds = oldIds.Except(oldReferences).ToList(); return oldIds.Count != newIds.Count ? JToken.FromObject(newIds) : value; @@ -49,10 +50,22 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds return new JArray(); } - var oldIds = field.ExtractReferences(value).ToList(); + var oldIds = GetIds(value); var newIds = oldIds.Except(oldReferences).ToList(); return oldIds.Count != newIds.Count ? JToken.FromObject(newIds) : value; } + + private static List GetIds(JToken value) + { + try + { + return value?.ToObject>() ?? EmptyIds; + } + catch + { + return EmptyIds; + } + } } } diff --git a/src/Squidex.Domain.Apps.Entities.MongoDb/Apps/MongoAppEntity.cs b/src/Squidex.Domain.Apps.Entities.MongoDb/Apps/MongoAppEntity.cs index e5b359397..dfc59ef16 100644 --- a/src/Squidex.Domain.Apps.Entities.MongoDb/Apps/MongoAppEntity.cs +++ b/src/Squidex.Domain.Apps.Entities.MongoDb/Apps/MongoAppEntity.cs @@ -23,19 +23,19 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Apps [BsonElement] [BsonRequired] - public int Version { get; set; } + [BsonJson] + public AppState State { get; set; } [BsonElement] [BsonRequired] - public string Name { get; set; } + public int Version { get; set; } [BsonElement] [BsonRequired] - public string[] UserIds { get; set; } + public string Name { get; set; } - [BsonJson] [BsonElement] [BsonRequired] - public AppState State { get; set; } + public string[] UserIds { get; set; } } } diff --git a/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/MongoAssetStatsEntity.cs b/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/MongoAssetStatsEntity.cs index cc7ddf110..a1d45333f 100644 --- a/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/MongoAssetStatsEntity.cs +++ b/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/MongoAssetStatsEntity.cs @@ -22,12 +22,13 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Assets [BsonRequired] [BsonElement] - [BsonDateTimeOptions(DateOnly = true)] - public DateTime Date { get; set; } + [BsonRepresentation(BsonType.String)] + public Guid AssetId { get; set; } [BsonRequired] [BsonElement] - public Guid AssetId { get; set; } + [BsonDateTimeOptions(DateOnly = true)] + public DateTime Date { get; set; } [BsonRequired] [BsonElement] diff --git a/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentEntity.cs b/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentEntity.cs index f5127af9e..bb5c32a58 100644 --- a/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentEntity.cs +++ b/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentEntity.cs @@ -24,13 +24,45 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents private NamedContentData data; [BsonId] + [BsonRequired] [BsonElement] public string DocumentId { get; set; } [BsonRequired] - [BsonElement] + [BsonElement("id")] + [BsonRepresentation(BsonType.String)] public Guid Id { get; set; } + [BsonRequired] + [BsonElement("ai")] + [BsonRepresentation(BsonType.String)] + public Guid AppId { get; set; } + + [BsonRequired] + [BsonElement("si")] + [BsonRepresentation(BsonType.String)] + public Guid SchemaId { get; set; } + + [BsonRequired] + [BsonElement("rf")] + [BsonRepresentation(BsonType.String)] + public List ReferencedIds { get; set; } + + [BsonRequired] + [BsonElement("rd")] + [BsonRepresentation(BsonType.String)] + public List ReferencedIdsDeleted { get; set; } = new List(); + + [BsonRequired] + [BsonElement("st")] + [BsonRepresentation(BsonType.String)] + public Status Status { get; set; } + + [BsonRequired] + [BsonElement("do")] + [BsonJson] + public IdContentData DataByIds { get; set; } + [BsonRequired] [BsonElement("ct")] public Instant Created { get; set; } @@ -47,14 +79,6 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents [BsonElement("vs")] public long Version { get; set; } - [BsonRequired] - [BsonElement("ai")] - public Guid AppId { get; set; } - - [BsonRequired] - [BsonElement("si")] - public Guid SchemaId { get; set; } - [BsonRequired] [BsonElement("cb")] public RefToken CreatedBy { get; set; } @@ -63,28 +87,10 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents [BsonElement("mb")] public RefToken LastModifiedBy { get; set; } - [BsonRequired] - [BsonElement("rf")] - public List ReferencedIds { get; set; } - - [BsonRequired] - [BsonElement("rd")] - public List ReferencedIdsDeleted { get; set; } = new List(); - [BsonRequired] [BsonElement("lt")] public bool IsLatest { get; set; } - [BsonRequired] - [BsonElement("st")] - [BsonRepresentation(BsonType.String)] - public Status Status { get; set; } - - [BsonRequired] - [BsonElement("do")] - [BsonJson] - public IdContentData DataByIds { get; set; } - [BsonIgnore] public NamedContentData Data { diff --git a/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs b/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs index 3c3ed3a0c..fdbb52b7c 100644 --- a/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs +++ b/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs @@ -225,7 +225,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents await Collection.Find(x => contentIds.Contains(x.Id) && x.AppId == appId).Only(x => x.Id) .ToListAsync(); - return contentIds.Except(contentEntities.Select(x => x["Id"].AsGuid)).ToList(); + return contentIds.Except(contentEntities.Select(x => Guid.Parse(x["id"].AsString))).ToList(); } public async Task FindContentAsync(IAppEntity app, ISchemaEntity schema, Guid id, long version) diff --git a/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository_EventHandling.cs b/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository_EventHandling.cs index 74e8b36f7..f3c489a91 100644 --- a/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository_EventHandling.cs +++ b/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository_EventHandling.cs @@ -34,7 +34,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents public Task On(Envelope @event) { - return this.DispatchActionAsync(@event.Payload, @event.Headers); + return this.DispatchActionAsync(@event.Payload); } protected Task On(AssetDeleted @event) diff --git a/src/Squidex.Domain.Apps.Entities.MongoDb/History/MongoHistoryEventEntity.cs b/src/Squidex.Domain.Apps.Entities.MongoDb/History/MongoHistoryEventEntity.cs index a3223f276..5f0ee1012 100644 --- a/src/Squidex.Domain.Apps.Entities.MongoDb/History/MongoHistoryEventEntity.cs +++ b/src/Squidex.Domain.Apps.Entities.MongoDb/History/MongoHistoryEventEntity.cs @@ -8,6 +8,7 @@ using System; using System.Collections.Generic; +using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; using Squidex.Infrastructure; using Squidex.Infrastructure.MongoDb; @@ -22,8 +23,9 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.History IUpdateableEntityWithCreatedBy, IUpdateableEntityWithAppRef { - [BsonRequired] [BsonElement] + [BsonRequired] + [BsonRepresentation(BsonType.String)] public Guid AppId { get; set; } [BsonRequired] diff --git a/src/Squidex.Domain.Apps.Entities.MongoDb/Rules/MongoRuleEntity.cs b/src/Squidex.Domain.Apps.Entities.MongoDb/Rules/MongoRuleEntity.cs index 1eeba5a13..dbd3cb926 100644 --- a/src/Squidex.Domain.Apps.Entities.MongoDb/Rules/MongoRuleEntity.cs +++ b/src/Squidex.Domain.Apps.Entities.MongoDb/Rules/MongoRuleEntity.cs @@ -23,19 +23,20 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Rules [BsonElement] [BsonRequired] - public int Version { get; set; } + [BsonRepresentation(BsonType.String)] + public Guid AppId { get; set; } [BsonElement] [BsonRequired] - public Guid AppId { get; set; } + [BsonJson] + public RuleState State { get; set; } [BsonElement] [BsonRequired] - public bool IsDeleted { get; set; } + public int Version { get; set; } - [BsonJson] [BsonElement] [BsonRequired] - public RuleState State { get; set; } + public bool IsDeleted { get; set; } } } diff --git a/src/Squidex.Domain.Apps.Entities.MongoDb/Rules/MongoRuleEventEntity.cs b/src/Squidex.Domain.Apps.Entities.MongoDb/Rules/MongoRuleEventEntity.cs index daa238708..bc45ae8fb 100644 --- a/src/Squidex.Domain.Apps.Entities.MongoDb/Rules/MongoRuleEventEntity.cs +++ b/src/Squidex.Domain.Apps.Entities.MongoDb/Rules/MongoRuleEventEntity.cs @@ -7,6 +7,7 @@ // ========================================================================== using System; +using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; using NodaTime; using Squidex.Domain.Apps.Core.HandleRules; @@ -20,35 +21,38 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Rules { [BsonRequired] [BsonElement] + [BsonRepresentation(BsonType.String)] public Guid AppId { get; set; } [BsonRequired] [BsonElement] - public string LastDump { get; set; } + [BsonRepresentation(BsonType.String)] + public RuleResult Result { get; set; } [BsonRequired] [BsonElement] - public int NumCalls { get; set; } + [BsonRepresentation(BsonType.String)] + public RuleJobResult JobResult { get; set; } [BsonRequired] [BsonElement] - public Instant Expires { get; set; } + [BsonJson] + public RuleJob Job { get; set; } [BsonRequired] [BsonElement] - public Instant? NextAttempt { get; set; } + public string LastDump { get; set; } [BsonRequired] [BsonElement] - public RuleResult Result { get; set; } + public int NumCalls { get; set; } [BsonRequired] [BsonElement] - public RuleJobResult JobResult { get; set; } + public Instant Expires { get; set; } [BsonRequired] [BsonElement] - [BsonJson] - public RuleJob Job { get; set; } + public Instant? NextAttempt { get; set; } } } diff --git a/src/Squidex.Domain.Apps.Entities.MongoDb/Schemas/MongoSchemaEntity.cs b/src/Squidex.Domain.Apps.Entities.MongoDb/Schemas/MongoSchemaEntity.cs index a6b75820c..f01d871f1 100644 --- a/src/Squidex.Domain.Apps.Entities.MongoDb/Schemas/MongoSchemaEntity.cs +++ b/src/Squidex.Domain.Apps.Entities.MongoDb/Schemas/MongoSchemaEntity.cs @@ -23,19 +23,20 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Schemas [BsonElement] [BsonRequired] - public string Name { get; set; } + [BsonRepresentation(BsonType.String)] + public Guid AppId { get; set; } [BsonElement] [BsonRequired] - public int Version { get; set; } + [BsonJson] + public SchemaState State { get; set; } [BsonElement] [BsonRequired] - public Guid AppId { get; set; } + public string Name { get; set; } - [BsonJson] [BsonElement] [BsonRequired] - public SchemaState State { get; set; } + public int Version { get; set; } } } diff --git a/src/Squidex.Infrastructure.MongoDb/States/MongoState.cs b/src/Squidex.Infrastructure.MongoDb/States/MongoState.cs index 6f73b1043..6a62139fc 100644 --- a/src/Squidex.Infrastructure.MongoDb/States/MongoState.cs +++ b/src/Squidex.Infrastructure.MongoDb/States/MongoState.cs @@ -21,11 +21,11 @@ namespace Squidex.Infrastructure.States [BsonRequired] [BsonElement] - public long Version { get; set; } + [BsonJson] + public T Doc { get; set; } [BsonRequired] [BsonElement] - [BsonJson] - public T Doc { get; set; } + public long Version { get; set; } } } diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Operations/ExtractReferenceIds/ReferenceExtractionTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Operations/ExtractReferenceIds/ReferenceExtractionTests.cs index 4413d1665..e7632fc9a 100644 --- a/tests/Squidex.Domain.Apps.Core.Tests/Operations/ExtractReferenceIds/ReferenceExtractionTests.cs +++ b/tests/Squidex.Domain.Apps.Core.Tests/Operations/ExtractReferenceIds/ReferenceExtractionTests.cs @@ -204,7 +204,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ExtractReferenceIds var result = sut.CleanReferences(CreateValue(id1, id2), new HashSet(new[] { id2 })); - Assert.Equal(CreateValue(id1, schemaId), result); + Assert.Equal(CreateValue(id1), result); } [Fact]