Initial commit
This commit is contained in:
@@ -0,0 +1,194 @@
|
||||
using RobotNet10.CustomConfiguration.Events;
|
||||
using RobotNet10.CustomConfiguration.Models;
|
||||
|
||||
namespace RobotNet10.CustomConfiguration.Services;
|
||||
|
||||
/// <summary>
|
||||
/// Implementation của IConfigManager
|
||||
/// Service cho quản lý và truy vấn configuration variables
|
||||
/// </summary>
|
||||
public class ConfigManager : IConfigManager, IDisposable
|
||||
{
|
||||
private readonly IConfigService _configService;
|
||||
|
||||
// ==========================================
|
||||
// EVENTS
|
||||
// ==========================================
|
||||
|
||||
public event EventHandler<ConfigChangedEventArgs>? ConfigChanged;
|
||||
|
||||
/// <summary>
|
||||
/// Constructor - Subscribe vào ConfigChanged event từ IConfigService
|
||||
/// </summary>
|
||||
public ConfigManager(IConfigService configService)
|
||||
{
|
||||
_configService = configService ?? throw new ArgumentNullException(nameof(configService));
|
||||
|
||||
// Forward events from IConfigService to IConfigManager
|
||||
_configService.ConfigChanged += OnConfigServiceChanged;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Forward ConfigChanged event from IConfigService to IConfigManager subscribers
|
||||
/// </summary>
|
||||
private void OnConfigServiceChanged(object? sender, ConfigChangedEventArgs args)
|
||||
{
|
||||
ConfigChanged?.Invoke(this, args);
|
||||
}
|
||||
|
||||
// ==========================================
|
||||
// CONFIG TYPE OPERATIONS
|
||||
// ==========================================
|
||||
|
||||
public async Task<ConfigFile?> GetConfigByTypeAsync(string configType)
|
||||
{
|
||||
return await _configService.GetConfigByTypeAsync(configType);
|
||||
}
|
||||
|
||||
public async Task<bool> ConfigTypeExistsAsync(string configType)
|
||||
{
|
||||
return await _configService.ConfigTypeExistsAsync(configType);
|
||||
}
|
||||
|
||||
// ==========================================
|
||||
// VARIABLE EXISTENCE CHECK
|
||||
// ==========================================
|
||||
|
||||
public async Task<bool> VariableExistsAsync(string configType, string variableName)
|
||||
{
|
||||
var config = await _configService.GetConfigByTypeAsync(configType);
|
||||
if (config == null)
|
||||
return false;
|
||||
|
||||
return config.Variables.Any(v => v.Name.Equals(variableName, StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
public async Task<bool> VariableExistsAsync(Guid configId, string variableName)
|
||||
{
|
||||
var config = await _configService.GetConfigByIdAsync(configId);
|
||||
if (config == null)
|
||||
return false;
|
||||
|
||||
return config.Variables.Any(v => v.Name.Equals(variableName, StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
// ==========================================
|
||||
// GET VARIABLE VALUE
|
||||
// ==========================================
|
||||
|
||||
public async Task<object?> GetVariableValueAsync(string configType, string variableName)
|
||||
{
|
||||
var variable = await GetVariableAsync(configType, variableName);
|
||||
return variable?.Value;
|
||||
}
|
||||
|
||||
public async Task<object?> GetVariableValueAsync(Guid configId, string variableName)
|
||||
{
|
||||
var variable = await GetVariableAsync(configId, variableName);
|
||||
return variable?.Value;
|
||||
}
|
||||
|
||||
// ==========================================
|
||||
// GET VARIABLE(S)
|
||||
// ==========================================
|
||||
|
||||
public async Task<ConfigVariable?> GetVariableAsync(string configType, string variableName)
|
||||
{
|
||||
var config = await _configService.GetConfigByTypeAsync(configType);
|
||||
if (config == null)
|
||||
return null;
|
||||
|
||||
return config.Variables.FirstOrDefault(v => v.Name.Equals(variableName, StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
public async Task<List<ConfigVariable>> GetVariablesAsync(string configType)
|
||||
{
|
||||
var config = await _configService.GetConfigByTypeAsync(configType);
|
||||
return config?.Variables ?? [];
|
||||
}
|
||||
|
||||
public async Task<ConfigVariable?> GetVariableAsync(Guid configId, string variableName)
|
||||
{
|
||||
var config = await _configService.GetConfigByIdAsync(configId);
|
||||
if (config == null)
|
||||
return null;
|
||||
|
||||
return config.Variables.FirstOrDefault(v => v.Name.Equals(variableName, StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
public async Task<List<ConfigVariable>> GetVariablesAsync(Guid configId)
|
||||
{
|
||||
var config = await _configService.GetConfigByIdAsync(configId);
|
||||
return config?.Variables ?? [];
|
||||
}
|
||||
|
||||
// ==========================================
|
||||
// GET VARIABLE TYPE
|
||||
// ==========================================
|
||||
|
||||
public async Task<string?> GetVariableTypeAsync(string configType, string variableName)
|
||||
{
|
||||
var variable = await GetVariableAsync(configType, variableName);
|
||||
return variable != null ? ConvertTypeToString(variable.Type) : null;
|
||||
}
|
||||
|
||||
public async Task<string?> GetVariableTypeAsync(Guid configId, string variableName)
|
||||
{
|
||||
var variable = await GetVariableAsync(configId, variableName);
|
||||
return variable != null ? ConvertTypeToString(variable.Type) : null;
|
||||
}
|
||||
|
||||
// ==========================================
|
||||
// EVENT TRIGGERS
|
||||
// ==========================================
|
||||
|
||||
/// <summary>
|
||||
/// Trigger ConfigChanged event
|
||||
/// Method này có thể được gọi từ bên ngoài hoặc từ các service khác khi có thay đổi
|
||||
/// </summary>
|
||||
public void OnConfigChanged(string configType, Guid configId, ConfigChangeType changeType, string? variableName = null)
|
||||
{
|
||||
var args = new ConfigChangedEventArgs
|
||||
{
|
||||
ConfigType = configType,
|
||||
ConfigId = configId,
|
||||
ChangeType = changeType,
|
||||
VariableName = variableName
|
||||
};
|
||||
|
||||
ConfigChanged?.Invoke(this, args);
|
||||
}
|
||||
|
||||
// ==========================================
|
||||
// DISPOSE
|
||||
// ==========================================
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_configService.ConfigChanged -= OnConfigServiceChanged;
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
// ==========================================
|
||||
// HELPER METHODS
|
||||
// ==========================================
|
||||
|
||||
/// <summary>
|
||||
/// Convert ConfigVariableType enum thành string
|
||||
/// </summary>
|
||||
private static string ConvertTypeToString(ConfigVariableType type)
|
||||
{
|
||||
return type switch
|
||||
{
|
||||
ConfigVariableType.String => "string",
|
||||
ConfigVariableType.Int => "int",
|
||||
ConfigVariableType.Double => "double",
|
||||
ConfigVariableType.Bool => "bool",
|
||||
ConfigVariableType.Object => "object",
|
||||
ConfigVariableType.Array => "array",
|
||||
ConfigVariableType.Enum => "enum",
|
||||
_ => throw new ArgumentException($"Unknown variable type: {type}")
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user