using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace WatchIt.Shared.Models { public class RequestResult { #region PROPERTIES public RequestResultStatus Status { get; } public IEnumerable ValidationMessages { get; init; } #endregion #region CONSTRUCTORS internal RequestResult(RequestResultStatus status) => Status = status; public static RequestResult Ok() => new RequestResult(RequestResultStatus.Ok); public static RequestResult Ok() => new RequestResult(RequestResultStatus.Ok); public static RequestResult Ok(T data) => new RequestResult(RequestResultStatus.Ok) { Data = data }; public static RequestResult Created(string location, T resource) => new RequestResult(RequestResultStatus.Created) { NewResourceLocation = location, Data = resource }; public static RequestResult NoContent() => new RequestResult(RequestResultStatus.NoContent); public static RequestResult NoContent() => new RequestResult(RequestResultStatus.NoContent); public static RequestResult BadRequest(params string[] validationErrors) => new RequestResult(RequestResultStatus.BadRequest) { ValidationMessages = validationErrors }; public static RequestResult BadRequest(params string[] validationErrors) => new RequestResult(RequestResultStatus.BadRequest) { ValidationMessages = validationErrors }; public static RequestResult Unauthorized(params string[] validationErrors) => new RequestResult(RequestResultStatus.Unauthorized) { ValidationMessages = validationErrors }; public static RequestResult Unauthorized(params string[] validationErrors) => new RequestResult(RequestResultStatus.Unauthorized) { ValidationMessages = validationErrors }; public static RequestResult Forbidden() => new RequestResult(RequestResultStatus.Forbidden); public static RequestResult Forbidden() => new RequestResult(RequestResultStatus.Forbidden); public static RequestResult NotFound() => new RequestResult(RequestResultStatus.NotFound); public static RequestResult NotFound() => new RequestResult(RequestResultStatus.NotFound); public static RequestResult Conflict() => new RequestResult(RequestResultStatus.Conflict); public static RequestResult Conflict() => new RequestResult(RequestResultStatus.Conflict); #endregion #region CONVERSION public static implicit operator ActionResult(RequestResult result) => result.Status switch { RequestResultStatus.Ok => HandleOk(result), RequestResultStatus.NoContent => HandleNoContent(), RequestResultStatus.BadRequest => HandleBadRequest(result), RequestResultStatus.Unauthorized => HandleUnauthorized(result), RequestResultStatus.Forbidden => HandleForbidden(), RequestResultStatus.NotFound => HandleNotFound(), RequestResultStatus.Conflict => HandleConflict(), }; protected static ActionResult HandleOk(RequestResult result) => new OkResult(); protected static ActionResult HandleNoContent() => new NoContentResult(); protected static ActionResult HandleBadRequest(RequestResult result) => new BadRequestObjectResult(result.ValidationMessages); protected static ActionResult HandleUnauthorized(RequestResult result) => new UnauthorizedObjectResult(result.ValidationMessages); protected static ActionResult HandleForbidden() => new ForbidResult(); protected static ActionResult HandleNotFound() => new NotFoundResult(); protected static ActionResult HandleConflict() => new ConflictResult(); #endregion } public class RequestResult : RequestResult { #region PROPERTIES public T? Data { get; init; } public string? NewResourceLocation { get; init; } #endregion #region CONSTRUCTORS internal RequestResult(RequestResultStatus type) : base(type) { } #endregion #region CONVERSION public static implicit operator ActionResult(RequestResult result) => result.Status switch { RequestResultStatus.Ok => HandleOk(result), RequestResultStatus.Created => HandleCreated(result), RequestResultStatus.NoContent => HandleNoContent(), RequestResultStatus.BadRequest => HandleBadRequest(result), RequestResultStatus.Unauthorized => HandleUnauthorized(result), RequestResultStatus.Forbidden => HandleForbidden(), RequestResultStatus.NotFound => HandleNotFound(), RequestResultStatus.Conflict => HandleConflict(), }; private static ActionResult HandleOk(RequestResult result) => result.Data is null ? new OkResult() : new OkObjectResult(result.Data); private static ActionResult HandleCreated(RequestResult result) => new CreatedResult(result.NewResourceLocation, result.Data); #endregion } }