using DigitalData.Core.Exceptions; using FluentValidation; using MediatR; namespace EnvelopeGenerator.Application.Common.Behaviors; public class ValidationBehavior : IPipelineBehavior where TRequest : notnull { private readonly IEnumerable> _validators; public ValidationBehavior(IEnumerable> validators) { _validators = validators; } public async Task Handle( TRequest request, RequestHandlerDelegate next, CancellationToken cancellationToken) { if (_validators.Any()) { var context = new ValidationContext(request); var failures = _validators .Select(v => v.Validate(context)) .SelectMany(r => r.Errors) .Where(f => f is not null) .ToList(); if (failures.Count > 0) { var message = string.Join("; ", failures.Select(f => f.ErrorMessage).Distinct()); throw new BadRequestException(message); } } return await next(); } }