using Dapper; using System.Data; namespace Yuna.Website.Server.Storage.Repositories.Device { public class DeviceRepository : IDeviceRepository { private readonly DapperContext _context; public DeviceRepository(DapperContext context) { _context = context; } public async Task AddProps(IReadOnlyList props, long deviceId) { var query = $@"INSERT INTO ""Yuna_Props_In_Devices"" (""PropId"", ""DeviceId"") VALUES {string.Join(", ", props.Select(prop => $"({prop.Id}, {deviceId})"))}"; await _context.Connection.ExecuteAsync(query); } public async Task Create(Model.Device device) { var query = $@"INSERT INTO ""Yuna_Devices"" (""Name"", ""Description"", ""DeviceUrl"") VALUES ('{device.Name}', '{device.Description}', '{device.DeviceUrl}') RETURNING *"; var result = await _context.Connection.QuerySingleAsync(query, device); return result; } public Task Delete(long id) { throw new NotImplementedException(); } public async Task GetById(long id) { var query = $@"SELECT d.""Id"" as {nameof(Model.Device.Id)}, d.""Name"" as {nameof(Model.Device.Name)}, d.""Description"" as {nameof(Model.Device.Description)}, p.""Id"" as {nameof(Model.Prop.Id)}, p.""Name"" as {nameof(Model.Prop.Name)}, p.""JsonValueName"" as {nameof(Model.Prop.JsonValueName)}, p.""MeasureName"" as {nameof(Model.Prop.MeasureName)} FROM ""Yuna_Devices"" d LEFT JOIN ""Yuna_Props_In_Devices"" pd ON d.""Id"" = pd.""DeviceId"" LEFT JOIN ""Yuna_Props"" p ON pd.""PropId"" = p.""Id"" WHERE d.""Id"" = {id} LIMIT 1"; var result = await _context.Connection.QuerySingleAsync(query); return result; } public async Task> GetList() { var query = $@"SELECT d.""Id"" as {nameof(Model.Device.Id)}, d.""Name"" as {nameof(Model.Device.Name)}, d.""Description"" as {nameof(Model.Device.Description)}, p.""Id"" as {nameof(Model.Prop.Id)}, p.""Name"" as {nameof(Model.Prop.Name)}, p.""JsonValueName"" as {nameof(Model.Prop.JsonValueName)}, p.""MeasureName"" as {nameof(Model.Prop.MeasureName)} FROM ""Yuna_Devices"" d LEFT JOIN ""Yuna_Props_In_Devices"" pd ON d.""Id"" = pd.""DeviceId"" LEFT JOIN ""Yuna_Props"" p ON pd.""PropId"" = p.""Id"""; var result = await _context.Connection.QueryAsync(query); return result.ToList(); } } }