41 lines
1.3 KiB
C#
41 lines
1.3 KiB
C#
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();
|
|
}
|
|
} |