//
// Copyright (c) alveus.dev. All rights reserved. Licensed under the MIT License.
//
using Astral.ApiServer.Core;
using Astral.ApiServer.Models.Common;
using Astral.Core.Constants;
namespace Astral.ApiServer.Middleware;
///
/// Handle status code responses.
///
public class StatusCodeMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger _logger;
///
/// Initializes a new instance of the class.
///
/// Instance of .
/// Instance of .
public StatusCodeMiddleware(
RequestDelegate next,
ILogger logger)
{
_next = next;
_logger = logger;
}
///
/// Invoke middleware.
///
/// Instance of .
public Task Invoke(HttpContext context)
{
return InvokeAsync(context);
}
private async Task InvokeAsync(HttpContext context)
{
await _next(context);
switch (context.Response.StatusCode)
{
case 401:
context.Response.Headers.Clear();
context.Response.ContentType = "text/json";
await context.Response.WriteAsJsonAsync(new ErrorResponseModel
{
Error = CoreErrorCodes.Unauthorized,
Message = "You're not authorized to do that"
});
break;
case 404:
context.Response.Headers.Clear();
context.Response.ContentType = "text/json";
_logger.LogWarning("Request to non-existing endpoint: {endpoint}", context.Request.Path);
await context.Response.WriteAsJsonAsync(new ErrorResponseModel
{
Error = ApiErrorCodes.UnknownMethod,
Message = "Unknown method"
});
break;
case 405:
context.Response.Headers.Clear();
context.Response.ContentType = "text/json";
await context.Response.WriteAsJsonAsync(new ErrorResponseModel
{
Error = ApiErrorCodes.IllegalMethod,
Message = "Illegal method"
});
break;
case 415:
context.Response.Headers.Clear();
context.Response.ContentType = "text/json";
await context.Response.WriteAsJsonAsync(new ErrorResponseModel
{
Error = ApiErrorCodes.UnsupportedBody,
Message = "Unsupported body/media type"
});
break;
case 500:
context.Response.Headers.Clear();
context.Response.ContentType = "text/json";
await context.Response.WriteAsJsonAsync(new ErrorResponseModel
{
Error = ApiErrorCodes.UnknownError,
Message = "Unknown error"
});
break;
}
}
}