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