using Domain.Exceptions; using FluentValidation; using MediatR; using Microsoft.Extensions.Logging; using QRCodeService.Extensions; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace QRCodeService.Application.Behaviors { public class ValidatorBehavior : IPipelineBehavior { private readonly ILogger> _logger; private readonly IValidator _validator; public ValidatorBehavior(IValidator validator, ILogger> logger) { _validator = validator; _logger = logger; } public async Task Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate next) { var typeName = request.GetGenericTypeName(); _logger.LogInformation("----- Validating command {CommandType}", typeName); var failures = _validator.Validate(request).Errors; if (failures.Any()) { _logger.LogWarning("Validation errors - {CommandType} - Command: {@Command} - Errors: {@ValidationErrors}", typeName, request, failures); throw new DomainException( $"Command Validation Errors for type {typeof(TRequest).Name}", new ValidationException("Validation exception", failures)); } return await next(); } } }