device client implemented
This commit is contained in:
parent
56484b54c8
commit
d2eee41ed6
|
@ -23,6 +23,11 @@ namespace Yuna.Website.Server.API
|
||||||
app.MapGet("/api/device", GetAll)
|
app.MapGet("/api/device", GetAll)
|
||||||
.WithTags("device");
|
.WithTags("device");
|
||||||
|
|
||||||
|
app.MapGet("/api/device/{deviceId:long}/fetch", FetchData)
|
||||||
|
.WithTags("device")
|
||||||
|
.Produces<string>(404)
|
||||||
|
.Produces(200);
|
||||||
|
|
||||||
app.MapPut("/api/device/{deviceId:long}", AddSkillsToDevice)
|
app.MapPut("/api/device/{deviceId:long}", AddSkillsToDevice)
|
||||||
.WithTags("device");
|
.WithTags("device");
|
||||||
}
|
}
|
||||||
|
@ -93,5 +98,18 @@ namespace Yuna.Website.Server.API
|
||||||
if (result is null) return Results.NotFound("device");
|
if (result is null) return Results.NotFound("device");
|
||||||
return Results.Ok(result);
|
return Results.Ok(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Authorize]
|
||||||
|
public async Task<IResult> FetchData(long deviceId, IDeviceService deviceService)
|
||||||
|
{
|
||||||
|
var device = await deviceService.GetById(deviceId);
|
||||||
|
if (device is null) return Results.NotFound("device");
|
||||||
|
|
||||||
|
|
||||||
|
var result = await deviceService.FetchPropsData(device);
|
||||||
|
if (result is null) return Results.NotFound("props");
|
||||||
|
|
||||||
|
return Results.Ok(result);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,7 +51,8 @@ namespace Yuna.Website.Server.API
|
||||||
{
|
{
|
||||||
JsonValueName = request.JsonValueName,
|
JsonValueName = request.JsonValueName,
|
||||||
MeasureName = request.MeasureName ?? "",
|
MeasureName = request.MeasureName ?? "",
|
||||||
Name = request.Name
|
Name = request.Name,
|
||||||
|
Type = request.type.Equals("float") ? PropType.Float : PropType.Boolean
|
||||||
};
|
};
|
||||||
|
|
||||||
var result = await skillService.Create(prop);
|
var result = await skillService.Create(prop);
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
public class Prop
|
public class Prop
|
||||||
{
|
{
|
||||||
public long Id { get; set; }
|
public long Id { get; set; }
|
||||||
|
public PropType Type { get; set; }
|
||||||
public string Name { get; set; } = null!;
|
public string Name { get; set; } = null!;
|
||||||
public string MeasureName { get; set; } = null!;
|
public string MeasureName { get; set; } = null!;
|
||||||
public string JsonValueName { get; set; } = null!;
|
public string JsonValueName { get; set; } = null!;
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
namespace Yuna.Website.Server.Model
|
||||||
|
{
|
||||||
|
public enum PropType
|
||||||
|
{
|
||||||
|
Float = 0,
|
||||||
|
Boolean = 1,
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,6 +4,8 @@ using Yuna.Website.Server.Model;
|
||||||
|
|
||||||
using Yuna.Website.Server.Services.DeviceSkillService;
|
using Yuna.Website.Server.Services.DeviceSkillService;
|
||||||
using Yuna.Website.Server.Storage.Repositories.Device;
|
using Yuna.Website.Server.Storage.Repositories.Device;
|
||||||
|
using Microsoft.IdentityModel.Tokens;
|
||||||
|
using System.Text.Json;
|
||||||
|
|
||||||
namespace Yuna.Website.Server.Services.DeviceService
|
namespace Yuna.Website.Server.Services.DeviceService
|
||||||
{
|
{
|
||||||
|
@ -11,10 +13,19 @@ namespace Yuna.Website.Server.Services.DeviceService
|
||||||
{
|
{
|
||||||
private readonly IPropService _propService;
|
private readonly IPropService _propService;
|
||||||
private readonly IDeviceRepository _deviceRepository;
|
private readonly IDeviceRepository _deviceRepository;
|
||||||
public DeviceService(IPropService propService, IDeviceRepository repository)
|
private readonly IHttpClientFactory _httpClientFactory;
|
||||||
|
private readonly ILogger<DeviceService> _logger;
|
||||||
|
public DeviceService(
|
||||||
|
IPropService propService,
|
||||||
|
IDeviceRepository repository,
|
||||||
|
IHttpClientFactory factory,
|
||||||
|
ILogger<DeviceService> logger)
|
||||||
{
|
{
|
||||||
_propService = propService;
|
_propService = propService;
|
||||||
_deviceRepository = repository;
|
_deviceRepository = repository;
|
||||||
|
_httpClientFactory = factory;
|
||||||
|
_logger = logger;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Device?> AddProps(IReadOnlyList<Prop> props, long deviceId)
|
public async Task<Device?> AddProps(IReadOnlyList<Prop> props, long deviceId)
|
||||||
|
@ -28,6 +39,65 @@ namespace Yuna.Website.Server.Services.DeviceService
|
||||||
return device;
|
return device;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<Dictionary<long, string>?> FetchPropsData(Device device)
|
||||||
|
{
|
||||||
|
var result = new Dictionary<long, string>();
|
||||||
|
|
||||||
|
if (device.Props.IsNullOrEmpty()) return result;
|
||||||
|
|
||||||
|
var client = _httpClientFactory.CreateClient(device.DeviceUrl);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_logger.LogTrace("Trying to get data\n " +
|
||||||
|
"from device: {Id}\n" +
|
||||||
|
"via url: {DeviceUrl}", device.Id, device.DeviceUrl);
|
||||||
|
|
||||||
|
var response = await client.GetAsync(device.DeviceUrl);
|
||||||
|
|
||||||
|
_logger.LogTrace("Got response\n " +
|
||||||
|
"from device: {Id}\n" +
|
||||||
|
"via url: {DeviceUrl}", device.Id, device.DeviceUrl);
|
||||||
|
|
||||||
|
var strContent = await response.Content.ReadAsStringAsync();
|
||||||
|
|
||||||
|
result = ParseDeviceJson(device.Props, strContent);
|
||||||
|
}
|
||||||
|
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError("Fail: {Message}", ex.Message);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Dictionary<long, string> ParseDeviceJson(IEnumerable<Prop> props, string jsonStr)
|
||||||
|
{
|
||||||
|
var result = new Dictionary<long, string>();
|
||||||
|
|
||||||
|
using JsonDocument responseJson = JsonDocument.Parse(jsonStr);
|
||||||
|
|
||||||
|
foreach (var prop in props)
|
||||||
|
{
|
||||||
|
var propExists = responseJson.RootElement.TryGetProperty(prop.JsonValueName, out var propValue);
|
||||||
|
|
||||||
|
if (!propExists) throw new Exception($"Unable to find jsonValue {prop.JsonValueName}, aborting");
|
||||||
|
|
||||||
|
if(propValue.TryGetDouble(out var value))
|
||||||
|
{
|
||||||
|
result.Add(prop.Id, value.ToString());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
result.Add(prop.Id, propValue.GetBoolean().ToString()!);
|
||||||
|
|
||||||
|
_logger.LogTrace("Obtained value for {JsonValueName}", prop.JsonValueName);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<Device?> Create(Device device)
|
public async Task<Device?> Create(Device device)
|
||||||
{
|
{
|
||||||
var result = await _deviceRepository.Create(device);
|
var result = await _deviceRepository.Create(device);
|
||||||
|
|
|
@ -10,5 +10,6 @@ namespace Yuna.Website.Server.Services.DeviceService
|
||||||
//public Task<User?> Update(User user);
|
//public Task<User?> Update(User user);
|
||||||
public Task<Device?> Delete(long id);
|
public Task<Device?> Delete(long id);
|
||||||
public Task<Device?> AddProps(IReadOnlyList<Prop> props, long deviceId);
|
public Task<Device?> AddProps(IReadOnlyList<Prop> props, long deviceId);
|
||||||
|
public Task<Dictionary<long, string>?> FetchPropsData(Device device);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,10 +48,12 @@ namespace Yuna.Website.Server.Storage.Repositories.Device
|
||||||
d.""Id"" as {nameof(Model.Device.Id)},
|
d.""Id"" as {nameof(Model.Device.Id)},
|
||||||
d.""Name"" as {nameof(Model.Device.Name)},
|
d.""Name"" as {nameof(Model.Device.Name)},
|
||||||
d.""Description"" as {nameof(Model.Device.Description)},
|
d.""Description"" as {nameof(Model.Device.Description)},
|
||||||
|
d.""DeviceUrl"" as {nameof(Model.Device.DeviceUrl)},
|
||||||
p.""Id"" as {nameof(Model.Prop.Id)},
|
p.""Id"" as {nameof(Model.Prop.Id)},
|
||||||
p.""Name"" as {nameof(Model.Prop.Name)},
|
p.""Name"" as {nameof(Model.Prop.Name)},
|
||||||
p.""JsonValueName"" as {nameof(Model.Prop.JsonValueName)},
|
p.""JsonValueName"" as {nameof(Model.Prop.JsonValueName)},
|
||||||
p.""MeasureName"" as {nameof(Model.Prop.MeasureName)}
|
p.""MeasureName"" as {nameof(Model.Prop.MeasureName)},
|
||||||
|
p.""Type"" as {nameof(Model.Prop.Type)}
|
||||||
FROM ""Yuna_Devices"" d
|
FROM ""Yuna_Devices"" d
|
||||||
LEFT JOIN ""Yuna_Props_In_Devices"" pd ON d.""Id"" = pd.""DeviceId""
|
LEFT JOIN ""Yuna_Props_In_Devices"" pd ON d.""Id"" = pd.""DeviceId""
|
||||||
LEFT JOIN ""Yuna_Props"" p ON pd.""PropId"" = p.""Id""
|
LEFT JOIN ""Yuna_Props"" p ON pd.""PropId"" = p.""Id""
|
||||||
|
@ -84,10 +86,12 @@ namespace Yuna.Website.Server.Storage.Repositories.Device
|
||||||
d.""Id"" as {nameof(Model.Device.Id)},
|
d.""Id"" as {nameof(Model.Device.Id)},
|
||||||
d.""Name"" as {nameof(Model.Device.Name)},
|
d.""Name"" as {nameof(Model.Device.Name)},
|
||||||
d.""Description"" as {nameof(Model.Device.Description)},
|
d.""Description"" as {nameof(Model.Device.Description)},
|
||||||
|
d.""DeviceUrl"" as {nameof(Model.Device.DeviceUrl)},
|
||||||
p.""Id"" as {nameof(Model.Prop.Id)},
|
p.""Id"" as {nameof(Model.Prop.Id)},
|
||||||
p.""Name"" as {nameof(Model.Prop.Name)},
|
p.""Name"" as {nameof(Model.Prop.Name)},
|
||||||
p.""JsonValueName"" as {nameof(Model.Prop.JsonValueName)},
|
p.""JsonValueName"" as {nameof(Model.Prop.JsonValueName)},
|
||||||
p.""MeasureName"" as {nameof(Model.Prop.MeasureName)}
|
p.""MeasureName"" as {nameof(Model.Prop.MeasureName)},
|
||||||
|
p.""Type"" as {nameof(Model.Prop.Type)}
|
||||||
FROM ""Yuna_Devices"" d
|
FROM ""Yuna_Devices"" d
|
||||||
LEFT JOIN ""Yuna_Props_In_Devices"" pd ON d.""Id"" = pd.""DeviceId""
|
LEFT JOIN ""Yuna_Props_In_Devices"" pd ON d.""Id"" = pd.""DeviceId""
|
||||||
LEFT JOIN ""Yuna_Props"" p ON pd.""PropId"" = p.""Id""";
|
LEFT JOIN ""Yuna_Props"" p ON pd.""PropId"" = p.""Id""";
|
||||||
|
|
|
@ -15,9 +15,13 @@ namespace Yuna.Website.Server.Storage.Repositories.Prop
|
||||||
{
|
{
|
||||||
var query =
|
var query =
|
||||||
$@"INSERT INTO ""Yuna_Props""
|
$@"INSERT INTO ""Yuna_Props""
|
||||||
(""Name"", ""MeasureName"", ""JsonValueName"")
|
(""Name"", ""MeasureName"", ""JsonValueName"", ""Type"" )
|
||||||
VALUES
|
VALUES
|
||||||
(@{nameof(Model.Prop.Name)}, @{nameof(Model.Prop.MeasureName)}, @{nameof(Model.Prop.JsonValueName)})
|
(
|
||||||
|
@{nameof(Model.Prop.Name)},
|
||||||
|
@{nameof(Model.Prop.MeasureName)},
|
||||||
|
@{nameof(Model.Prop.JsonValueName)},
|
||||||
|
@{nameof(Model.Prop.Type)})
|
||||||
RETURNING *";
|
RETURNING *";
|
||||||
|
|
||||||
var result = await _context.Connection.QuerySingleAsync<Model.Prop?>(query, value);
|
var result = await _context.Connection.QuerySingleAsync<Model.Prop?>(query, value);
|
||||||
|
@ -36,7 +40,8 @@ namespace Yuna.Website.Server.Storage.Repositories.Prop
|
||||||
p.""Id"" as {nameof(Model.Prop.Id)},
|
p.""Id"" as {nameof(Model.Prop.Id)},
|
||||||
p.""Name"" as {nameof(Model.Prop.Name)},
|
p.""Name"" as {nameof(Model.Prop.Name)},
|
||||||
p.""MeasureName"" as {nameof(Model.Prop.MeasureName)},
|
p.""MeasureName"" as {nameof(Model.Prop.MeasureName)},
|
||||||
p.""JsonValueName"" as {nameof(Model.Prop.JsonValueName)}
|
p.""JsonValueName"" as {nameof(Model.Prop.JsonValueName)},
|
||||||
|
p.""Type"" as {nameof(Model.Prop.Type)}
|
||||||
FROM ""Yuna_Props"" p
|
FROM ""Yuna_Props"" p
|
||||||
WHERE p.""Id"" = {id}
|
WHERE p.""Id"" = {id}
|
||||||
LIMIT 1";
|
LIMIT 1";
|
||||||
|
@ -53,7 +58,8 @@ namespace Yuna.Website.Server.Storage.Repositories.Prop
|
||||||
p.""Id"" as {nameof(Model.Prop.Id)},
|
p.""Id"" as {nameof(Model.Prop.Id)},
|
||||||
p.""Name"" as {nameof(Model.Prop.Name)},
|
p.""Name"" as {nameof(Model.Prop.Name)},
|
||||||
p.""MeasureName"" as {nameof(Model.Prop.MeasureName)},
|
p.""MeasureName"" as {nameof(Model.Prop.MeasureName)},
|
||||||
p.""JsonValueName"" as {nameof(Model.Prop.JsonValueName)}
|
p.""JsonValueName"" as {nameof(Model.Prop.JsonValueName)},
|
||||||
|
p.""Type"" as {nameof(Model.Prop.Type)}
|
||||||
FROM ""Yuna_Props"" p
|
FROM ""Yuna_Props"" p
|
||||||
WHERE p.""Id"" IN ({idList})";
|
WHERE p.""Id"" IN ({idList})";
|
||||||
|
|
||||||
|
@ -69,7 +75,8 @@ namespace Yuna.Website.Server.Storage.Repositories.Prop
|
||||||
p.""Id"" as {nameof(Model.Prop.Id)},
|
p.""Id"" as {nameof(Model.Prop.Id)},
|
||||||
p.""Name"" as {nameof(Model.Prop.Name)},
|
p.""Name"" as {nameof(Model.Prop.Name)},
|
||||||
p.""MeasureName"" as {nameof(Model.Prop.MeasureName)},
|
p.""MeasureName"" as {nameof(Model.Prop.MeasureName)},
|
||||||
p.""JsonValueName"" as {nameof(Model.Prop.JsonValueName)}
|
p.""JsonValueName"" as {nameof(Model.Prop.JsonValueName)},
|
||||||
|
p.""Type"" as {nameof(Model.Prop.Type)}
|
||||||
FROM ""Yuna_Props"" p
|
FROM ""Yuna_Props"" p
|
||||||
WHERE LOWER(p.""Name"") = '{value.ToLower()}'
|
WHERE LOWER(p.""Name"") = '{value.ToLower()}'
|
||||||
LIMIT 1";
|
LIMIT 1";
|
||||||
|
@ -85,7 +92,8 @@ namespace Yuna.Website.Server.Storage.Repositories.Prop
|
||||||
p.""Id"" as {nameof(Model.Prop.Id)},
|
p.""Id"" as {nameof(Model.Prop.Id)},
|
||||||
p.""Name"" as {nameof(Model.Prop.Name)},
|
p.""Name"" as {nameof(Model.Prop.Name)},
|
||||||
p.""MeasureName"" as {nameof(Model.Prop.MeasureName)},
|
p.""MeasureName"" as {nameof(Model.Prop.MeasureName)},
|
||||||
p.""JsonValueName"" as {nameof(Model.Prop.JsonValueName)}
|
p.""JsonValueName"" as {nameof(Model.Prop.JsonValueName)},
|
||||||
|
p.""Type"" as {nameof(Model.Prop.Type)}
|
||||||
FROM ""Yuna_Props"" p";
|
FROM ""Yuna_Props"" p";
|
||||||
|
|
||||||
var result = await _context.Connection.QueryAsync<Model.Prop>(query);
|
var result = await _context.Connection.QueryAsync<Model.Prop>(query);
|
||||||
|
|
Loading…
Reference in New Issue