using System.Net; using Catalog.Communication.Abstractions; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; namespace Catalog.Communication.DependencyInjection; public static class CatalogCommunicationServiceCollectionExtensions { public static IServiceCollection AddCatalogCommunication(this IServiceCollection services, Action configure) { ArgumentNullException.ThrowIfNull(services); ArgumentNullException.ThrowIfNull(configure); services .AddOptions() .Configure(configure) .Validate(o => o.BaseUri is not null, "CatalogCommunicationOptions.BaseUri is required.") .Validate(o => !string.IsNullOrWhiteSpace(o.AdminPageBasePath), "AdminPageBasePath is required.") .Validate(o => !string.IsNullOrWhiteSpace(o.ReceiveFilePath), "ReceiveFilePath is required.") .Validate(o => o.RequestTimeout > TimeSpan.Zero, "RequestTimeout must be greater than zero.") .Validate(o => o.RetryCount >= 0 && o.RetryCount <= 10, "RetryCount must be between 0 and 10.") .Validate(o => o.RetryBaseDelay > TimeSpan.Zero, "RetryBaseDelay must be greater than zero."); services.TryAddSingleton(); services .AddHttpClient((sp, client) => { var options = sp.GetRequiredService>().Value; client.BaseAddress = options.BaseUri; }) .ConfigurePrimaryHttpMessageHandler(sp => { var cookieContainer = sp.GetRequiredService(); return new HttpClientHandler { UseCookies = true, CookieContainer = cookieContainer, AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate | DecompressionMethods.Brotli, }; }); return services; } }