using FluentValidation; namespace IdentityShroud.Api.Validation; public class ValidateFilter : IEndpointFilter where T : class { public async ValueTask InvokeAsync( EndpointFilterInvocationContext context, EndpointFilterDelegate next) { // Grab the deserialized argument (the DTO) from the context. // The order of arguments matches the order of parameters in the endpoint delegate. var dto = context.Arguments .FirstOrDefault(arg => arg is T) as T; if (dto == null) return Results.BadRequest("Unable to read request body."); // Resolve the matching validator from DI. var validator = context.HttpContext.RequestServices .GetService>(); if (validator != null) { var validationResult = await validator.ValidateAsync(dto); if (!validationResult.IsValid) return Results.ValidationProblem(validationResult.ToDictionary()); } // Validation passed – continue to the actual handler. return await next(context); } }