Files
yes.blog/Yes.Blog/Endpoints/EndpointValidationExtensions.cs
2025-04-30 09:51:36 +08:00

42 lines
1.0 KiB
C#

namespace Yes.Blog.Endpoints
{
public static class EndpointValidationExtensions
{
public static RouteHandlerBuilder WithRequestValidation<TRequest>(this RouteHandlerBuilder builder)
{
return builder
.AddEndpointFilter<EndpointValidatorFilter<TRequest>>()
.ProducesValidationProblem();
}
}
public class EndpointValidatorFilter<T> : IEndpointFilter
{
private readonly IValidator<T> _validator;
public EndpointValidatorFilter(IValidator<T> validator)
{
_validator = validator;
}
public async ValueTask<object?> InvokeAsync(EndpointFilterInvocationContext context, EndpointFilterDelegate next)
{
T? inputData = context.GetArgument<T>(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);
}
}
}