using Microsoft.AspNetCore.Http; using Mirea.Api.Endpoint.Common.Attributes; using Mirea.Api.Endpoint.Common.Interfaces; using System.Threading.Tasks; namespace Mirea.Api.Endpoint.Middleware; public class MaintenanceModeMiddleware(RequestDelegate next, IMaintenanceModeService maintenanceModeService, IMaintenanceModeNotConfigureService maintenanceModeNotConfigureService) { private static bool IsIgnoreMaintenanceMode(HttpContext context) { var endpoint = context.GetEndpoint(); return endpoint?.Metadata.GetMetadata() != null; } public async Task Invoke(HttpContext context) { if (!maintenanceModeService.IsMaintenanceMode && !maintenanceModeNotConfigureService.IsMaintenanceMode || IsIgnoreMaintenanceMode(context)) await next(context); else { context.Response.StatusCode = StatusCodes.Status503ServiceUnavailable; context.Response.ContentType = "plain/text"; string error; if (maintenanceModeService.IsMaintenanceMode) { context.Response.Headers.RetryAfter = "600"; error = "The service is currently undergoing maintenance. Please try again later."; } else error = "The service is currently not configured. Go to the setup page if you are an administrator or try again later."; await context.Response.WriteAsync(error); } } }