using System.Threading.Tasks; using FluentValidation; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; namespace Svrnty.CQRS.MinimalApi; public class ValidationFilter : IEndpointFilter where T : class { public const string ValidatedObjectKey = "ValidatedObject"; public async ValueTask InvokeAsync(EndpointFilterInvocationContext context, EndpointFilterDelegate next) { // Deserialize the request body var obj = await context.HttpContext.Request.ReadFromJsonAsync(context.HttpContext.RequestAborted); if (obj == null) return Results.BadRequest("Invalid request payload"); // Store the deserialized object for the lambda to retrieve context.HttpContext.Items[ValidatedObjectKey] = obj; // Validate if validator is registered var validator = context.HttpContext.RequestServices.GetService>(); if (validator != null) { var validationResult = await validator.ValidateAsync(obj, context.HttpContext.RequestAborted); if (!validationResult.IsValid) { return Results.ValidationProblem(validationResult.ToDictionary()); } } return await next(context); } }