Initial commit

This commit is contained in:
2026-07-03 16:31:37 +07:00
commit 899c7c637d
1939 changed files with 641750 additions and 0 deletions

View File

@@ -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}")
};
}
}