2025-02-11 23:10:43 +01:00
using Core.Configurations.JsonConfigProvider ;
using Core.Exceptions ;
using Newtonsoft.Json ;
using Newtonsoft.Json.Linq ;
2025-02-18 16:23:08 +01:00
namespace Core.Configurations.SmartConfigProvider
2025-02-11 23:10:43 +01:00
{
2025-02-11 23:32:28 +01:00
/// <summary>
/// Configuration provider that loads configuration from a smart configuration source (e.g. database).
/// The provider reads connection details from a JSON file and uses them to connect to a configuration repository.
/// </summary>
/// <remarks>
/// The provider supports multiple initialization methods:
/// - Through SmartConfigOptions for flexible repository configuration
/// - Through direct configuration key and file path
/// Configuration is loaded from the repository during Build() and converted to a JSON structure.
/// </remarks>
2025-02-11 23:10:43 +01:00
public class SmartConfigProvider : IConfigurationProvider
{
string _configKey ;
string _connectionString ;
string _path ;
IConfigurationBuilder _builder ;
2025-02-18 16:23:08 +01:00
JObject _configuration ;
2025-02-11 23:10:43 +01:00
SmartConfigOptions _smartConfigOptions ;
public SmartConfigProvider ( ) { }
public SmartConfigProvider ( IConfigurationBuilder builder , SmartConfigOptions smartConfigOptions )
{
_builder = builder ;
_smartConfigOptions = smartConfigOptions ;
_configKey = smartConfigOptions . _configKey ;
SetConnectionString ( ) ;
}
public SmartConfigProvider ( IConfigurationBuilder builder , string configKey , string configurationFilePath )
{
_builder = builder ;
_configKey = configKey ;
_path = configurationFilePath ;
SetConnectionString ( ) ;
}
void SetConnectionString ( )
{
var carrier = _builder . ConfigurationProviders . OfType < IHasConfigurationFilePath > ( ) . SingleOrDefault ( ) ;
if ( carrier ? . ConfigurationFilePath is null & & _path is null )
throw new ConfigurationException ( $"Expected a previous added ConfigurationProvider with IHasConfigurationFilePath or a configurationFilePath where to find the appsettingsfile" ) ;
_path ? ? = carrier . ConfigurationFilePath ;
if ( ! File . Exists ( _path ) )
throw new ConfigurationException ( $"File not found, configurationFilePath: {_path}" ) ;
using ( StreamReader file = File . OpenText ( _path ) )
using ( JsonTextReader reader = new JsonTextReader ( file ) )
{
2025-02-18 16:23:08 +01:00
var jsonConfiguration = ( JObject ) JToken . ReadFrom ( reader ) ;
2025-02-11 23:10:43 +01:00
_connectionString = jsonConfiguration . SelectToken ( $"ConnectionStrings.{_configKey}" ) ? . ToString ( ) ;
}
}
public void Build ( )
{
var repository = _smartConfigOptions . GetRepository ( ) ;
repository . ConnectionString = _connectionString ;
var configs = repository . GetActiveConfigurations ( ) ;
var pairs = configs . Select ( x = > new KeyValuePair < string , JToken > ( x . Key , JToken . Parse ( x . Value . ToString ( ) ) ) ) ;
_configuration = Common . KeyValueToJson . Convert ( pairs ) ;
}
2025-02-18 16:23:08 +01:00
public JObject Configuration ( )
2025-02-11 23:10:43 +01:00
{
return _configuration ;
}
}
}