Browse Source

Migration improved.

pull/502/head
Sebastian 6 years ago
parent
commit
28e8b9df91
  1. 2
      backend/src/Squidex.Domain.Apps.Entities/Contents/State/ContentState.cs
  2. 38
      backend/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexingProcess.cs
  3. 2
      backend/src/Squidex.Domain.Apps.Events/Contents/ContentDraftCreated.cs
  4. 34
      backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerTestsBase.cs
  5. 2
      backend/tools/Migrate_01/OldEvents/ContentChangesDiscarded.cs
  6. 8
      backend/tools/Migrate_01/OldEvents/ContentChangesPublished.cs
  7. 12
      backend/tools/Migrate_01/OldEvents/ContentUpdateProposed.cs

2
backend/src/Squidex.Domain.Apps.Entities/Contents/State/ContentState.cs

@ -63,7 +63,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.State
case ContentDraftCreated e: case ContentDraftCreated e:
{ {
NewVersion = new ContentVersion(e.Status, CurrentVersion.Data); NewVersion = new ContentVersion(e.Status, e.MigratedData ?? CurrentVersion.Data);
ScheduleJob = null; ScheduleJob = null;

38
backend/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexingProcess.cs

@ -60,10 +60,10 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
switch (@event.Payload) switch (@event.Payload)
{ {
case ContentCreated created: case ContentCreated created:
await CreateAsync(created); await CreateAsync(created, created.Data);
break; break;
case ContentUpdated updated: case ContentUpdated updated:
await UpdateAsync(updated); await UpdateAsync(updated, updated.Data);
break; break;
case ContentStatusChanged statusChanged when statusChanged.Status == Status.Published: case ContentStatusChanged statusChanged when statusChanged.Status == Status.Published:
await PublishAsync(statusChanged); await PublishAsync(statusChanged);
@ -71,19 +71,27 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
case ContentStatusChanged statusChanged: case ContentStatusChanged statusChanged:
await UnpublishAsync(statusChanged); await UnpublishAsync(statusChanged);
break; break;
case ContentDraftCreated draftCreated:
await CreateDraftAsync(draftCreated);
break;
case ContentDraftDeleted draftDelted: case ContentDraftDeleted draftDelted:
await DeleteDraftAsync(draftDelted); await DeleteDraftAsync(draftDelted);
break; break;
case ContentDeleted deleted: case ContentDeleted deleted:
await DeleteAsync(deleted); await DeleteAsync(deleted);
break;
case ContentDraftCreated draftCreated:
{
await CreateDraftAsync(draftCreated);
if (draftCreated.MigratedData != null)
{
await UpdateAsync(draftCreated, draftCreated.MigratedData);
}
}
break; break;
} }
} }
private async Task CreateAsync(ContentCreated @event) private async Task CreateAsync(ContentEvent @event, NamedContentData data)
{ {
var state = new TextContentState var state = new TextContentState
{ {
@ -99,13 +107,13 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
DocId = state.DocIdCurrent, DocId = state.DocIdCurrent,
ServeAll = true, ServeAll = true,
ServePublished = false, ServePublished = false,
Texts = @event.Data.ToTexts(), Texts = data.ToTexts(),
}); });
await textIndexerState.SetAsync(state); await textIndexerState.SetAsync(state);
} }
private async Task CreateDraftAsync(ContentDraftCreated @event) private async Task CreateDraftAsync(ContentEvent @event)
{ {
var state = await textIndexerState.GetAsync(@event.ContentId); 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); var state = await textIndexerState.GetAsync(@event.ContentId);
@ -132,7 +140,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
DocId = state.DocIdNew, DocId = state.DocIdNew,
ServeAll = true, ServeAll = true,
ServePublished = false, ServePublished = false,
Texts = @event.Data.ToTexts() Texts = data.ToTexts()
}, },
new UpdateIndexEntry new UpdateIndexEntry
{ {
@ -154,7 +162,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
DocId = state.DocIdCurrent, DocId = state.DocIdCurrent,
ServeAll = true, ServeAll = true,
ServePublished = isPublished, ServePublished = isPublished,
Texts = @event.Data.ToTexts() Texts = data.ToTexts()
}); });
state.DocIdForPublished = state.DocIdNew; 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); 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); 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); 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); var state = await textIndexerState.GetAsync(@event.ContentId);

2
backend/src/Squidex.Domain.Apps.Events/Contents/ContentDraftCreated.cs

@ -13,6 +13,8 @@ namespace Squidex.Domain.Apps.Events.Contents
[EventType(nameof(ContentDraftCreated))] [EventType(nameof(ContentDraftCreated))]
public sealed class ContentDraftCreated : ContentEvent public sealed class ContentDraftCreated : ContentEvent
{ {
public NamedContentData? MigratedData { get; set; }
public Status Status { get; set; } public Status Status { get; set; }
} }
} }

34
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] [Fact]
public async Task Should_simulate_content_reversion() 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 }); 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) private IndexOperation CreateDraft(Guid id)
{ {
return Op(id, new ContentDraftCreated()); return Op(id, new ContentDraftCreated());

2
backend/tools/Migrate_01/OldEvents/ContentChangesDiscarded.cs

@ -19,7 +19,7 @@ namespace Migrate_01.OldEvents
{ {
public IEvent Migrate() public IEvent Migrate()
{ {
return SimpleMapper.Map(this, new NoopConventEvent()); return SimpleMapper.Map(this, new ContentDraftDeleted());
} }
} }
} }

8
backend/tools/Migrate_01/OldEvents/ContentChangesPublished.cs

@ -6,10 +6,12 @@
// ========================================================================== // ==========================================================================
using System; using System;
using Squidex.Domain.Apps.Core.Contents;
using Squidex.Domain.Apps.Events.Contents; using Squidex.Domain.Apps.Events.Contents;
using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.EventSourcing;
using Squidex.Infrastructure.Migrations; using Squidex.Infrastructure.Migrations;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using ContentStatusChangedV2 = Squidex.Domain.Apps.Events.Contents.ContentStatusChanged;
namespace Migrate_01.OldEvents namespace Migrate_01.OldEvents
{ {
@ -19,7 +21,11 @@ namespace Migrate_01.OldEvents
{ {
public IEvent Migrate() public IEvent Migrate()
{ {
return SimpleMapper.Map(this, new ContentSchedulingCancelled()); return SimpleMapper.Map(this, new ContentStatusChangedV2
{
Status = Status.Published,
Change = StatusChange.Published
});
} }
} }
} }

12
backend/tools/Migrate_01/OldEvents/ContentUpdateProposed.cs

@ -8,6 +8,7 @@
using System; using System;
using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.Contents;
using Squidex.Domain.Apps.Events; using Squidex.Domain.Apps.Events;
using Squidex.Domain.Apps.Events.Contents;
using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.EventSourcing;
using Squidex.Infrastructure.Migrations; using Squidex.Infrastructure.Migrations;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
@ -22,7 +23,16 @@ namespace Migrate_01.OldEvents
public IEvent Migrate() 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;
} }
} }
} }

Loading…
Cancel
Save