init
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
using FluentValidation;
|
||||
using FluentValidation.Results;
|
||||
using Mccn.Common.Application.Exceptions;
|
||||
using Mccn.Common.Domain.Abstractions;
|
||||
using MediatR;
|
||||
using ValidationException = Mccn.Common.Application.Exceptions.ValidationException;
|
||||
|
||||
namespace Mccn.Common.Application.Behaviors;
|
||||
|
||||
public sealed class ValidationBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
|
||||
where TRequest : IBaseRequest
|
||||
where TResponse : Result
|
||||
{
|
||||
private readonly IEnumerable<IValidator<TRequest>> _validators;
|
||||
|
||||
public ValidationBehavior(IEnumerable<IValidator<TRequest>> validators)
|
||||
{
|
||||
_validators = validators;
|
||||
}
|
||||
|
||||
public async Task<TResponse> Handle(
|
||||
TRequest request,
|
||||
RequestHandlerDelegate<TResponse> next,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
ValidationContext<TRequest> context = new(request);
|
||||
|
||||
ValidationResult[] validationFailures = await Task.WhenAll(
|
||||
_validators.Select(v => v.ValidateAsync(context, cancellationToken)));
|
||||
|
||||
List<ValidationError> errors = validationFailures
|
||||
.Where(r => !r.IsValid)
|
||||
.SelectMany(r => r.Errors)
|
||||
.Select(f => new ValidationError(f.PropertyName, f.ErrorMessage))
|
||||
.ToList();
|
||||
|
||||
if (errors.Count != 0) throw new ValidationException(errors);
|
||||
|
||||
return await next();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user