diff --git a/code/Executable/Controllers/ConfigurationController.cs b/code/Executable/Controllers/ConfigurationController.cs index a3cbe92b..20c7abc1 100644 --- a/code/Executable/Controllers/ConfigurationController.cs +++ b/code/Executable/Controllers/ConfigurationController.cs @@ -5,6 +5,7 @@ using Data.Models.Configuration.General; using Data.Models.Configuration.QueueCleaner; using Data; using Data.Enums; +using Infrastructure.Http.DynamicHttpClientSystem; using Infrastructure.Logging; using Infrastructure.Models; using Infrastructure.Services.Interfaces; @@ -191,6 +192,15 @@ public class ConfigurationController : ControllerBase _dataContext.DownloadClients.Remove(existingClient); await _dataContext.SaveChangesAsync(); + // Clean up any registered HTTP client configuration + var dynamicHttpClientFactory = HttpContext.RequestServices + .GetRequiredService(); + + var clientName = $"DownloadClient_{id}"; + dynamicHttpClientFactory.UnregisterConfiguration(clientName); + + _logger.LogInformation("Removed HTTP client configuration for deleted download client {ClientName}", clientName); + return NoContent(); } catch (Exception ex) @@ -396,6 +406,14 @@ public class ConfigurationController : ControllerBase // Persist the configuration await _dataContext.SaveChangesAsync(); + // Update all HTTP client configurations with new general settings + var dynamicHttpClientFactory = HttpContext.RequestServices + .GetRequiredService(); + + dynamicHttpClientFactory.UpdateAllClientsFromGeneralConfig(oldConfig); + + _logger.LogInformation("Updated all HTTP client configurations with new general settings"); + // Set the logging level based on the new configuration _loggingConfigManager.SetLogLevel(newConfig.LogLevel); diff --git a/code/Infrastructure/Http/DynamicHttpClientSystem/DynamicHttpClientFactory.cs b/code/Infrastructure/Http/DynamicHttpClientSystem/DynamicHttpClientFactory.cs index 251a1914..d0995b10 100644 --- a/code/Infrastructure/Http/DynamicHttpClientSystem/DynamicHttpClientFactory.cs +++ b/code/Infrastructure/Http/DynamicHttpClientSystem/DynamicHttpClientFactory.cs @@ -1,5 +1,7 @@ using System.Net; using Common.Enums; +using Data.Models.Configuration.General; +using Microsoft.Extensions.Logging; namespace Infrastructure.Http.DynamicHttpClientSystem; @@ -10,11 +12,16 @@ public class DynamicHttpClientFactory : IDynamicHttpClientFactory { private readonly IHttpClientFactory _httpClientFactory; private readonly IHttpClientConfigStore _configStore; + private readonly ILogger _logger; - public DynamicHttpClientFactory(IHttpClientFactory httpClientFactory, IHttpClientConfigStore configStore) + public DynamicHttpClientFactory( + IHttpClientFactory httpClientFactory, + IHttpClientConfigStore configStore, + ILogger logger) { _httpClientFactory = httpClientFactory; _configStore = configStore; + _logger = logger; } public HttpClient CreateClient(string clientName, HttpClientConfig config) @@ -93,4 +100,47 @@ public class DynamicHttpClientFactory : IDynamicHttpClientFactory { _configStore.RemoveConfiguration(clientName); } + + public void UpdateAllClientsFromGeneralConfig(GeneralConfig generalConfig) + { + var allConfigurations = _configStore.GetAllConfigurations().ToList(); + + if (!allConfigurations.Any()) + { + _logger.LogDebug("No HTTP client configurations to update"); + return; + } + + var updatedConfigurations = allConfigurations.Select(kvp => + { + var config = kvp.Value; + + // Update timeout and certificate validation for all clients + config.Timeout = generalConfig.HttpTimeout; + config.CertificateValidationType = generalConfig.HttpCertificateValidation; + + // Update retry configuration if it exists + if (config.RetryConfig != null) + { + config.RetryConfig.MaxRetries = generalConfig.HttpMaxRetries; + } + + return new KeyValuePair(kvp.Key, config); + }).ToList(); + + // Apply all updates + _configStore.UpdateConfigurations(updatedConfigurations); + + _logger.LogInformation("Updated {Count} HTTP client configurations with new general settings: " + + "Timeout={Timeout}s, MaxRetries={MaxRetries}, CertificateValidation={CertValidation}", + updatedConfigurations.Count, + generalConfig.HttpTimeout, + generalConfig.HttpMaxRetries, + generalConfig.HttpCertificateValidation); + } + + public IEnumerable GetRegisteredClientNames() + { + return _configStore.GetAllConfigurations().Select(kvp => kvp.Key); + } } \ No newline at end of file diff --git a/code/Infrastructure/Http/DynamicHttpClientSystem/HttpClientConfigStore.cs b/code/Infrastructure/Http/DynamicHttpClientSystem/HttpClientConfigStore.cs index afcf32d8..09a7e82f 100644 --- a/code/Infrastructure/Http/DynamicHttpClientSystem/HttpClientConfigStore.cs +++ b/code/Infrastructure/Http/DynamicHttpClientSystem/HttpClientConfigStore.cs @@ -35,4 +35,17 @@ public class HttpClientConfigStore : IHttpClientConfigStore { return _retryConfigurations.TryGetValue(clientName, out retryConfig!); } + + public IEnumerable> GetAllConfigurations() + { + return _configurations.ToList(); // Return a snapshot to avoid collection modification issues + } + + public void UpdateConfigurations(IEnumerable> configurations) + { + foreach (var kvp in configurations) + { + _configurations.AddOrUpdate(kvp.Key, kvp.Value, (_, _) => kvp.Value); + } + } } \ No newline at end of file diff --git a/code/Infrastructure/Http/DynamicHttpClientSystem/IDynamicHttpClientFactory.cs b/code/Infrastructure/Http/DynamicHttpClientSystem/IDynamicHttpClientFactory.cs index 40dad08e..7db3766d 100644 --- a/code/Infrastructure/Http/DynamicHttpClientSystem/IDynamicHttpClientFactory.cs +++ b/code/Infrastructure/Http/DynamicHttpClientSystem/IDynamicHttpClientFactory.cs @@ -1,4 +1,5 @@ using Common.Enums; +using Data.Models.Configuration.General; namespace Infrastructure.Http.DynamicHttpClientSystem; @@ -41,4 +42,14 @@ public interface IDynamicHttpClientFactory /// Unregisters a configuration /// void UnregisterConfiguration(string clientName); + + /// + /// Updates all registered HTTP client configurations with new general config settings + /// + void UpdateAllClientsFromGeneralConfig(GeneralConfig generalConfig); + + /// + /// Gets all currently registered client names + /// + IEnumerable GetRegisteredClientNames(); } \ No newline at end of file diff --git a/code/Infrastructure/Http/DynamicHttpClientSystem/IHttpClientConfigStore.cs b/code/Infrastructure/Http/DynamicHttpClientSystem/IHttpClientConfigStore.cs index a35918d2..5cbb3543 100644 --- a/code/Infrastructure/Http/DynamicHttpClientSystem/IHttpClientConfigStore.cs +++ b/code/Infrastructure/Http/DynamicHttpClientSystem/IHttpClientConfigStore.cs @@ -24,4 +24,14 @@ public interface IHttpClientConfigStore /// Adds or updates a retry configuration for the specified client name /// void AddRetryConfiguration(string clientName, RetryConfig retryConfig); + + /// + /// Gets all currently registered configurations + /// + IEnumerable> GetAllConfigurations(); + + /// + /// Updates multiple configurations atomically + /// + void UpdateConfigurations(IEnumerable> configurations); } \ No newline at end of file