diff --git a/prop-docker.sh b/prop-docker.sh new file mode 100755 index 0000000000..b18a8b8d54 --- /dev/null +++ b/prop-docker.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +docker run --rm --name jsonapi-dotnet-core-testing \ + -e POSTGRES_DB=JsonApiDotNetCoreExample \ + -e POSTGRES_USER=postgres \ + -e POSTGRES_PASSWORD=postgres \ + -p 5432:5432 \ + postgres diff --git a/src/JsonApiDotNetCore/Controllers/JsonApiControllerMixin.cs b/src/JsonApiDotNetCore/Controllers/JsonApiControllerMixin.cs index 8c3099dde1..b80d912bed 100644 --- a/src/JsonApiDotNetCore/Controllers/JsonApiControllerMixin.cs +++ b/src/JsonApiDotNetCore/Controllers/JsonApiControllerMixin.cs @@ -14,36 +14,12 @@ protected IActionResult Forbidden() protected IActionResult Error(Error error) { - var errorCollection = new ErrorCollection - { - Errors = new List { error } - }; - - return new ObjectResult(errorCollection) - { - StatusCode = error.StatusCode - }; + return error.AsActionResult(); } protected IActionResult Errors(ErrorCollection errors) { - return new ObjectResult(errors) - { - StatusCode = GetErrorStatusCode(errors) - }; - } - - private int GetErrorStatusCode(ErrorCollection errors) - { - var statusCodes = errors.Errors - .Select(e => e.StatusCode) - .Distinct() - .ToList(); - - if (statusCodes.Count == 1) - return statusCodes[0]; - - return int.Parse(statusCodes.Max().ToString()[0] + "00"); + return errors.AsActionResult(); } } } diff --git a/src/JsonApiDotNetCore/Internal/Error.cs b/src/JsonApiDotNetCore/Internal/Error.cs index 71852e28ea..7e45f65be3 100644 --- a/src/JsonApiDotNetCore/Internal/Error.cs +++ b/src/JsonApiDotNetCore/Internal/Error.cs @@ -1,7 +1,9 @@ using System; using System.Diagnostics; +using System.Collections.Generic; using JsonApiDotNetCore.Configuration; using Newtonsoft.Json; +using Microsoft.AspNetCore.Mvc; namespace JsonApiDotNetCore.Internal { @@ -66,6 +68,16 @@ public Error(int status, string title, string detail, ErrorMeta meta = null, obj public bool ShouldSerializeMeta() => (JsonApiOptions.DisableErrorStackTraces == false); public bool ShouldSerializeSource() => (JsonApiOptions.DisableErrorSource == false); + + public IActionResult AsActionResult() + { + var errorCollection = new ErrorCollection + { + Errors = new List { this } + }; + + return errorCollection.AsActionResult(); + } } public class ErrorMeta diff --git a/src/JsonApiDotNetCore/Internal/ErrorCollection.cs b/src/JsonApiDotNetCore/Internal/ErrorCollection.cs index bf0375843d..91e6d962da 100644 --- a/src/JsonApiDotNetCore/Internal/ErrorCollection.cs +++ b/src/JsonApiDotNetCore/Internal/ErrorCollection.cs @@ -1,6 +1,8 @@ using System.Collections.Generic; +using System.Linq; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; +using Microsoft.AspNetCore.Mvc; namespace JsonApiDotNetCore.Internal { @@ -25,5 +27,26 @@ public string GetJson() ContractResolver = new CamelCasePropertyNamesContractResolver() }); } + + public int GetErrorStatusCode() + { + var statusCodes = Errors + .Select(e => e.StatusCode) + .Distinct() + .ToList(); + + if (statusCodes.Count == 1) + return statusCodes[0]; + + return int.Parse(statusCodes.Max().ToString()[0] + "00"); + } + + public IActionResult AsActionResult() + { + return new ObjectResult(this) + { + StatusCode = GetErrorStatusCode() + }; + } } } diff --git a/src/JsonApiDotNetCore/Internal/JsonApiException.cs b/src/JsonApiDotNetCore/Internal/JsonApiException.cs index 49dc557e51..0852ac1e04 100644 --- a/src/JsonApiDotNetCore/Internal/JsonApiException.cs +++ b/src/JsonApiDotNetCore/Internal/JsonApiException.cs @@ -41,16 +41,7 @@ public JsonApiException(int statusCode, string message, Exception innerException public int GetStatusCode() { - if (_errors.Errors.Select(a => a.StatusCode).Distinct().Count() == 1) - return _errors.Errors[0].StatusCode; - - if (_errors.Errors.FirstOrDefault(e => e.StatusCode >= 500) != null) - return 500; - - if (_errors.Errors.FirstOrDefault(e => e.StatusCode >= 400) != null) - return 400; - - return 500; + return _errors.GetErrorStatusCode(); } private ErrorMeta GetMeta() => ErrorMeta.FromException(this);