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) { 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); } }