diff --git a/backend/src/Squidex.Data.EntityFramework/Squidex.Data.EntityFramework.csproj b/backend/src/Squidex.Data.EntityFramework/Squidex.Data.EntityFramework.csproj index a94855a6f..935bd5818 100644 --- a/backend/src/Squidex.Data.EntityFramework/Squidex.Data.EntityFramework.csproj +++ b/backend/src/Squidex.Data.EntityFramework/Squidex.Data.EntityFramework.csproj @@ -40,13 +40,13 @@ - - - - - - - + + + + + + + diff --git a/backend/src/Squidex.Data.MongoDb/Squidex.Data.MongoDb.csproj b/backend/src/Squidex.Data.MongoDb/Squidex.Data.MongoDb.csproj index 336a5660b..330bb94c8 100644 --- a/backend/src/Squidex.Data.MongoDb/Squidex.Data.MongoDb.csproj +++ b/backend/src/Squidex.Data.MongoDb/Squidex.Data.MongoDb.csproj @@ -25,12 +25,12 @@ - - - - - - + + + + + + diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Squidex.Domain.Apps.Core.Model.csproj b/backend/src/Squidex.Domain.Apps.Core.Model/Squidex.Domain.Apps.Core.Model.csproj index d736cf86f..648b700eb 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Squidex.Domain.Apps.Core.Model.csproj +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Squidex.Domain.Apps.Core.Model.csproj @@ -20,7 +20,7 @@ - + diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj b/backend/src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj index 453718dc8..85203c17d 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj @@ -29,8 +29,8 @@ - - + + diff --git a/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj b/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj index 695035cb2..b1436a864 100644 --- a/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj +++ b/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj @@ -24,13 +24,13 @@ - - - - - - - + + + + + + + diff --git a/backend/src/Squidex.Web/ApiExceptionConverter.cs b/backend/src/Squidex.Web/ApiExceptionConverter.cs index 10b1ee7fb..b072ae2a8 100644 --- a/backend/src/Squidex.Web/ApiExceptionConverter.cs +++ b/backend/src/Squidex.Web/ApiExceptionConverter.cs @@ -10,6 +10,7 @@ using System.Security; using System.Text; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Squidex.Events; using Squidex.Infrastructure; using Squidex.Infrastructure.Translations; using Squidex.Infrastructure.Validation; @@ -39,7 +40,6 @@ public static class ApiExceptionConverter var error = new ErrorDto { StatusCode = statusCode }; Enrich(httpContext, error); - return (error, null); } @@ -50,7 +50,6 @@ public static class ApiExceptionConverter var error = CreateError(problem.Status ?? 500, problem.Title); Enrich(httpContext, error); - return (error, null); } @@ -61,7 +60,6 @@ public static class ApiExceptionConverter var result = CreateError(exception); Enrich(httpContext, result.Error); - return result; } @@ -106,6 +104,9 @@ public static class ApiExceptionConverter case DomainException ex: return (CreateError(400, ex.Message, ex.ErrorCode), GetInner(exception)); + case EventStoreConcurrencyException ex: + return (CreateError(409, ex.Message, "CONCURRENCY_EXCEPTION"), ex); + case OperationCanceledException: return (CreateError(408), null); diff --git a/backend/src/Squidex/Squidex.csproj b/backend/src/Squidex/Squidex.csproj index 873134afe..816f2515a 100644 --- a/backend/src/Squidex/Squidex.csproj +++ b/backend/src/Squidex/Squidex.csproj @@ -60,17 +60,17 @@ - - - - - - + + + + + + - - - - + + + + @@ -84,11 +84,11 @@ - + - + diff --git a/backend/tests/Squidex.Web.Tests/ApiExceptionFilterAttributeTests.cs b/backend/tests/Squidex.Web.Tests/ApiExceptionFilterAttributeTests.cs index 853edd92c..84c67c0b9 100644 --- a/backend/tests/Squidex.Web.Tests/ApiExceptionFilterAttributeTests.cs +++ b/backend/tests/Squidex.Web.Tests/ApiExceptionFilterAttributeTests.cs @@ -13,6 +13,7 @@ using Microsoft.AspNetCore.Mvc.Abstractions; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Logging; +using Squidex.Events; using Squidex.Infrastructure; using Squidex.Infrastructure.Validation; @@ -137,6 +138,19 @@ public class ApiExceptionFilterAttributeTests .MustNotHaveHappened(); } + [Fact] + public void Should_generate_409_for_ventStoreConcurrencyException() + { + var context = Error(new EventStoreConcurrencyException("1")); + + sut.OnException(context); + + Validate(409, context.Result, context.Exception, "CONCURRENCY_EXCEPTION"); + + A.CallTo(log) + .MustHaveHappened(); + } + [Fact] public void Should_generate_410_for_DomainObjectDeletedException() { diff --git a/backend/tests/Squidex.Web.Tests/Pipeline/RequestExceptionMiddlewareTests.cs b/backend/tests/Squidex.Web.Tests/Pipeline/RequestExceptionMiddlewareTests.cs index 345941f58..038e391f2 100644 --- a/backend/tests/Squidex.Web.Tests/Pipeline/RequestExceptionMiddlewareTests.cs +++ b/backend/tests/Squidex.Web.Tests/Pipeline/RequestExceptionMiddlewareTests.cs @@ -140,7 +140,6 @@ public class RequestExceptionMiddlewareTests var failingNext = new RequestDelegate(context => { context.Response.StatusCode = 412; - return Task.CompletedTask; }); @@ -162,7 +161,6 @@ public class RequestExceptionMiddlewareTests var failingNext = new RequestDelegate(context => { context.Response.StatusCode = 412; - return Task.CompletedTask; });