| | | 1 | | using System.ComponentModel.DataAnnotations; |
| | | 2 | | using Microsoft.Extensions.Logging; |
| | | 3 | | |
| | | 4 | | namespace ClientManager.Shared.Messaging; |
| | | 5 | | |
| | 8 | 6 | | public class MessageValidationMiddleware(ILogger<MessageValidationMiddleware>? logger) : IMessagePublishMiddleware |
| | | 7 | | { |
| | 8 | 8 | | readonly ILogger<MessageValidationMiddleware>? _logger = logger; |
| | | 9 | | |
| | | 10 | | public async Task InvokeAsync<T>(T message, MessagePublishDeleagte<T> next, CancellationToken cancellationToken) |
| | | 11 | | where T : IMessage |
| | | 12 | | { |
| | 11 | 13 | | var validationResults = new List<ValidationResult>(); |
| | 11 | 14 | | var context = new ValidationContext(message); |
| | | 15 | | |
| | 11 | 16 | | bool isValid = Validator.TryValidateObject(message, context, validationResults, validateAllProperties: true); |
| | | 17 | | |
| | 11 | 18 | | if (!isValid) |
| | | 19 | | { |
| | 8 | 20 | | var errors = string.Join(", ", validationResults.Select(r => r.ErrorMessage)); |
| | 4 | 21 | | _logger?.LogWarning("Validation failed for {MessageType}: {Errors}", typeof(T).Name, errors); |
| | 4 | 22 | | throw new ValidationException($"Message validation failed: {errors}"); |
| | | 23 | | } |
| | | 24 | | |
| | 7 | 25 | | _logger?.LogDebug("Message {MessageType} passed validation", typeof(T).Name); |
| | | 26 | | |
| | 7 | 27 | | await next(message, cancellationToken); |
| | 7 | 28 | | } |
| | | 29 | | } |