You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

257 lines
8.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Haoliang.Models.System;
using Haoliang.Data.Repositories;
namespace Haoliang.Core.Services
{
public interface ISystemConfigService
{
Task<SystemConfig> GetConfigAsync(string configKey);
Task<SystemConfig> SetConfigAsync(string configKey, string configValue);
Task<IEnumerable<SystemConfig>> GetAllConfigsAsync();
Task<bool> DeleteConfigAsync(string configKey);
Task<SystemConfig> GetOrCreateConfigAsync(string configKey, string defaultValue);
Task<bool> ValidateConfigAsync(SystemConfig config);
}
public class SystemConfigService : ISystemConfigService
{
private readonly ISystemConfigRepository _configRepository;
private readonly ILoggerService _logger;
public SystemConfigService(
ISystemConfigRepository configRepository,
ILoggerService logger)
{
_configRepository = configRepository;
_logger = logger;
}
public async Task<SystemConfig> GetConfigAsync(string configKey)
{
return await _configRepository.GetByKeyAsync(configKey);
}
public async Task<SystemConfig> SetConfigAsync(string configKey, string configValue)
{
var existingConfig = await _configRepository.GetByKeyAsync(configKey);
if (existingConfig != null)
{
// Update existing config
existingConfig.ConfigValue = configValue;
existingConfig.UpdateTime = DateTime.Now;
var updatedConfig = await _configRepository.UpdateAsync(existingConfig);
await _logger.LogInformationAsync($"Updated config '{configKey}' with new value");
return updatedConfig;
}
else
{
// Create new config
var newConfig = new SystemConfig
{
ConfigKey = configKey,
ConfigValue = configValue,
Description = $"Configuration for {configKey}",
CreatedAt = DateTime.Now,
UpdateTime = DateTime.Now
};
var createdConfig = await _configRepository.AddAsync(newConfig);
await _logger.LogInformationAsync($"Created new config '{configKey}'");
return createdConfig;
}
}
public async Task<IEnumerable<SystemConfig>> GetAllConfigsAsync()
{
return await _configRepository.GetAllAsync();
}
public async Task<bool> DeleteConfigAsync(string configKey)
{
var config = await _configRepository.GetByKeyAsync(configKey);
if (config != null)
{
var result = await _configRepository.DeleteAsync(config.ConfigId);
if (result)
{
await _logger.LogInformationAsync($"Deleted config '{configKey}'");
}
return result;
}
return false;
}
public async Task<SystemConfig> GetOrCreateConfigAsync(string configKey, string defaultValue)
{
var config = await GetConfigAsync(configKey);
if (config == null)
{
return await SetConfigAsync(configKey, defaultValue);
}
return config;
}
public async Task<bool> ValidateConfigAsync(SystemConfig config)
{
if (config == null)
{
await _logger.LogWarningAsync("System config validation failed: config is null");
return false;
}
if (string.IsNullOrEmpty(config.ConfigKey))
{
await _logger.LogWarningAsync("System config validation failed: config key is empty");
return false;
}
if (string.IsNullOrEmpty(config.ConfigValue))
{
await _logger.LogWarningAsync($"System config validation failed: config value is empty for key '{config.ConfigKey}'");
return false;
}
// Validate specific config keys
if (config.ConfigKey == "DailyProductionTarget" && !int.TryParse(config.ConfigValue, out _))
{
await _logger.LogWarningAsync($"System config validation failed: invalid DailyProductionTarget value '{config.ConfigValue}'");
return false;
}
if (config.ConfigKey == "CollectionInterval" && !int.TryParse(config.ConfigValue, out _))
{
await _logger.LogWarningAsync($"System config validation failed: invalid CollectionInterval value '{config.ConfigValue}'");
return false;
}
return true;
}
}
public class SystemConfigManager : ISystemConfigService
{
private readonly ISystemConfigRepository _configRepository;
private readonly ILoggerService _logger;
public SystemConfigManager(
ISystemConfigRepository configRepository,
ILoggerService logger)
{
_configRepository = configRepository;
_logger = logger;
}
public async Task<SystemConfig> GetConfigAsync(string configKey)
{
return await _configRepository.GetByKeyAsync(configKey);
}
public async Task<SystemConfig> SetConfigAsync(string configKey, string configValue)
{
return await new SystemConfigService(_configRepository, _logger).SetConfigAsync(configKey, configValue);
}
public async Task<IEnumerable<SystemConfig>> GetAllConfigsAsync()
{
return await _configRepository.GetAllAsync();
}
public async Task<bool> DeleteConfigAsync(string configKey)
{
return await _configRepository.DeleteByKeyAsync(configKey);
}
public async Task<SystemConfig> GetOrCreateConfigAsync(string configKey, string defaultValue)
{
return await new SystemConfigService(_configRepository, _logger).GetOrCreateConfigAsync(configKey, defaultValue);
}
public async Task<bool> ValidateConfigAsync(SystemConfig config)
{
return await new SystemConfigService(_configRepository, _logger).ValidateConfigAsync(config);
}
}
public class LoggingManager : ILoggingService
{
private readonly ILogRepository _logRepository;
private readonly ILoggerService _logger;
public LoggingManager(
ILogRepository logRepository,
ILoggerService logger)
{
_logRepository = logRepository;
_logger = logger;
}
public async Task LogInformationAsync(string message)
{
await _logRepository.LogAsync(message, "Information");
await _logger.LogInformationAsync(message);
}
public async Task LogWarningAsync(string message)
{
await _logRepository.LogAsync(message, "Warning");
await _logger.LogWarningAsync(message);
}
public async Task LogErrorAsync(string message)
{
await _logRepository.LogAsync(message, "Error");
await _logger.LogErrorAsync(message);
}
public async Task LogDebugAsync(string message)
{
await _logRepository.LogAsync(message, "Debug");
await _logger.LogDebugAsync(message);
}
public async Task LogExceptionAsync(Exception ex, string message)
{
var fullMessage = $"{message}: {ex.Message}\n{ex.StackTrace}";
await _logRepository.LogAsync(fullMessage, "Error");
await _logger.LogErrorAsync(fullMessage);
}
public async Task LogAsync(LogLevel level, string message)
{
await _logRepository.LogAsync(message, level.ToString());
await LogByLevel(level, message);
}
private async Task LogByLevel(LogLevel level, string message)
{
switch (level)
{
case LogLevel.Trace:
await _logger.LogDebugAsync(message);
break;
case LogLevel.Debug:
await _logger.LogDebugAsync(message);
break;
case LogLevel.Information:
await _logger.LogInformationAsync(message);
break;
case LogLevel.Warning:
await _logger.LogWarningAsync(message);
break;
case LogLevel.Error:
case LogLevel.Critical:
await _logger.LogErrorAsync(message);
break;
default:
await _logger.LogInformationAsync(message);
break;
}
}
}
}