using DigitalData.MessagingService.Client; using EnvelopeGenerator.Application.Common.Interfaces.Services.Notification; using EnvelopeGenerator.Infrastructure.Notification.Configuration; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; namespace EnvelopeGenerator.Infrastructure.Notification; public static class DependencyInjection { public static IServiceCollection AddNotificationInfrastructure(this IServiceCollection services, IConfiguration configuration, string sectionName = NotificationOptions.SectionName) { var ntfConfiguration = configuration.GetSection(sectionName); services.Configure(ntfConfiguration); var options = ntfConfiguration.Get() ?? throw new InvalidOperationException( $"Failed to bind configuration section '{sectionName}' to {nameof(NotificationOptions)}. Ensure the section exists and is correctly configured."); switch (options.ConsumerType) { case ConsumerType.API: if (options.ApiUrl is string apiUrl) services.AddMessagingServiceHttpClient(opt => { opt.BaseAddress = new Uri(apiUrl); // Additional configuration for the MessagingServiceHttpClient can be added here if needed }); else throw new InvalidOperationException( $"MessagingServiceApiUrl must be provided when ClientType is set to Api in the '{sectionName}' configuration section."); break; case ConsumerType.RabbitMQ: if(options.RabbitMQ is not null) services.AddMessagingServiceClient(ntfConfiguration, nameof(options.RabbitMQ)); else throw new InvalidOperationException( $"Missing RabbitMQ connection configuration." + $"When ClientType is set to RabbitMQ, a valid RabbitMQ configuration must be provided in the '{sectionName}' configuration section."); break; default: throw new InvalidOperationException( $"Unsupported ConsumerType '{options.ConsumerType}' in the '{sectionName}' configuration section."); } services.AddScoped(); return services; } }