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 : IPipelineBehavior where TRequest : IBaseRequest where TResponse : Result { private readonly IEnumerable> _validators; public ValidationBehavior(IEnumerable> validators) { _validators = validators; } public async Task Handle( TRequest request, RequestHandlerDelegate next, CancellationToken cancellationToken) { ValidationContext context = new(request); ValidationResult[] validationFailures = await Task.WhenAll( _validators.Select(v => v.ValidateAsync(context, cancellationToken))); List 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(); } }