diff --git a/src/Squidex.Domain.Apps.Core.Model/Contents/ContentData.cs b/src/Squidex.Domain.Apps.Core.Model/Contents/ContentData.cs index 81f11e599..548a88ae3 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Contents/ContentData.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Contents/ContentData.cs @@ -31,20 +31,25 @@ namespace Squidex.Domain.Apps.Core.Contents { } - protected static TResult Merge(TResult source, TResult target) where TResult : ContentData + protected static TResult Merge(TResult target, TResult source1, TResult source2) where TResult : ContentData { - if (ReferenceEquals(target, source)) + if (ReferenceEquals(source1, source2)) { - return source; + return source1; } - foreach (var otherValue in source) - { - var fieldValue = target.GetOrAdd(otherValue.Key, x => new ContentFieldData()); + var sources = new[] { source1, source2 }; - foreach (var value in otherValue.Value) + foreach (var source in sources) + { + foreach (var otherValue in source) { - fieldValue[value.Key] = value.Value; + var fieldValue = target.GetOrAdd(otherValue.Key, x => new ContentFieldData()); + + foreach (var value in otherValue.Value) + { + fieldValue[value.Key] = value.Value; + } } } diff --git a/src/Squidex.Domain.Apps.Core.Model/Contents/IdContentData.cs b/src/Squidex.Domain.Apps.Core.Model/Contents/IdContentData.cs index 524e90f82..e04e88310 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Contents/IdContentData.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Contents/IdContentData.cs @@ -26,7 +26,7 @@ namespace Squidex.Domain.Apps.Core.Contents public IdContentData MergeInto(IdContentData target) { - return Merge(this, target); + return Merge(new IdContentData(), this, target); } public IdContentData ToCleaned() diff --git a/src/Squidex.Domain.Apps.Core.Model/Contents/NamedContentData.cs b/src/Squidex.Domain.Apps.Core.Model/Contents/NamedContentData.cs index 71cc639f0..e6f452d66 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Contents/NamedContentData.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Contents/NamedContentData.cs @@ -7,6 +7,7 @@ // ========================================================================== using System; +using System.Collections.Generic; using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Core.Contents @@ -18,9 +19,14 @@ namespace Squidex.Domain.Apps.Core.Contents { } + public NamedContentData(NamedContentData copy) + : base(copy, EqualityComparer.Default) + { + } + public NamedContentData MergeInto(NamedContentData target) { - return Merge(this, target); + return Merge(new NamedContentData(), this, target); } public NamedContentData ToCleaned() diff --git a/src/Squidex.Domain.Apps.Entities.MongoDb/History/MongoHistoryEventRepository.cs b/src/Squidex.Domain.Apps.Entities.MongoDb/History/MongoHistoryEventRepository.cs index 169ed0df3..2e876f414 100644 --- a/src/Squidex.Domain.Apps.Entities.MongoDb/History/MongoHistoryEventRepository.cs +++ b/src/Squidex.Domain.Apps.Entities.MongoDb/History/MongoHistoryEventRepository.cs @@ -90,7 +90,14 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.History entity.AppId = appEvent.AppId.Id; - entity.Version = @event.Headers.EventStreamNumber(); + if (@event.Headers.Contains(CommonHeaders.SnapshotVersion)) + { + entity.Version = @event.Headers.SnapshotVersion(); + } + else + { + entity.Version = @event.Headers.EventStreamNumber(); + } entity.Channel = message.Channel; entity.Message = message.Message; diff --git a/src/Squidex.Domain.Apps.Entities/Contents/ContentDomainObject.cs b/src/Squidex.Domain.Apps.Entities/Contents/ContentDomainObject.cs index 493064167..1c0a712d8 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/ContentDomainObject.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/ContentDomainObject.cs @@ -71,7 +71,11 @@ namespace Squidex.Domain.Apps.Entities.Contents if (!newData.Equals(State.Data)) { - RaiseEvent(SimpleMapper.Map(command, new ContentUpdated { Data = newData })); + var @event = SimpleMapper.Map(command, new ContentUpdated()); + + @event.Data = newData; + + RaiseEvent(@event); } return this; diff --git a/src/Squidex.Infrastructure/Commands/DomainObjectBase.cs b/src/Squidex.Infrastructure/Commands/DomainObjectBase.cs index 56149843b..840440bde 100644 --- a/src/Squidex.Infrastructure/Commands/DomainObjectBase.cs +++ b/src/Squidex.Infrastructure/Commands/DomainObjectBase.cs @@ -97,6 +97,11 @@ namespace Squidex.Infrastructure.Commands { state.Version += events.Length; + foreach (var @event in events) + { + @event.SetSnapshotVersion(state.Version); + } + await persistence.WriteSnapshotAsync(state); try diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/ContentDataTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/ContentDataTests.cs index f9fe1e6f8..f885789a3 100644 --- a/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/ContentDataTests.cs +++ b/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/ContentDataTests.cs @@ -113,6 +113,8 @@ namespace Squidex.Domain.Apps.Core.Model.Contents var actual = lhs.MergeInto(rhs); Assert.Equal(expected, actual); + Assert.NotSame(expected, rhs); + Assert.NotSame(expected, lhs); } [Fact] @@ -152,6 +154,8 @@ namespace Squidex.Domain.Apps.Core.Model.Contents var actual = lhs.MergeInto(rhs); Assert.Equal(expected, actual); + Assert.NotSame(expected, rhs); + Assert.NotSame(expected, lhs); } [Fact] diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentDomainObjectTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentDomainObjectTests.cs index a92c0570f..11f32b962 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentDomainObjectTests.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentDomainObjectTests.cs @@ -29,6 +29,7 @@ namespace Squidex.Domain.Apps.Entities.Contents .AddField("field2", new ContentFieldData() .AddValue("iv", 2)); + private readonly NamedContentData patched; private readonly Guid contentId = Guid.NewGuid(); private readonly ContentDomainObject sut = new ContentDomainObject(); @@ -37,6 +38,11 @@ namespace Squidex.Domain.Apps.Entities.Contents get { return contentId; } } + public ContentDomainObjectTests() + { + patched = otherData.MergeInto(data); + } + [Fact] public void Create_should_throw_exception_if_created() { @@ -141,12 +147,13 @@ namespace Squidex.Domain.Apps.Entities.Contents public void Patch_should_create_events() { CreateContent(); + UpdateContent(); sut.Patch(CreateContentCommand(new PatchContent { Data = otherData })); sut.GetUncomittedEvents() .ShouldHaveSameEvents( - CreateContentEvent(new ContentUpdated { Data = otherData }) + CreateContentEvent(new ContentUpdated { Data = patched }) ); }