From 9f25000ebe2327c184922ebf351398290963cb53 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Mon, 12 Oct 2020 17:08:14 +0200 Subject: [PATCH] Allow updating data in change scripts. --- .../Contents/ContentDomainObject.cs | 15 +++++-- .../Contents/ContentDomainObjectTests.cs | 40 ++++++++++++++++--- .../settings/pages/roles/role.component.html | 2 +- 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentDomainObject.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentDomainObject.cs index 98b125055..96612236c 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentDomainObject.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentDomainObject.cs @@ -88,7 +88,7 @@ namespace Squidex.Domain.Apps.Entities.Contents if (!c.DoNotScript && c.Publish) { - await context.ExecuteScriptAsync(s => s.Change, + c.Data = await context.ExecuteScriptAndTransformAsync(s => s.Change, new ScriptVars { Operation = "Published", @@ -164,14 +164,23 @@ namespace Squidex.Domain.Apps.Entities.Contents if (!c.DoNotScript) { - await context.ExecuteScriptAsync(s => s.Change, + var data = Snapshot.Data.Clone(); + + var newData = await context.ExecuteScriptAndTransformAsync(s => s.Change, new ScriptVars { Operation = change.ToString(), - Data = Snapshot.Data, + Data = data, Status = c.Status, StatusOld = Snapshot.EditingStatus }); + + if (!newData.Equals(Snapshot.Data)) + { + var command = SimpleMapper.Map(c, new UpdateContent { Data = newData }); + + Update(command, newData); + } } ChangeStatus(c, change); diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentDomainObjectTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentDomainObjectTests.cs index 7c569611e..0e84bd8b4 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentDomainObjectTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentDomainObjectTests.cs @@ -166,7 +166,7 @@ namespace Squidex.Domain.Apps.Entities.Contents A.CallTo(() => scriptEngine.TransformAsync(ScriptContext(data, null, Status.Draft), "", ScriptOptions())) .MustHaveHappened(); - A.CallTo(() => scriptEngine.ExecuteAsync(ScriptContext(data, null, Status.Published), "", ScriptOptions())) + A.CallTo(() => scriptEngine.TransformAsync(ScriptContext(data, null, Status.Published), "", ScriptOptions())) .MustHaveHappened(); } @@ -332,7 +332,7 @@ namespace Squidex.Domain.Apps.Entities.Contents CreateContentEvent(new ContentStatusChanged { Status = Status.Published, Change = StatusChange.Published }) ); - A.CallTo(() => scriptEngine.ExecuteAsync(ScriptContext(data, null, Status.Published, Status.Draft), "", ScriptOptions())) + A.CallTo(() => scriptEngine.TransformAsync(ScriptContext(data, null, Status.Published, Status.Draft), "", ScriptOptions())) .MustHaveHappened(); } @@ -354,7 +354,7 @@ namespace Squidex.Domain.Apps.Entities.Contents CreateContentEvent(new ContentStatusChanged { Status = Status.Archived }) ); - A.CallTo(() => scriptEngine.ExecuteAsync(ScriptContext(data, null, Status.Archived, Status.Draft), "", ScriptOptions())) + A.CallTo(() => scriptEngine.TransformAsync(ScriptContext(data, null, Status.Archived, Status.Draft), "", ScriptOptions())) .MustHaveHappened(); } @@ -377,7 +377,35 @@ namespace Squidex.Domain.Apps.Entities.Contents CreateContentEvent(new ContentStatusChanged { Status = Status.Draft, Change = StatusChange.Unpublished }) ); - A.CallTo(() => scriptEngine.ExecuteAsync(ScriptContext(data, null, Status.Draft, Status.Published), "", ScriptOptions())) + A.CallTo(() => scriptEngine.TransformAsync(ScriptContext(data, null, Status.Draft, Status.Published), "", ScriptOptions())) + .MustHaveHappened(); + } + + [Fact] + public async Task ChangeStatus_should_also_update_when_script_changes_data() + { + var command = new ChangeContentStatus { Status = Status.Draft }; + + A.CallTo(() => scriptEngine.TransformAsync(ScriptContext(data, null, Status.Draft, Status.Published), "", ScriptOptions())) + .Returns(otherData); + + await ExecuteCreateAsync(); + await ExecutePublishAsync(); + + var result = await PublishAsync(command); + + result.ShouldBeEquivalent(sut.Snapshot); + + Assert.Equal(Status.Draft, sut.Snapshot.CurrentVersion.Status); + Assert.Equal(otherData, sut.Snapshot.CurrentVersion.Data); + + LastEvents + .ShouldHaveSameEvents( + CreateContentEvent(new ContentUpdated { Data = otherData }), + CreateContentEvent(new ContentStatusChanged { Status = Status.Draft, Change = StatusChange.Unpublished }) + ); + + A.CallTo(() => scriptEngine.TransformAsync(ScriptContext(data, null, Status.Draft, Status.Published), "", ScriptOptions())) .MustHaveHappened(); } @@ -401,7 +429,7 @@ namespace Squidex.Domain.Apps.Entities.Contents CreateContentEvent(new ContentStatusChanged { Change = StatusChange.Change, Status = Status.Archived }) ); - A.CallTo(() => scriptEngine.ExecuteAsync(ScriptContext(data, null, Status.Archived, Status.Draft), "", ScriptOptions())) + A.CallTo(() => scriptEngine.TransformAsync(ScriptContext(data, null, Status.Archived, Status.Draft), "", ScriptOptions())) .MustHaveHappened(); } @@ -456,7 +484,7 @@ namespace Squidex.Domain.Apps.Entities.Contents CreateContentEvent(new ContentStatusChanged { Status = Status.Archived }) ); - A.CallTo(() => scriptEngine.ExecuteAsync(A._, "", ScriptOptions())) + A.CallTo(() => scriptEngine.TransformAsync(A._, "", ScriptOptions())) .MustHaveHappened(); } diff --git a/frontend/app/features/settings/pages/roles/role.component.html b/frontend/app/features/settings/pages/roles/role.component.html index 06a40c331..e50a25b6c 100644 --- a/frontend/app/features/settings/pages/roles/role.component.html +++ b/frontend/app/features/settings/pages/roles/role.component.html @@ -69,7 +69,7 @@ {{descriptions[role.name] | sqxTranslate}} - +
{{control.value}}