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