using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.SignalR;
using RobotNet10.RobotApp.Client.Shared.Devices;
using RobotNet10.RobotApp.Devices;
namespace RobotNet10.RobotApp.Hubs;
///
/// SignalR Hub cho DeviceProvider - cung cấp real-time device information
///
[Authorize]
public class DeviceHub(IDeviceProvider deviceProvider) : Hub
{
///
/// Lấy tất cả devices
///
public Task GetAllDevices()
{
var devices = deviceProvider.GetAllDevices();
return Task.FromResult(devices.Select(MapToDto).ToArray());
}
///
/// Lấy device theo ID
///
public Task GetDevice(string deviceId)
{
var device = deviceProvider.GetDevice(deviceId);
return Task.FromResult(device != null ? MapToDto(device) : null);
}
///
/// Lấy devices theo type
///
public Task GetDevicesByType(DeviceType deviceType)
{
var serverType = deviceType;
var devices = deviceProvider.GetDevicesByType(serverType);
return Task.FromResult(devices.Select(MapToDto).ToArray());
}
///
/// Lấy số lượng devices
///
public Task GetDeviceCount()
{
return Task.FromResult(deviceProvider.GetDeviceCount());
}
///
/// Map DeviceBase sang DeviceDto
///
private static DeviceDto MapToDto(DeviceBase device)
{
return new DeviceDto
{
DeviceId = device.DeviceId,
DeviceName = device.DeviceName,
DeviceType = device.Type,
Description = device.Description,
Status = device.Status,
IsConnected = device.IsConnected,
LastUpdateTime = device.LastUpdateStateTime,
LastConnectedTime = device.LastConnectedTime,
LastDisconnectedTime = device.LastDisconnectedTime,
LastError = device.LastError?.Message,
ReconnectAttemptCount = device.ReconnectAttemptCount,
AutoReconnectEnabled = device.AutoReconnectEnabled,
ReconnectDelayMs = device.ReconnectDelayMs,
MaxReconnectAttempts = device.MaxReconnectAttempts,
PropertyDescriptions = device.PropertyDescriptions.Select(MapPropertyDescription).ToList(),
Properties = device.Properties.ToDictionary(kvp => kvp.Key, kvp => kvp.Value)
};
}
///
/// Map PropertyDescription sang PropertyDescriptionDto
///
private static PropertyDescription MapPropertyDescription(PropertyDescription prop)
{
return new PropertyDescription
{
Key = prop.Key,
DisplayName = prop.DisplayName,
Description = prop.Description,
DataType = prop.DataType,
Unit = prop.Unit,
DefaultValue = prop.DefaultValue,
IsReadOnly = prop.IsReadOnly,
DisplayOrder = prop.DisplayOrder,
Category = prop.Category,
Format = prop.Format
};
}
}