30 lines
1.1 KiB
C#
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;
|
|
}
|
|
} |