namespace Yes.Blog.Endpoints { public static class EndpointValidationExtensions { public static RouteHandlerBuilder WithRequestValidation(this RouteHandlerBuilder builder) { return builder .AddEndpointFilter>() .ProducesValidationProblem(); } } public class EndpointValidatorFilter : IEndpointFilter { private readonly IValidator _validator; public EndpointValidatorFilter(IValidator validator) { _validator = validator; } public async ValueTask InvokeAsync(EndpointFilterInvocationContext context, EndpointFilterDelegate next) { T? inputData = context.GetArgument(0); if (inputData is not null) { var validationResult = await _validator.ValidateAsync(inputData); if (!validationResult.IsValid) { return Results.ValidationProblem(validationResult.ToDictionary(), statusCode: (int)HttpStatusCode.UnprocessableEntity); } } return await next.Invoke(context); } } }