namespace HrynCo.NotificationService.Worker; using HrynCo.NotificationService.Contracts.Messages; using HrynCo.NotificationService.Worker.Services.Push; using Hrynco.RabbitMq; using Microsoft.Extensions.Options; public sealed class SendPushConsumer( IOptionsMonitor options, IServiceScopeFactory scopes, ILogger logger) : RabbitMqConsumerBase(options, logger) { protected override string QueueName => "notification.send-push"; protected override bool TryValidateMessage(SendPushMessage message, RabbitMqMessageContext context, out string? validationError) { if (message?.Data is { } data && !PushMessageValidator.IsSupportedVersion(data.Version)) { validationError = "Unsupported push payload version. Supported versions are 1 and 2."; return false; } bool valid = SendPushDeliveryValidator.IsValid(message, context); validationError = valid ? null : "Invalid push envelope."; return valid; } protected override async Task HandleMessageAsync(SendPushMessage message, RabbitMqMessageContext context, CancellationToken cancellationToken) { await using var scope = scopes.CreateAsyncScope(); await scope.ServiceProvider.GetRequiredService() .ProcessAsync(Guid.Parse(context.MessageId!), message, cancellationToken); } protected override async Task HandleMessageRetriesExhaustedAsync(SendPushMessage message, RabbitMqMessageContext context, Exception exception, CancellationToken cancellationToken) { await using var scope = scopes.CreateAsyncScope(); await scope.ServiceProvider.GetRequiredService() .CompleteFailureAsync(Guid.Parse(context.MessageId!), message, cancellationToken); } }