From e9fa1990cae496a41dc29035f491a1b866c71683 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Sat, 27 Jul 2019 10:26:08 +0200 Subject: [PATCH] GraphQL error handling. --- .../Contents/ContentGrain.cs | 49 ++++++++++++------- .../GraphQL/GraphQLExecutionContext.cs | 5 +- .../{LoggingMiddleware.cs => Middlewares.cs} | 23 ++++++++- 3 files changed, 54 insertions(+), 23 deletions(-) rename src/Squidex.Domain.Apps.Entities/Contents/GraphQL/{LoggingMiddleware.cs => Middlewares.cs} (67%) diff --git a/src/Squidex.Domain.Apps.Entities/Contents/ContentGrain.cs b/src/Squidex.Domain.Apps.Entities/Contents/ContentGrain.cs index 15d8d33f9..049115820 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/ContentGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/ContentGrain.cs @@ -118,7 +118,7 @@ namespace Squidex.Domain.Apps.Entities.Contents case PatchContent patchContent: return UpdateReturnAsync(patchContent, async c => { - var isProposal = c.AsDraft && Snapshot.Status == Status.Published; + var isProposal = IsProposal(c); await GuardContent.CanPatch(Snapshot, contentWorkflow, c, isProposal); @@ -130,7 +130,7 @@ namespace Squidex.Domain.Apps.Entities.Contents { try { - var isChangeConfirm = Snapshot.IsPending && Snapshot.Status == Status.Published && c.Status == Status.Published; + var isChangeConfirm = IsConfirm(c); var ctx = await CreateContext(Snapshot.AppId.Id, Snapshot.SchemaId.Id, c, () => "Failed to change content."); @@ -148,31 +148,18 @@ namespace Squidex.Domain.Apps.Entities.Contents } else { - StatusChange reason; - - if (c.Status == Status.Published) - { - reason = StatusChange.Published; - } - else if (Snapshot.Status == Status.Published) - { - reason = StatusChange.Unpublished; - } - else - { - reason = StatusChange.Change; - } + var change = GetChange(c); await ctx.ExecuteScriptAsync(s => s.Change, new ScriptContext { - Operation = reason.ToString(), + Operation = change.ToString(), Data = Snapshot.Data, Status = c.Status, StatusOld = Snapshot.Status }); - ChangeStatus(c, reason); + ChangeStatus(c, change); } } } @@ -335,6 +322,32 @@ namespace Squidex.Domain.Apps.Entities.Contents RaiseEvent(Envelope.Create(@event)); } + private bool IsConfirm(ChangeContentStatus command) + { + return Snapshot.IsPending && Snapshot.Status == Status.Published && command.Status == Status.Published; + } + + private bool IsProposal(PatchContent command) + { + return Snapshot.Status == Status.Published && command.AsDraft; + } + + private StatusChange GetChange(ChangeContentStatus command) + { + var change = StatusChange.Change; + + if (command.Status == Status.Published) + { + change = StatusChange.Published; + } + else if (Snapshot.Status == Status.Published) + { + change = StatusChange.Unpublished; + } + + return change; + } + private void VerifyNotDeleted() { if (Snapshot.IsDeleted) diff --git a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLExecutionContext.cs b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLExecutionContext.cs index 3841ac148..d320f7f4f 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLExecutionContext.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLExecutionContext.cs @@ -45,10 +45,9 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL { var loader = resolver.Resolve(); - var logger = LoggingMiddleware.Create(resolver.Resolve()); - execution.Listeners.Add(loader); - execution.FieldMiddleware.Use(logger); + execution.FieldMiddleware.Use(Middlewares.Logging(resolver.Resolve())); + execution.FieldMiddleware.Use(Middlewares.Errors()); execution.UserContext = this; } diff --git a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/LoggingMiddleware.cs b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Middlewares.cs similarity index 67% rename from src/Squidex.Domain.Apps.Entities/Contents/GraphQL/LoggingMiddleware.cs rename to src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Middlewares.cs index 9db32cab0..e5198342f 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/LoggingMiddleware.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Middlewares.cs @@ -6,15 +6,16 @@ // ========================================================================== using System; +using GraphQL; using GraphQL.Instrumentation; using Squidex.Infrastructure; using Squidex.Infrastructure.Log; namespace Squidex.Domain.Apps.Entities.Contents.GraphQL { - public static class LoggingMiddleware + public static class Middlewares { - public static Func Create(ISemanticLog log) + public static Func Logging(ISemanticLog log) { Guard.NotNull(log, nameof(log)); @@ -38,5 +39,23 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL }; }); } + + public static Func Errors() + { + return new Func(next => + { + return async context => + { + try + { + return await next(context); + } + catch (DomainException ex) + { + throw new ExecutionError(ex.Message); + } + }; + }); + } } }