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:
{
NewVersion = new ContentVersion(e.Status, CurrentVersion.Data);
NewVersion = new ContentVersion(e.Status, e.MigratedData ?? CurrentVersion.Data);
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)
{
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);

2
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; }
}
}

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]
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());

2
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());
}
}
}

8
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
});
}
}
}

12
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;
}
}
}

Loading…
Cancel
Save