using Common.Configuration;
using Common.Configuration.Arr;
using Common.Configuration.ContentBlocker;
using Common.Configuration.DownloadCleaner;
using Common.Configuration.DownloadClient;
using Common.Configuration.IgnoredDownloads;
using Common.Configuration.QueueCleaner;
using Microsoft.Extensions.Logging;
namespace Infrastructure.Configuration;
///
/// Provides configuration management for various components with thread-safe file access.
///
public interface IConfigManager
{
// Configuration files - Async methods
Task GetConfigurationAsync(string configFileName) where T : class, new();
Task SaveConfigurationAsync(string configFileName, T config) where T : class;
Task UpdateConfigurationPropertyAsync(string configFileName, string propertyPath, T value);
Task MergeConfigurationAsync(string configFileName, T newValues) where T : class;
Task DeleteConfigurationAsync(string configFileName);
IEnumerable ListConfigurationFiles();
// Configuration files - Sync methods
T? GetConfiguration(string configFileName) where T : class, new();
bool SaveConfiguration(string configFileName, T config) where T : class;
bool UpdateConfigurationProperty(string configFileName, string propertyPath, T value);
bool MergeConfiguration(string configFileName, T newValues) where T : class;
bool DeleteConfiguration(string configFileName);
// Specific configuration types - Async methods
Task GetSonarrConfigAsync();
Task GetRadarrConfigAsync();
Task GetLidarrConfigAsync();
Task GetContentBlockerConfigAsync();
Task GetQueueCleanerConfigAsync();
Task GetDownloadCleanerConfigAsync();
Task GetDownloadClientConfigAsync();
Task GetIgnoredDownloadsConfigAsync();
Task SaveSonarrConfigAsync(SonarrConfig config);
Task SaveRadarrConfigAsync(RadarrConfig config);
Task SaveLidarrConfigAsync(LidarrConfig config);
Task SaveContentBlockerConfigAsync(ContentBlockerConfig config);
Task SaveQueueCleanerConfigAsync(QueueCleanerConfig config);
Task SaveDownloadCleanerConfigAsync(DownloadCleanerConfig config);
Task SaveDownloadClientConfigAsync(DownloadClientConfig config);
Task SaveIgnoredDownloadsConfigAsync(IgnoredDownloadsConfig config);
// Specific configuration types - Sync methods
SonarrConfig? GetSonarrConfig();
RadarrConfig? GetRadarrConfig();
LidarrConfig? GetLidarrConfig();
ContentBlockerConfig? GetContentBlockerConfig();
QueueCleanerConfig? GetQueueCleanerConfig();
DownloadCleanerConfig? GetDownloadCleanerConfig();
DownloadClientConfig? GetDownloadClientConfig();
IgnoredDownloadsConfig? GetIgnoredDownloadsConfig();
bool SaveSonarrConfig(SonarrConfig config);
bool SaveRadarrConfig(RadarrConfig config);
bool SaveLidarrConfig(LidarrConfig config);
bool SaveContentBlockerConfig(ContentBlockerConfig config);
bool SaveQueueCleanerConfig(QueueCleanerConfig config);
bool SaveDownloadCleanerConfig(DownloadCleanerConfig config);
bool SaveDownloadClientConfig(DownloadClientConfig config);
bool SaveIgnoredDownloadsConfig(IgnoredDownloadsConfig config);
}
public class ConfigManager : IConfigManager
{
private readonly ILogger _logger;
private readonly JsonConfigurationProvider _configProvider;
// Define standard config file names
private const string SonarrConfigFile = "sonarr.json";
private const string RadarrConfigFile = "radarr.json";
private const string LidarrConfigFile = "lidarr.json";
private const string ContentBlockerConfigFile = "contentblocker.json";
private const string QueueCleanerConfigFile = "queuecleaner.json";
private const string DownloadCleanerConfigFile = "downloadcleaner.json";
private const string DownloadClientConfigFile = "downloadclient.json";
private const string IgnoredDownloadsConfigFile = "ignoreddownloads.json";
public ConfigManager(
ILogger logger,
JsonConfigurationProvider configProvider)
{
_logger = logger;
_configProvider = configProvider;
}
// Generic configuration methods
public Task GetConfigurationAsync(string configFileName) where T : class, new()
{
return _configProvider.ReadConfigurationAsync(configFileName);
}
public Task SaveConfigurationAsync(string configFileName, T config) where T : class
{
// Validate if it's an IConfig
if (config is IConfig configurable)
{
try
{
configurable.Validate();
}
catch (Exception ex)
{
_logger.LogError(ex, "Configuration validation failed for {fileName}", configFileName);
return Task.FromResult(false);
}
}
return _configProvider.WriteConfigurationAsync(configFileName, config);
}
public Task UpdateConfigurationPropertyAsync(string configFileName, string propertyPath, T value)
{
return _configProvider.UpdateConfigurationPropertyAsync(configFileName, propertyPath, value);
}
public Task MergeConfigurationAsync(string configFileName, T newValues) where T : class
{
return _configProvider.MergeConfigurationAsync(configFileName, newValues);
}
public Task DeleteConfigurationAsync(string configFileName)
{
return _configProvider.DeleteConfigurationAsync(configFileName);
}
public IEnumerable ListConfigurationFiles()
{
return _configProvider.ListConfigurationFiles();
}
// Specific configuration type methods
public async Task GetSonarrConfigAsync()
{
return await _configProvider.ReadConfigurationAsync(SonarrConfigFile);
}
public async Task GetRadarrConfigAsync()
{
return await _configProvider.ReadConfigurationAsync(RadarrConfigFile);
}
public async Task GetLidarrConfigAsync()
{
return await _configProvider.ReadConfigurationAsync(LidarrConfigFile);
}
public async Task GetContentBlockerConfigAsync()
{
return await _configProvider.ReadConfigurationAsync(ContentBlockerConfigFile);
}
public ContentBlockerConfig? GetContentBlockerConfig()
{
return _configProvider.ReadConfiguration(ContentBlockerConfigFile);
}
public async Task GetQueueCleanerConfigAsync()
{
return await _configProvider.ReadConfigurationAsync(QueueCleanerConfigFile);
}
public async Task GetDownloadCleanerConfigAsync()
{
return await _configProvider.ReadConfigurationAsync(DownloadCleanerConfigFile);
}
public async Task GetDownloadClientConfigAsync()
{
return await _configProvider.ReadConfigurationAsync(DownloadClientConfigFile);
}
public async Task GetIgnoredDownloadsConfigAsync()
{
return await _configProvider.ReadConfigurationAsync(IgnoredDownloadsConfigFile);
}
public Task SaveSonarrConfigAsync(SonarrConfig config)
{
try
{
config.Validate();
return _configProvider.WriteConfigurationAsync(SonarrConfigFile, config);
}
catch (Exception ex)
{
_logger.LogError(ex, "Sonarr configuration validation failed");
return Task.FromResult(false);
}
}
public Task SaveRadarrConfigAsync(RadarrConfig config)
{
try
{
config.Validate();
return _configProvider.WriteConfigurationAsync(RadarrConfigFile, config);
}
catch (Exception ex)
{
_logger.LogError(ex, "Radarr configuration validation failed");
return Task.FromResult(false);
}
}
public Task SaveLidarrConfigAsync(LidarrConfig config)
{
try
{
config.Validate();
return _configProvider.WriteConfigurationAsync(LidarrConfigFile, config);
}
catch (Exception ex)
{
_logger.LogError(ex, "Lidarr configuration validation failed");
return Task.FromResult(false);
}
}
public Task SaveContentBlockerConfigAsync(ContentBlockerConfig config)
{
try
{
config.Validate();
return _configProvider.WriteConfigurationAsync(ContentBlockerConfigFile, config);
}
catch (Exception ex)
{
_logger.LogError(ex, "ContentBlocker configuration validation failed");
return Task.FromResult(false);
}
}
public Task SaveQueueCleanerConfigAsync(QueueCleanerConfig config)
{
try
{
config.Validate();
return _configProvider.WriteConfigurationAsync(QueueCleanerConfigFile, config);
}
catch (Exception ex)
{
_logger.LogError(ex, "QueueCleaner configuration validation failed");
return Task.FromResult(false);
}
}
public Task SaveDownloadCleanerConfigAsync(DownloadCleanerConfig config)
{
try
{
config.Validate();
return _configProvider.WriteConfigurationAsync(DownloadCleanerConfigFile, config);
}
catch (Exception ex)
{
_logger.LogError(ex, "DownloadCleaner configuration validation failed");
return Task.FromResult(false);
}
}
public Task SaveDownloadClientConfigAsync(DownloadClientConfig config)
{
try
{
config.Validate();
return _configProvider.WriteConfigurationAsync(DownloadClientConfigFile, config);
}
catch (Exception ex)
{
_logger.LogError(ex, "DownloadClient configuration validation failed");
return Task.FromResult(false);
}
}
public Task SaveIgnoredDownloadsConfigAsync(IgnoredDownloadsConfig config)
{
try
{
return _configProvider.WriteConfigurationAsync(IgnoredDownloadsConfigFile, config);
}
catch (Exception ex)
{
_logger.LogError(ex, "IgnoredDownloads configuration save failed");
return Task.FromResult(false);
}
}
// Generic synchronous configuration methods
public T? GetConfiguration(string fileName) where T : class, new()
{
return _configProvider.ReadConfiguration(fileName);
}
public QueueCleanerConfig? GetQueueCleanerConfig()
{
return GetConfiguration("queue-cleaner.json");
}
public bool SaveConfiguration(string configFileName, T config) where T : class
{
// Validate if it's an IConfig
if (config is IConfig configurable)
{
try
{
configurable.Validate();
}
catch (Exception ex)
{
_logger.LogError(ex, "Configuration validation failed for {fileName}", configFileName);
return false;
}
}
return _configProvider.WriteConfiguration(configFileName, config);
}
public bool UpdateConfigurationProperty(string configFileName, string propertyPath, T value)
{
return _configProvider.UpdateConfigurationProperty(configFileName, propertyPath, value);
}
public bool MergeConfiguration(string configFileName, T newValues) where T : class
{
return _configProvider.MergeConfiguration(configFileName, newValues);
}
public bool DeleteConfiguration(string configFileName)
{
return _configProvider.DeleteConfiguration(configFileName);
}
// Specific synchronous configuration methods for typed configs
public SonarrConfig? GetSonarrConfig()
{
return _configProvider.ReadConfiguration(SonarrConfigFile);
}
public RadarrConfig? GetRadarrConfig()
{
return _configProvider.ReadConfiguration(RadarrConfigFile);
}
public LidarrConfig? GetLidarrConfig()
{
return _configProvider.ReadConfiguration(LidarrConfigFile);
}
public DownloadCleanerConfig? GetDownloadCleanerConfig()
{
return _configProvider.ReadConfiguration(DownloadCleanerConfigFile);
}
public DownloadClientConfig? GetDownloadClientConfig()
{
return _configProvider.ReadConfiguration(DownloadClientConfigFile);
}
public IgnoredDownloadsConfig? GetIgnoredDownloadsConfig()
{
return _configProvider.ReadConfiguration(IgnoredDownloadsConfigFile);
}
public bool SaveSonarrConfig(SonarrConfig config)
{
try
{
config.Validate();
return _configProvider.WriteConfiguration(SonarrConfigFile, config);
}
catch (Exception ex)
{
_logger.LogError(ex, "Sonarr configuration validation failed");
return false;
}
}
public bool SaveRadarrConfig(RadarrConfig config)
{
try
{
config.Validate();
return _configProvider.WriteConfiguration(RadarrConfigFile, config);
}
catch (Exception ex)
{
_logger.LogError(ex, "Radarr configuration validation failed");
return false;
}
}
public bool SaveLidarrConfig(LidarrConfig config)
{
try
{
config.Validate();
return _configProvider.WriteConfiguration(LidarrConfigFile, config);
}
catch (Exception ex)
{
_logger.LogError(ex, "Lidarr configuration validation failed");
return false;
}
}
public bool SaveContentBlockerConfig(ContentBlockerConfig config)
{
try
{
config.Validate();
return _configProvider.WriteConfiguration(ContentBlockerConfigFile, config);
}
catch (Exception ex)
{
_logger.LogError(ex, "ContentBlocker configuration validation failed");
return false;
}
}
public bool SaveQueueCleanerConfig(QueueCleanerConfig config)
{
try
{
config.Validate();
return _configProvider.WriteConfiguration(QueueCleanerConfigFile, config);
}
catch (Exception ex)
{
_logger.LogError(ex, "QueueCleaner configuration validation failed");
return false;
}
}
public bool SaveDownloadCleanerConfig(DownloadCleanerConfig config)
{
try
{
config.Validate();
return _configProvider.WriteConfiguration(DownloadCleanerConfigFile, config);
}
catch (Exception ex)
{
_logger.LogError(ex, "DownloadCleaner configuration validation failed");
return false;
}
}
public bool SaveDownloadClientConfig(DownloadClientConfig config)
{
try
{
config.Validate();
return _configProvider.WriteConfiguration(DownloadClientConfigFile, config);
}
catch (Exception ex)
{
_logger.LogError(ex, "DownloadClient configuration validation failed");
return false;
}
}
public bool SaveIgnoredDownloadsConfig(IgnoredDownloadsConfig config)
{
try
{
return _configProvider.WriteConfiguration(IgnoredDownloadsConfigFile, config);
}
catch (Exception ex)
{
_logger.LogError(ex, "IgnoredDownloads configuration save failed");
return false;
}
}
}