using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Haoliang.Core.Services; using Haoliang.Models.System; using Haoliang.Models.Common; namespace Haoliang.Api.Controllers { [ApiController] [Route("api/v1/[controller]")] public class SystemController : ControllerBase { private readonly ISystemConfigService _configService; private readonly ILoggingService _loggingService; private readonly ISchedulerService _schedulerService; public SystemController( ISystemConfigService configService, ILoggingService loggingService, ISchedulerService schedulerService) { _configService = configService; _loggingService = loggingService; _schedulerService = schedulerService; } [HttpGet("config")] public async Task GetAllConfigs() { try { var configs = await _configService.GetAllConfigsAsync(); return Ok(ApiResponse.Ok(configs)); } catch (Exception ex) { await _loggingService.LogErrorAsync("Failed to get system configs", ex); return StatusCode(500, ApiResponse.Error("Failed to get system configs")); } } [HttpGet("config/{key}")] public async Task GetConfig(string key) { try { var config = await _configService.GetConfigAsync(key); if (config == null) { return NotFound(ApiResponse.NotFound($"Config '{key}' not found")); } return Ok(ApiResponse.Ok(config)); } catch (Exception ex) { await _loggingService.LogErrorAsync($"Failed to get config '{key}'", ex); return StatusCode(500, ApiResponse.Error("Failed to get config")); } } [HttpPost("config/{key}")] public async Task SetConfig(string key, [FromBody] SetConfigRequest request) { try { var config = await _configService.SetConfigAsync(key, request.Value); return Ok(ApiResponse.Ok(config, "Config updated successfully")); } catch (Exception ex) { await _loggingService.LogErrorAsync($"Failed to set config '{key}'", ex); return StatusCode(500, ApiResponse.Error("Failed to set config")); } } [HttpDelete("config/{key}")] public async Task DeleteConfig(string key) { try { var result = await _configService.DeleteConfigAsync(key); if (!result) { return NotFound(ApiResponse.NotFound($"Config '{key}' not found")); } return Ok(ApiResponse.Ok(null, "Config deleted successfully")); } catch (Exception ex) { await _loggingService.LogErrorAsync($"Failed to delete config '{key}'", ex); return StatusCode(500, ApiResponse.Error("Failed to delete config")); } } [HttpGet("config/{key}/exists")] public async Task ConfigExists(string key) { try { var exists = await _configService.ConfigExistsAsync(key); return Ok(ApiResponse.Ok(exists)); } catch (Exception ex) { await _loggingService.LogErrorAsync($"Failed to check if config '{key}' exists", ex); return StatusCode(500, ApiResponse.Error("Failed to check config existence")); } } [HttpGet("config/category/{category}")] public async Task GetConfigsByCategory(string category) { try { var configs = await _configService.GetConfigsByCategoryAsync(category); return Ok(ApiResponse.Ok(configs)); } catch (Exception ex) { await _loggingService.LogErrorAsync($"Failed to get configs by category '{category}'", ex); return StatusCode(500, ApiResponse.Error("Failed to get configs by category")); } } [HttpPost("config/refresh")] public async Task RefreshConfigCache() { try { await _configService.RefreshConfigCacheAsync(); return Ok(ApiResponse.Ok(null, "Config cache refreshed successfully")); } catch (Exception ex) { await _loggingService.LogErrorAsync("Failed to refresh config cache", ex); return StatusCode(500, ApiResponse.Error("Failed to refresh config cache")); } } [HttpGet("logs")] public async Task GetLogs( [FromQuery] Haoliang.Models.System.LogLevel? logLevel = null, [FromQuery] DateTime? startDate = null, [FromQuery] DateTime? endDate = null, [FromQuery] string category = null) { try { var logs = await _loggingService.GetLogsAsync(logLevel, startDate, endDate, category); return Ok(ApiResponse.Ok(logs)); } catch (Exception ex) { await _loggingService.LogErrorAsync("Failed to get logs", ex); return StatusCode(500, ApiResponse.Error("Failed to get logs")); } } [HttpGet("logs/error")] public async Task GetErrorLogs([FromQuery] DateTime? startDate = null, [FromQuery] DateTime? endDate = null) { try { var logs = await _loggingService.GetErrorLogsAsync(startDate, endDate); return Ok(ApiResponse.Ok(logs)); } catch (Exception ex) { await _loggingService.LogErrorAsync("Failed to get error logs", ex); return StatusCode(500, ApiResponse.Error("Failed to get error logs")); } } [HttpGet("logs/count")] public async Task GetLogCount( [FromQuery] Haoliang.Models.System.LogLevel? logLevel = null, [FromQuery] DateTime? startDate = null, [FromQuery] DateTime? endDate = null) { try { var count = await _loggingService.GetLogCountAsync(logLevel, startDate, endDate); return Ok(ApiResponse.Ok(count)); } catch (Exception ex) { await _loggingService.LogErrorAsync("Failed to get log count", ex); return StatusCode(500, ApiResponse.Error("Failed to get log count")); } } [HttpPost("logs/archive")] public async Task ArchiveLogs([FromQuery] int daysToKeep = 30) { try { await _loggingService.ArchiveLogsAsync(daysToKeep); return Ok(ApiResponse.Ok(null, "Logs archived successfully")); } catch (Exception ex) { await _loggingService.LogErrorAsync("Failed to archive logs", ex); return StatusCode(500, ApiResponse.Error("Failed to archive logs")); } } [HttpPost("logs/clear")] public async Task ClearLogs() { try { await _loggingService.ClearLogsAsync(); return Ok(ApiResponse.Ok(null, "Logs cleared successfully")); } catch (Exception ex) { await _loggingService.LogErrorAsync("Failed to clear logs", ex); return StatusCode(500, ApiResponse.Error("Failed to clear logs")); } } [HttpGet("scheduler/tasks")] public async Task GetScheduledTasks() { try { var tasks = await _schedulerService.GetAllScheduledTasksAsync(); return Ok(ApiResponse.Ok(tasks)); } catch (Exception ex) { await _loggingService.LogErrorAsync("Failed to get scheduled tasks", ex); return StatusCode(500, ApiResponse.Error("Failed to get scheduled tasks")); } } [HttpGet("scheduler/tasks/{taskId}")] public async Task GetScheduledTask(string taskId) { try { var task = await _schedulerService.GetTaskByIdAsync(taskId); if (task == null) { return NotFound(ApiResponse.NotFound("Task not found")); } return Ok(ApiResponse.Ok(task)); } catch (Exception ex) { await _loggingService.LogErrorAsync($"Failed to get task {taskId}", ex); return StatusCode(500, ApiResponse.Error("Failed to get task")); } } [HttpPost("scheduler/tasks")] public async Task CreateScheduledTask([FromBody] Haoliang.Core.Services.ScheduledTask task) { try { await _schedulerService.ScheduleTaskAsync(task); return Ok(ApiResponse.Ok(task, "Task scheduled successfully")); } catch (Exception ex) { await _loggingService.LogErrorAsync("Failed to create scheduled task", ex); return StatusCode(500, ApiResponse.Error("Failed to create scheduled task")); } } [HttpPost("scheduler/tasks/{taskId}/execute")] public async Task ExecuteTask(string taskId) { try { await _schedulerService.ExecuteTaskAsync(taskId); return Ok(ApiResponse.Ok(null, "Task execution started")); } catch (Exception ex) { await _loggingService.LogErrorAsync($"Failed to execute task {taskId}", ex); return StatusCode(500, ApiResponse.Error("Failed to execute task")); } } [HttpPost("scheduler/tasks/{taskId}/remove")] public async Task RemoveTask(string taskId) { try { var result = await _schedulerService.RemoveTaskAsync(taskId); if (!result) { return NotFound(ApiResponse.NotFound("Task not found")); } return Ok(ApiResponse.Ok(null, "Task removed successfully")); } catch (Exception ex) { await _loggingService.LogErrorAsync($"Failed to remove task {taskId}", ex); return StatusCode(500, ApiResponse.Error("Failed to remove task")); } } [HttpPost("scheduler/start")] public async Task StartScheduler() { try { await _schedulerService.StartSchedulerAsync(); return Ok(ApiResponse.Ok(null, "Scheduler started successfully")); } catch (Exception ex) { await _loggingService.LogErrorAsync("Failed to start scheduler", ex); return StatusCode(500, ApiResponse.Error("Failed to start scheduler")); } } [HttpPost("scheduler/stop")] public async Task StopScheduler() { try { await _schedulerService.StopSchedulerAsync(); return Ok(ApiResponse.Ok(null, "Scheduler stopped successfully")); } catch (Exception ex) { await _loggingService.LogErrorAsync("Failed to stop scheduler", ex); return StatusCode(500, ApiResponse.Error("Failed to stop scheduler")); } } [HttpGet("status")] public async Task GetSystemStatus() { try { var status = new SystemStatus { Timestamp = DateTime.Now, Uptime = DateTime.Now - new DateTime(2024, 1, 1), MemoryUsage = GetMemoryUsage(), CpuUsage = GetCpuUsage(), DatabaseConnections = GetDatabaseConnections(), ActiveConnections = GetActiveConnections(), LastBackupTime = GetLastBackupTime(), SystemVersion = "1.0.0", IsHealthy = IsSystemHealthy() }; return Ok(ApiResponse.Ok(status)); } catch (Exception ex) { await _loggingService.LogErrorAsync("Failed to get system status", ex); return StatusCode(500, ApiResponse.Error("Failed to get system status")); } } [HttpGet("health")] public async Task GetSystemHealth() { try { var health = new SystemHealth { Status = IsSystemHealthy() ? "Healthy" : "Unhealthy", Checks = await PerformHealthChecksAsync(), Timestamp = DateTime.Now }; return Ok(ApiResponse.Ok(health)); } catch (Exception ex) { await _loggingService.LogErrorAsync("Failed to get system health", ex); return StatusCode(500, ApiResponse.Error("Failed to get system health")); } } private double GetMemoryUsage() { // 简化的内存使用率获取 return 65.5; // 示例值 } private double GetCpuUsage() { // 简化的CPU使用率获取 return 25.3; // 示例值 } private int GetDatabaseConnections() { // 简化的数据库连接数获取 return 15; // 示例值 } private int GetActiveConnections() { // 简化的活跃连接数获取 return 8; // 示例值 } private DateTime? GetLastBackupTime() { // 简化的最后备份时间获取 return DateTime.Now.AddDays(-1); // 示例值 } private bool IsSystemHealthy() { // 简化的系统健康检查 return true; } private async Task> PerformHealthChecksAsync() { var checks = new List(); // 数据库连接检查 checks.Add(new HealthCheck { Name = "Database", Status = "Healthy", Message = "Database connection is normal" }); // 磁盘空间检查 checks.Add(new HealthCheck { Name = "Disk Space", Status = "Healthy", Message = "Disk space is sufficient" }); // 内存使用检查 checks.Add(new HealthCheck { Name = "Memory", Status = "Healthy", Message = "Memory usage is normal" }); // 服务状态检查 checks.Add(new HealthCheck { Name = "Services", Status = "Healthy", Message = "All services are running" }); return checks; } } public class SetConfigRequest { public string Value { get; set; } } public class SystemStatus { public DateTime Timestamp { get; set; } public TimeSpan Uptime { get; set; } public double MemoryUsage { get; set; } public double CpuUsage { get; set; } public int DatabaseConnections { get; set; } public int ActiveConnections { get; set; } public DateTime? LastBackupTime { get; set; } public string SystemVersion { get; set; } public bool IsHealthy { get; set; } } public class SystemHealth { public string Status { get; set; } public IEnumerable Checks { get; set; } public DateTime Timestamp { get; set; } } public class HealthCheck { public string Name { get; set; } public string Status { get; set; } public string Message { get; set; } } }