namespace GameList.Infrastructure; public sealed class StateChangeNotificationMiddleware(RequestDelegate next) { public async Task InvokeAsync(HttpContext context, StateChangeNotifier notifier) { await next(context); if (ShouldNotify(context)) notifier.NotifyChange(); } private static bool ShouldNotify(HttpContext context) { if (context.Response.StatusCode >= StatusCodes.Status400BadRequest) return false; if (!HttpMethods.IsPost(context.Request.Method) && !HttpMethods.IsPut(context.Request.Method) && !HttpMethods.IsDelete(context.Request.Method)) return false; var path = context.Request.Path; return path.StartsWithSegments("/api/suggestions", StringComparison.OrdinalIgnoreCase) || path.StartsWithSegments("/api/votes", StringComparison.OrdinalIgnoreCase) || path.StartsWithSegments("/api/admin", StringComparison.OrdinalIgnoreCase) || path.StartsWithSegments("/api/me/phase", StringComparison.OrdinalIgnoreCase) || path.StartsWithSegments("/api/auth/register", StringComparison.OrdinalIgnoreCase); } }