195 lines
6.7 KiB
C#
195 lines
6.7 KiB
C#
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}")
|
|
};
|
|
}
|
|
}
|
|
|