From 28e8b9df917c68e76937d69a82faca18805a7566 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Mon, 16 Mar 2020 17:32:11 +0100 Subject: [PATCH] Migration improved. --- .../Contents/State/ContentState.cs | 2 +- .../Contents/Text/TextIndexingProcess.cs | 38 +++++++++++-------- .../Contents/ContentDraftCreated.cs | 2 + .../Contents/Text/TextIndexerTestsBase.cs | 34 +++++++++++++++++ .../OldEvents/ContentChangesDiscarded.cs | 2 +- .../OldEvents/ContentChangesPublished.cs | 8 +++- .../OldEvents/ContentUpdateProposed.cs | 12 +++++- 7 files changed, 79 insertions(+), 19 deletions(-) diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/State/ContentState.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/State/ContentState.cs index c4f1d2271..ca2c8dc7c 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/State/ContentState.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/State/ContentState.cs @@ -63,7 +63,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.State case ContentDraftCreated e: { - NewVersion = new ContentVersion(e.Status, CurrentVersion.Data); + NewVersion = new ContentVersion(e.Status, e.MigratedData ?? CurrentVersion.Data); ScheduleJob = null; 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 3682be4f0..3c5046491 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexingProcess.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexingProcess.cs @@ -60,10 +60,10 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text switch (@event.Payload) { case ContentCreated created: - await CreateAsync(created); + await CreateAsync(created, created.Data); break; case ContentUpdated updated: - await UpdateAsync(updated); + await UpdateAsync(updated, updated.Data); break; case ContentStatusChanged statusChanged when statusChanged.Status == Status.Published: await PublishAsync(statusChanged); @@ -71,19 +71,27 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text case ContentStatusChanged statusChanged: await UnpublishAsync(statusChanged); break; - case ContentDraftCreated draftCreated: - await CreateDraftAsync(draftCreated); - break; case ContentDraftDeleted draftDelted: await DeleteDraftAsync(draftDelted); break; case ContentDeleted deleted: await DeleteAsync(deleted); + break; + case ContentDraftCreated draftCreated: + { + await CreateDraftAsync(draftCreated); + + if (draftCreated.MigratedData != null) + { + await UpdateAsync(draftCreated, draftCreated.MigratedData); + } + } + break; } } - private async Task CreateAsync(ContentCreated @event) + private async Task CreateAsync(ContentEvent @event, NamedContentData data) { var state = new TextContentState { @@ -99,13 +107,13 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text DocId = state.DocIdCurrent, ServeAll = true, ServePublished = false, - Texts = @event.Data.ToTexts(), + Texts = data.ToTexts(), }); await textIndexerState.SetAsync(state); } - private async Task CreateDraftAsync(ContentDraftCreated @event) + private async Task CreateDraftAsync(ContentEvent @event) { var state = await textIndexerState.GetAsync(@event.ContentId); @@ -117,7 +125,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text } } - private async Task UpdateAsync(ContentUpdated @event) + private async Task UpdateAsync(ContentEvent @event, NamedContentData data) { var state = await textIndexerState.GetAsync(@event.ContentId); @@ -132,7 +140,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text DocId = state.DocIdNew, ServeAll = true, ServePublished = false, - Texts = @event.Data.ToTexts() + Texts = data.ToTexts() }, new UpdateIndexEntry { @@ -154,7 +162,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text DocId = state.DocIdCurrent, ServeAll = true, ServePublished = isPublished, - Texts = @event.Data.ToTexts() + Texts = data.ToTexts() }); state.DocIdForPublished = state.DocIdNew; @@ -164,7 +172,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text } } - private async Task UnpublishAsync(ContentStatusChanged @event) + private async Task UnpublishAsync(ContentEvent @event) { var state = await textIndexerState.GetAsync(@event.ContentId); @@ -184,7 +192,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text } } - private async Task PublishAsync(ContentStatusChanged @event) + private async Task PublishAsync(ContentEvent @event) { var state = await textIndexerState.GetAsync(@event.ContentId); @@ -226,7 +234,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text } } - private async Task DeleteDraftAsync(ContentDraftDeleted @event) + private async Task DeleteDraftAsync(ContentEvent @event) { var state = await textIndexerState.GetAsync(@event.ContentId); @@ -250,7 +258,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text } } - private async Task DeleteAsync(ContentDeleted @event) + private async Task DeleteAsync(ContentEvent @event) { var state = await textIndexerState.GetAsync(@event.ContentId); diff --git a/backend/src/Squidex.Domain.Apps.Events/Contents/ContentDraftCreated.cs b/backend/src/Squidex.Domain.Apps.Events/Contents/ContentDraftCreated.cs index efa93f57a..85a6d25ec 100644 --- a/backend/src/Squidex.Domain.Apps.Events/Contents/ContentDraftCreated.cs +++ b/backend/src/Squidex.Domain.Apps.Events/Contents/ContentDraftCreated.cs @@ -13,6 +13,8 @@ namespace Squidex.Domain.Apps.Events.Contents [EventType(nameof(ContentDraftCreated))] public sealed class ContentDraftCreated : ContentEvent { + public NamedContentData? MigratedData { get; set; } + public Status Status { get; set; } } } 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 d5f51df82..3225afa7d 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 @@ -174,6 +174,29 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text ); } + [Fact] + public async Task Should_simulate_new_version_with_migration() + { + await TestCombinations(0, + Create(ids1[0], "iv", "V1"), + + // Publish the content. + Publish(ids1[0]), + + Search(expected: ids1, text: "V1", target: SearchScope.All), + Search(expected: ids1, text: "V1", target: SearchScope.Published), + + // Create a new version, his updates the new version also. + CreateDraftWithData(ids1[0], "iv", "V2"), + + Search(expected: null, text: "V1", target: SearchScope.All), + Search(expected: ids1, text: "V1", target: SearchScope.Published), + + Search(expected: ids1, text: "V2", target: SearchScope.All), + Search(expected: null, text: "V2", target: SearchScope.Published) + ); + } + [Fact] public async Task Should_simulate_content_reversion() { @@ -275,6 +298,17 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text return Op(id, new ContentUpdated { Data = data }); } + private IndexOperation CreateDraftWithData(Guid id, string language, string text) + { + var data = + new NamedContentData() + .AddField("text", + new ContentFieldData() + .AddValue(language, text)); + + return Op(id, new ContentDraftCreated { MigratedData = data }); + } + private IndexOperation CreateDraft(Guid id) { return Op(id, new ContentDraftCreated()); diff --git a/backend/tools/Migrate_01/OldEvents/ContentChangesDiscarded.cs b/backend/tools/Migrate_01/OldEvents/ContentChangesDiscarded.cs index 70b4f6e32..33d87550a 100644 --- a/backend/tools/Migrate_01/OldEvents/ContentChangesDiscarded.cs +++ b/backend/tools/Migrate_01/OldEvents/ContentChangesDiscarded.cs @@ -19,7 +19,7 @@ namespace Migrate_01.OldEvents { public IEvent Migrate() { - return SimpleMapper.Map(this, new NoopConventEvent()); + return SimpleMapper.Map(this, new ContentDraftDeleted()); } } } diff --git a/backend/tools/Migrate_01/OldEvents/ContentChangesPublished.cs b/backend/tools/Migrate_01/OldEvents/ContentChangesPublished.cs index a80411e1e..dd4e74345 100644 --- a/backend/tools/Migrate_01/OldEvents/ContentChangesPublished.cs +++ b/backend/tools/Migrate_01/OldEvents/ContentChangesPublished.cs @@ -6,10 +6,12 @@ // ========================================================================== using System; +using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Events.Contents; using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Migrations; using Squidex.Infrastructure.Reflection; +using ContentStatusChangedV2 = Squidex.Domain.Apps.Events.Contents.ContentStatusChanged; namespace Migrate_01.OldEvents { @@ -19,7 +21,11 @@ namespace Migrate_01.OldEvents { public IEvent Migrate() { - return SimpleMapper.Map(this, new ContentSchedulingCancelled()); + return SimpleMapper.Map(this, new ContentStatusChangedV2 + { + Status = Status.Published, + Change = StatusChange.Published + }); } } } diff --git a/backend/tools/Migrate_01/OldEvents/ContentUpdateProposed.cs b/backend/tools/Migrate_01/OldEvents/ContentUpdateProposed.cs index 80da7253e..9ad2445b4 100644 --- a/backend/tools/Migrate_01/OldEvents/ContentUpdateProposed.cs +++ b/backend/tools/Migrate_01/OldEvents/ContentUpdateProposed.cs @@ -8,6 +8,7 @@ using System; using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Events; +using Squidex.Domain.Apps.Events.Contents; using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Migrations; using Squidex.Infrastructure.Reflection; @@ -22,7 +23,16 @@ namespace Migrate_01.OldEvents public IEvent Migrate() { - return SimpleMapper.Map(this, new NoopConventEvent()); + var migrated = SimpleMapper.Map(this, new ContentDraftCreated()); + + migrated.MigratedData = Data; + + if (migrated.Status == default) + { + migrated.Status = Status.Draft; + } + + return migrated; } } }