This commit is contained in:
122
server/ControllerHelpers/ApiErrorResponse.cs
Normal file
122
server/ControllerHelpers/ApiErrorResponse.cs
Normal file
@@ -0,0 +1,122 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Newtonsoft.Json;
|
||||
using Sockeye.Biz;
|
||||
|
||||
namespace Sockeye.Api.ControllerHelpers
|
||||
{
|
||||
|
||||
|
||||
|
||||
public class ApiErrorResponse
|
||||
{
|
||||
|
||||
[JsonIgnore]
|
||||
private ILogger log = Sockeye.Util.ApplicationLogging.CreateLogger<ApiErrorResponse>();
|
||||
|
||||
//Mandatory properties
|
||||
public ApiError Error { get; }
|
||||
|
||||
|
||||
|
||||
|
||||
//Generic error
|
||||
public ApiErrorResponse(ApiErrorCode apiCode, string target = null, string message = null)
|
||||
{
|
||||
|
||||
//try to get a stock message if nothing specified
|
||||
if (message == null)
|
||||
{
|
||||
message = ApiErrorCodeStockMessage.GetTranslationCodeForApiErrorCode(apiCode);
|
||||
}
|
||||
|
||||
Error = new ApiError(apiCode, message, target);
|
||||
|
||||
log.LogDebug("apiCode={0}, target={1}, message={2}", apiCode, target, message);
|
||||
}
|
||||
|
||||
|
||||
//Bad request (MODELSTATE ISSUE) error response handling
|
||||
|
||||
public ApiErrorResponse(ModelStateDictionary modelState)
|
||||
{
|
||||
|
||||
if (modelState.IsValid)
|
||||
{
|
||||
throw new ArgumentException("ModelState must be invalid", nameof(modelState));
|
||||
}
|
||||
|
||||
|
||||
//Set outer error and then put validation in details
|
||||
|
||||
Error = new ApiError(ApiErrorCode.VALIDATION_FAILED, ApiErrorCodeStockMessage.GetTranslationCodeForApiErrorCode(ApiErrorCode.VALIDATION_FAILED));
|
||||
|
||||
|
||||
//https://www.jerriepelser.com/blog/validation-response-aspnet-core-webapi/
|
||||
//Message = "Validation Failed";
|
||||
Error.Details = new List<ApiDetailError>();
|
||||
|
||||
|
||||
foreach (var key in modelState.Keys)
|
||||
{
|
||||
var vErrors = modelState[key].Errors;
|
||||
foreach (ModelError m in vErrors)
|
||||
{
|
||||
string msg = "";
|
||||
if (!string.IsNullOrWhiteSpace(m.ErrorMessage))
|
||||
{
|
||||
msg += m.ErrorMessage + ". ";
|
||||
}
|
||||
if (m.Exception != null && !string.IsNullOrWhiteSpace(m.Exception.Message))
|
||||
{
|
||||
msg += "Exception: " + m.Exception.Message;
|
||||
}
|
||||
//example this produces
|
||||
//
|
||||
Error.Details.Add(new ApiDetailError() { Target = key, Message = msg, Error = ((int)ApiErrorCode.VALIDATION_INVALID_VALUE).ToString() });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
log.LogDebug("BadRequest - Validation error");
|
||||
}
|
||||
|
||||
|
||||
//Business rule validation error response
|
||||
public ApiErrorResponse(List<ValidationError> errors)
|
||||
{
|
||||
Error = new ApiError(ApiErrorCode.VALIDATION_FAILED, ApiErrorCodeStockMessage.GetTranslationCodeForApiErrorCode(ApiErrorCode.VALIDATION_FAILED));
|
||||
Error.Details = new List<ApiDetailError>();
|
||||
foreach (ValidationError v in errors)
|
||||
{
|
||||
Error.Details.Add(new ApiDetailError() { Target = v.Target, Message = v.Message, Error = ((int)v.Code).ToString() });
|
||||
}
|
||||
log.LogDebug("BadRequest - Validation error");
|
||||
}
|
||||
|
||||
|
||||
|
||||
// public void AddDetailError(ApiErrorCode apiCode, string target = null, string message = null)
|
||||
// {
|
||||
// if (Error.Details == null)
|
||||
// {
|
||||
// Error.Details = new List<ApiDetailError>();
|
||||
// }
|
||||
|
||||
// //try to get a stock message if nothing specified
|
||||
// if (message == null)
|
||||
// {
|
||||
// message = ApiErrorCodeStockMessage.GetMessage(apiCode);
|
||||
// }
|
||||
|
||||
// Error.Details.Add(new ApiDetailError() { Code = ((int)apiCode).ToString(), Target = target, Message = message });
|
||||
// }
|
||||
|
||||
|
||||
}//eoc
|
||||
|
||||
|
||||
}//eons
|
||||
Reference in New Issue
Block a user