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(); //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(); 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 errors) { Error = new ApiError(ApiErrorCode.VALIDATION_FAILED, ApiErrorCodeStockMessage.GetMessage(ApiErrorCode.VALIDATION_FAILED)); Error.Details = new List(); 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(); } //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