namespace Brizco.Identity.Api.WebFramework.Bases { public class ApiResult { public bool IsSuccess { get; set; } public ApiResultStatusCode StatusCode { get; set; } [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] public string Message { get; set; } public ApiResult(bool isSuccess, ApiResultStatusCode statusCode, string message = null) { IsSuccess = isSuccess; StatusCode = statusCode; Message = message ?? statusCode.ToDisplay(); } #region Implicit Operators public static implicit operator ApiResult(OkResult result) { return new ApiResult(true, ApiResultStatusCode.Success); } public static implicit operator ApiResult(BadRequestResult result) { return new ApiResult(false, ApiResultStatusCode.BadRequest); } public static implicit operator ApiResult(BadRequestObjectResult result) { var message = result.Value.ToString(); if (result.Value is SerializableError errors) { var errorMessages = errors.SelectMany(p => (string[])p.Value).Distinct(); message = string.Join(" | ", errorMessages); } return new ApiResult(false, ApiResultStatusCode.BadRequest, message); } public static implicit operator ApiResult(ContentResult result) { return new ApiResult(true, ApiResultStatusCode.Success, result.Content); } public static implicit operator ApiResult(NotFoundResult result) { return new ApiResult(false, ApiResultStatusCode.NotFound); } public static implicit operator ApiResult(ForbidResult result) { return new ApiResult(false, ApiResultStatusCode.NotFound); } public static implicit operator ApiResult(StatusCodeResult result) { return new ApiResult(false, ApiResultStatusCode.NotFound); } #endregion } public class ApiResult : ApiResult where TData : class { [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] public TData Data { get; set; } public ApiResult(bool isSuccess, ApiResultStatusCode statusCode, TData data, string message = null) : base(isSuccess, statusCode, message) { Data = data; } #region Implicit Operators public static implicit operator ApiResult(TData data) { return new ApiResult(true, ApiResultStatusCode.Success, data); } public static implicit operator ApiResult(OkResult result) { return new ApiResult(true, ApiResultStatusCode.Success, null); } public static implicit operator ApiResult(OkObjectResult result) { return new ApiResult(true, ApiResultStatusCode.Success, (TData)result.Value); } public static implicit operator ApiResult(BadRequestResult result) { return new ApiResult(false, ApiResultStatusCode.BadRequest, null); } public static implicit operator ApiResult(BadRequestObjectResult result) { var message = result.Value.ToString(); if (result.Value is SerializableError errors) { var errorMessages = errors.SelectMany(p => (string[])p.Value).Distinct(); message = string.Join(" | ", errorMessages); } return new ApiResult(false, ApiResultStatusCode.BadRequest, null, message); } public static implicit operator ApiResult(ContentResult result) { return new ApiResult(true, ApiResultStatusCode.Success, null, result.Content); } public static implicit operator ApiResult(NotFoundResult result) { return new ApiResult(false, ApiResultStatusCode.NotFound, null); } public static implicit operator ApiResult(NotFoundObjectResult result) { return new ApiResult(false, ApiResultStatusCode.NotFound, (TData)result.Value); } #endregion } }