104 lines
3.2 KiB
C#
104 lines
3.2 KiB
C#
using System;
|
|
using System.Linq;
|
|
using System.Collections.Generic;
|
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
|
using Microsoft.Extensions.Logging;
|
|
using Newtonsoft.Json;
|
|
using AyaNova.Biz;
|
|
|
|
namespace AyaNova.Api.ControllerHelpers
|
|
{
|
|
|
|
|
|
|
|
public class ApiErrorResponse
|
|
{
|
|
|
|
[JsonIgnore]
|
|
private ILogger log = AyaNova.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.GetMessage(apiCode);
|
|
}
|
|
|
|
Error = new ApiError(apiCode, message, target);
|
|
|
|
log.LogDebug("apiCode={0}, target={1}, message={2}", apiCode, target, message);
|
|
}
|
|
|
|
|
|
//Bad request 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.GetMessage(ApiErrorCode.VALIDATION_FAILED));
|
|
|
|
|
|
//https://www.jerriepelser.com/blog/validation-response-aspnet-core-webapi/
|
|
//Message = "Validation Failed";
|
|
Error.Details = new List<ApiDetailError>();
|
|
Error.Details.AddRange(modelState.Keys
|
|
.SelectMany(key => modelState[key].Errors
|
|
.Select(x => new ApiDetailError() { Code = ((int)ApiErrorCode.VALIDATION_FAILED).ToString(), Target = key, Message = x.ErrorMessage, Error=ApiErrorCode.VALIDATION_FAILED.ToString() })));
|
|
|
|
|
|
log.LogDebug("BadRequest - Validation error");
|
|
}
|
|
|
|
|
|
//Business rule validation error response
|
|
public ApiErrorResponse(List<ValidationError> errors)
|
|
{
|
|
Error = new ApiError(ApiErrorCode.VALIDATION_FAILED, ApiErrorCodeStockMessage.GetMessage(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 = v.ErrorType.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 |