using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Haoliang.Core.Services; using Haoliang.Models.Common; namespace Haoliang.Api.Controllers { [Route("api/v1/realtime")] [ApiController] public class RealTimeController : ControllerBase { private readonly IRealTimeService _realTimeService; public RealTimeController(IRealTimeService realTimeService) { _realTimeService = realTimeService; } /// /// Get connected clients count /// [HttpGet("clients/count")] public async Task>> GetConnectedClientsCount() { try { var count = await _realTimeService.GetConnectedClientsCountAsync(); return Ok(ApiResponse.Ok(count)); } catch (Exception ex) { return StatusCode(500, ApiResponse.InternalServerErrorResult($"Error getting connected clients count: {ex.Message}")); } } /// /// Get connected clients by type /// [HttpGet("clients/{clientType}")] public async Task>>> GetConnectedClientsByType(string clientType) { try { var clients = await _realTimeService.GetConnectedClientsByTypeAsync(clientType); return Ok(ApiResponse>.Ok(clients)); } catch (Exception ex) { return StatusCode(500, ApiResponse>.InternalServerError($"Error getting connected clients by type: {ex.Message}")); } } /// /// Get device monitoring status /// [HttpGet("devices/{deviceId}/monitoring")] public async Task>> GetDeviceMonitoringStatus(int deviceId) { try { var status = await _realTimeService.GetDeviceMonitoringStatusAsync(deviceId); return Ok(ApiResponse.Ok(status)); } catch (Exception ex) { return StatusCode(500, ApiResponse.InternalServerErrorResult($"Error getting device monitoring status: {ex.Message}")); } } /// /// Start device streaming /// [HttpPost("devices/{deviceId}/streaming/start")] public async Task>> StartDeviceStreaming( int deviceId, [FromQuery] int intervalMs = 1000) { try { await _realTimeService.StartDeviceStreamingAsync(deviceId, intervalMs); return Ok(ApiResponse.Ok(true)); } catch (Exception ex) { return StatusCode(500, ApiResponse.InternalServerErrorResult($"Error starting device streaming: {ex.Message}")); } } /// /// Stop device streaming /// [HttpPost("devices/{deviceId}/streaming/stop")] public async Task>> StopDeviceStreaming(int deviceId) { try { await _realTimeService.StopDeviceStreamingAsync(deviceId); return Ok(ApiResponse.Ok(true)); } catch (Exception ex) { return StatusCode(500, ApiResponse.InternalServerErrorResult($"Error stopping device streaming: {ex.Message}")); } } /// /// Get active streaming devices /// [HttpGet("devices/streaming/active")] public async Task>>> GetActiveStreamingDevices() { try { var devices = await _realTimeService.GetActiveStreamingDevicesAsync(); return Ok(ApiResponse>.Ok(devices)); } catch (Exception ex) { return StatusCode(500, ApiResponse>.InternalServerError($"Error getting active streaming devices: {ex.Message}")); } } /// /// Send test device status update /// [HttpPost("devices/{deviceId}/status")] public async Task>> SendDeviceStatusUpdate( int deviceId, [FromBody] DeviceStatusUpdate statusUpdate) { try { statusUpdate.DeviceId = deviceId; statusUpdate.Timestamp = DateTime.UtcNow; await _realTimeService.BroadcastDeviceStatusAsync(statusUpdate); return Ok(ApiResponse.Ok(true)); } catch (Exception ex) { return StatusCode(500, ApiResponse.InternalServerErrorResult($"Error sending device status update: {ex.Message}")); } } /// /// Send test production update /// [HttpPost("devices/{deviceId}/production")] public async Task>> SendProductionUpdate( int deviceId, [FromBody] ProductionUpdate productionUpdate) { try { productionUpdate.DeviceId = deviceId; productionUpdate.Timestamp = DateTime.UtcNow; await _realTimeService.BroadcastProductionUpdateAsync(productionUpdate); return Ok(ApiResponse.Ok(true)); } catch (Exception ex) { return StatusCode(500, ApiResponse.InternalServerErrorResult($"Error sending production update: {ex.Message}")); } } /// /// Send test alert /// [HttpPost("alerts")] public async Task>> SendAlert([FromBody] AlertUpdate alertUpdate) { try { alertUpdate.Timestamp = DateTime.UtcNow; await _realTimeService.BroadcastAlertAsync(alertUpdate); return Ok(ApiResponse.Ok(true)); } catch (Exception ex) { return StatusCode(500, ApiResponse.InternalServerErrorResult($"Error sending alert: {ex.Message}")); } } /// /// Send system notification /// [HttpPost("notifications")] public async Task>> SendSystemNotification([FromBody] SystemNotification notification) { try { notification.Timestamp = DateTime.UtcNow; await _realTimeService.SendSystemNotificationAsync(notification); return Ok(ApiResponse.Ok(true)); } catch (Exception ex) { return StatusCode(500, ApiResponse.InternalServerErrorResult($"Error sending system notification: {ex.Message}")); } } /// /// Send dashboard update /// [HttpPost("dashboard")] public async Task>> SendDashboardUpdate([FromBody] DashboardUpdate dashboardUpdate) { try { dashboardUpdate.Timestamp = DateTime.UtcNow; await _realTimeService.SendDashboardUpdateAsync(dashboardUpdate); return Ok(ApiResponse.Ok(true)); } catch (Exception ex) { return StatusCode(500, ApiResponse.InternalServerErrorResult($"Error sending dashboard update: {ex.Message}")); } } /// /// Send command to specific client /// [HttpPost("clients/{connectionId}/command")] public async Task>> SendCommandToClient( string connectionId, [FromBody] RealTimeCommand command) { try { command.Timestamp = DateTime.UtcNow; await _realTimeService.SendCommandToClientAsync(connectionId, command); return Ok(ApiResponse.Ok(true)); } catch (Exception ex) { return StatusCode(500, ApiResponse.InternalServerErrorResult($"Error sending command to client: {ex.Message}")); } } /// /// Broadcast command to all clients /// [HttpPost("command/broadcast")] public async Task>> BroadcastCommand([FromBody] RealTimeCommand command) { try { command.Timestamp = DateTime.UtcNow; await _realTimeService.BroadcastCommandAsync(command); return Ok(ApiResponse.Ok(true)); } catch (Exception ex) { return StatusCode(500, ApiResponse.InternalServerErrorResult($"Error broadcasting command: {ex.Message}")); } } /// /// Get WebSocket connection URL /// [HttpGet("connection-url")] public ActionResult> GetConnectionUrl() { try { var baseUrl = $"{Request.Scheme}://{Request.Host}"; var connectionUrl = $"{baseUrl}/realtimehub"; return Ok(ApiResponse.Ok(connectionUrl)); } catch (Exception ex) { return StatusCode(500, ApiResponse.InternalServerErrorResult($"Error getting connection URL: {ex.Message}")); } } /// /// Test WebSocket connectivity /// [HttpGet("test")] public async Task>> TestWebSocket() { try { var testResult = new TestResult { TestId = Guid.NewGuid().ToString(), Timestamp = DateTime.UtcNow, ConnectedClients = await _realTimeService.GetConnectedClientsCountAsync(), ActiveStreamingDevices = (await _realTimeService.GetActiveStreamingDevicesAsync()).ToList(), Status = "Success" }; return Ok(ApiResponse.Ok(testResult)); } catch (Exception ex) { return StatusCode(500, ApiResponse.InternalServerErrorResult($"Error testing WebSocket: {ex.Message}")); } } /// /// Get WebSocket statistics /// [HttpGet("statistics")] public async Task>> GetWebSocketStatistics() { try { var connectedClients = await _realTimeService.GetConnectedClientsCountAsync(); var streamingDevices = (await _realTimeService.GetActiveStreamingDevicesAsync()).ToList(); var stats = new WebSocketStatistics { Timestamp = DateTime.UtcNow, ConnectedClients = connectedClients, ActiveStreamingDevices = streamingDevices.Count, TotalSessions = connectedClients, // Simplified MessageCount = 0, // Would need to track this in the service BytesTransferred = 0 // Would need to track this in the service }; return Ok(ApiResponse.Ok(stats)); } catch (Exception ex) { return StatusCode(500, ApiResponse.InternalServerErrorResult($"Error getting WebSocket statistics: {ex.Message}")); } } /// /// Force refresh dashboard data /// [HttpPost("dashboard/refresh")] public async Task>> RefreshDashboardData() { try { // This would trigger the dashboard update logic // Implementation depends on specific requirements return Ok(ApiResponse.Ok(true)); } catch (Exception ex) { return StatusCode(500, ApiResponse.InternalServerErrorResult($"Error refreshing dashboard data: {ex.Message}")); } } } }