From 0709df2ca23907a83527d073d6271b8cae83c111 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Fri, 26 Jul 2019 19:46:16 +0200 Subject: [PATCH] Finalized --- .../Contents/ContentGrain.cs | 63 +++++++++++++++---- .../Contents/ContentOperationContext.cs | 51 ++++----------- 2 files changed, 63 insertions(+), 51 deletions(-) diff --git a/src/Squidex.Domain.Apps.Entities/Contents/ContentGrain.cs b/src/Squidex.Domain.Apps.Entities/Contents/ContentGrain.cs index 70c910dd2..15d8d33f9 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/ContentGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/ContentGrain.cs @@ -66,13 +66,21 @@ namespace Squidex.Domain.Apps.Entities.Contents case CreateContent createContent: return CreateReturnAsync(createContent, async c => { - var ctx = await CreateContext(c.AppId.Id, c.SchemaId.Id, Guid.Empty, () => "Failed to create content."); + var ctx = await CreateContext(c.AppId.Id, c.SchemaId.Id, c, () => "Failed to create content."); - var statusInfo = await contentWorkflow.GetInitialStatusAsync(ctx.Schema); + var status = (await contentWorkflow.GetInitialStatusAsync(ctx.Schema)).Status; await GuardContent.CanCreate(ctx.Schema, contentWorkflow, c); - await ctx.ExecuteScriptAndTransformAsync(s => s.Create, "Create", c, c.Data, statusInfo.Status); + c.Data = await ctx.ExecuteScriptAndTransformAsync(s => s.Create, + new ScriptContext + { + Operation = "Create", + Data = c.Data, + Status = status, + StatusOld = default + }); + await ctx.EnrichAsync(c.Data); if (!c.DoNotValidate) @@ -82,10 +90,17 @@ namespace Squidex.Domain.Apps.Entities.Contents if (c.Publish) { - await ctx.ExecuteScriptAsync(s => s.Change, "Published", c, c.Data, Status.Published); + await ctx.ExecuteScriptAsync(s => s.Change, + new ScriptContext + { + Operation = "Published", + Data = c.Data, + Status = Status.Published, + StatusOld = status + }); } - Create(c, statusInfo.Status); + Create(c, status); return Snapshot; }); @@ -117,7 +132,7 @@ namespace Squidex.Domain.Apps.Entities.Contents { var isChangeConfirm = Snapshot.IsPending && Snapshot.Status == Status.Published && c.Status == Status.Published; - var ctx = await CreateContext(Snapshot.AppId.Id, Snapshot.SchemaId.Id, Snapshot.Id, () => "Failed to change content."); + var ctx = await CreateContext(Snapshot.AppId.Id, Snapshot.SchemaId.Id, c, () => "Failed to change content."); await GuardContent.CanChangeStatus(ctx.Schema, Snapshot, contentWorkflow, c, isChangeConfirm); @@ -148,7 +163,14 @@ namespace Squidex.Domain.Apps.Entities.Contents reason = StatusChange.Change; } - await ctx.ExecuteScriptAsync(s => s.Change, reason, c, null, c.Status); + await ctx.ExecuteScriptAsync(s => s.Change, + new ScriptContext + { + Operation = reason.ToString(), + Data = Snapshot.Data, + Status = c.Status, + StatusOld = Snapshot.Status + }); ChangeStatus(c, reason); } @@ -182,11 +204,18 @@ namespace Squidex.Domain.Apps.Entities.Contents case DeleteContent deleteContent: return UpdateAsync(deleteContent, async c => { - var ctx = await CreateContext(Snapshot.AppId.Id, Snapshot.SchemaId.Id, Snapshot.Id, () => "Failed to delete content."); + var ctx = await CreateContext(Snapshot.AppId.Id, Snapshot.SchemaId.Id, c, () => "Failed to delete content."); GuardContent.CanDelete(ctx.Schema, c); - await ctx.ExecuteScriptAsync(s => s.Delete, "Delete", c, null); + await ctx.ExecuteScriptAsync(s => s.Delete, + new ScriptContext + { + Operation = "Delete", + Data = Snapshot.Data, + Status = Snapshot.Status, + StatusOld = default + }); Delete(c); }); @@ -207,7 +236,7 @@ namespace Squidex.Domain.Apps.Entities.Contents if (!currentData.Equals(newData)) { - var ctx = await CreateContext(Snapshot.AppId.Id, Snapshot.SchemaId.Id, Snapshot.Id, () => "Failed to update content."); + var ctx = await CreateContext(Snapshot.AppId.Id, Snapshot.SchemaId.Id, command, () => "Failed to update content."); if (partial) { @@ -218,7 +247,15 @@ namespace Squidex.Domain.Apps.Entities.Contents await ctx.ValidateAsync(command.Data); } - newData = await ctx.ExecuteScriptAndTransformAsync(s => s.Update, "Update", command, newData); + newData = await ctx.ExecuteScriptAndTransformAsync(s => s.Update, + new ScriptContext + { + Operation = "Create", + Data = newData, + DataOld = currentData, + Status = Snapshot.Status, + StatusOld = default + }); if (isProposal) { @@ -306,10 +343,10 @@ namespace Squidex.Domain.Apps.Entities.Contents } } - private async Task CreateContext(Guid appId, Guid schemaId, Guid contentId, Func message) + private async Task CreateContext(Guid appId, Guid schemaId, ContentCommand command, Func message) { var operationContext = - await ContentOperationContext.CreateAsync(appId, schemaId, contentId, Snapshot, + await ContentOperationContext.CreateAsync(appId, schemaId, command, appProvider, assetRepository, contentRepository, scriptEngine, message); return operationContext; diff --git a/src/Squidex.Domain.Apps.Entities/Contents/ContentOperationContext.cs b/src/Squidex.Domain.Apps.Entities/Contents/ContentOperationContext.cs index ee7bf9bdb..3ff9ae501 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/ContentOperationContext.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/ContentOperationContext.cs @@ -30,8 +30,7 @@ namespace Squidex.Domain.Apps.Entities.Contents private IScriptEngine scriptEngine; private ISchemaEntity schemaEntity; private IAppEntity appEntity; - private IContentEntity contentEntity; - private Guid contentId; + private ContentCommand command; private Guid schemaId; private Func message; @@ -43,8 +42,7 @@ namespace Squidex.Domain.Apps.Entities.Contents public static async Task CreateAsync( Guid appId, Guid schemaId, - Guid contentId, - IContentEntity contentEntity, + ContentCommand command, IAppProvider appProvider, IAssetRepository assetRepository, IContentRepository contentRepository, @@ -57,8 +55,7 @@ namespace Squidex.Domain.Apps.Entities.Contents { appEntity = appEntity, assetRepository = assetRepository, - contentId = contentId, - contentEntity = contentEntity, + command = command, contentRepository = contentRepository, message = message, schemaId = schemaId, @@ -90,56 +87,34 @@ namespace Squidex.Domain.Apps.Entities.Contents return data.ValidatePartialAsync(ctx, schemaEntity.SchemaDef, appEntity.PartitionResolver(), message); } - public Task ExecuteScriptAndTransformAsync(Func script, object operation, ContentCommand command, - NamedContentData data, Status? status = null) + public Task ExecuteScriptAndTransformAsync(Func script, ScriptContext context) { - var ctx = CreateScriptContext(operation, command, data, status); + Enrich(context); - var result = scriptEngine.ExecuteAndTransform(ctx, GetScript(script)); + var result = scriptEngine.ExecuteAndTransform(context, GetScript(script)); return Task.FromResult(result); } - public Task ExecuteScriptAsync(Func script, object operation, ContentCommand command, - NamedContentData data, Status? status = null) + public Task ExecuteScriptAsync(Func script, ScriptContext context) { - var ctx = CreateScriptContext(operation, command, data, status); + Enrich(context); - scriptEngine.Execute(ctx, GetScript(script)); + scriptEngine.Execute(context, GetScript(script)); return TaskHelper.Done; } - private ScriptContext CreateScriptContext(object operation, ContentCommand command, NamedContentData data, Status? status) + private void Enrich(ScriptContext context) { - var result = new ScriptContext { ContentId = command.ContentId, Data = data, User = command.User, Operation = operation.ToString() }; + context.ContentId = command.ContentId; - if (data != null) - { - result.Data = data; - result.DataOld = contentEntity?.Data; - } - else - { - result.Data = contentEntity?.Data; - } - - if (status.HasValue) - { - result.Status = status.Value; - result.StatusOld = contentEntity?.Status ?? default; - } - else - { - result.Status = contentEntity?.Status ?? default; - } - - return result; + context.User = command.User; } private ValidationContext CreateValidationContext() { - return new ValidationContext(contentId, schemaId, QueryContentsAsync, QueryAssetsAsync); + return new ValidationContext(command.ContentId, schemaId, QueryContentsAsync, QueryAssetsAsync); } private async Task> QueryAssetsAsync(IEnumerable assetIds)