Api/Netina.Repository/Behaviors/ValidationBehavior.cs

30 lines
1.1 KiB
C#

using FluentValidation;
using ValidationException = Netina.Common.Models.Exception.ValidationException;
namespace Netina.Repository.Behaviors;
public class ValidationBehavior<TRequest, TResponse>(IEnumerable<IValidator<TRequest>> validators)
: IPipelineBehavior<TRequest, TResponse>
where TRequest : notnull
{
public async Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TResponse> next, CancellationToken cancellationToken)
{
var context = new ValidationContext<TRequest>(request);
List<ValidationError> errors = new List<ValidationError>();
foreach (IValidator<TRequest> validator in validators)
{
var result = await validator.ValidateAsync(context, cancellationToken);
if (!result.IsValid)
errors.AddRange(result.Errors.Select(v => new ValidationError(v.PropertyName, v.ErrorMessage)).Distinct());
}
if (errors.Any())
{
throw new ValidationException(errors);
}
var response = await next();
return response;
}
}