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