using Microsoft.Extensions.Logging; using DD.Persistence.Client.Clients.Base; using DD.Persistence.Client.Clients.Interfaces; using DD.Persistence.Client.Clients.Interfaces.Refit; using DD.Persistence.Models; using System.Text.Json; using System.Text.Json.Serialization; using System.Globalization; using DD.Persistence.Models.Common; namespace DD.Persistence.Client.Clients; public class SetpointClient : BaseClient, ISetpointClient { private readonly IRefitSetpointClient refitSetpointClient; private readonly ISetpointConfigStorage setpointConfigStorage; public SetpointClient( IRefitClientFactory refitSetpointClientFactory, ISetpointConfigStorage setpointConfigStorage, ILogger logger) : base(logger) { this.refitSetpointClient = refitSetpointClientFactory.Create(); this.setpointConfigStorage = setpointConfigStorage; } public async Task> GetCurrent(IEnumerable setpointKeys, CancellationToken token) { var result = await ExecuteGetResponse( async () => await refitSetpointClient.GetCurrent(setpointKeys, token), token); return result!.Select(x => new SetpointValueDto { Key = x.Key, Value = DeserializeValue(x.Key, x.Value) }); } public async Task> GetCurrentDictionary(IEnumerable setpointConfigs, CancellationToken token) { var result = await ExecuteGetResponse( async () => await refitSetpointClient.GetCurrent(setpointConfigs, token), token); return result!.ToDictionary(x => x.Key,x => DeserializeValue(x.Key,x.Value)); } public async Task> GetHistory(IEnumerable setpointKeys, DateTimeOffset historyMoment, CancellationToken token) { var result = await ExecuteGetResponse( async () => await refitSetpointClient.GetHistory(setpointKeys, historyMoment, token), token); foreach(var dto in result) dto.Value = DeserializeValue(dto.Key, (JsonElement)dto.Value); return result!; } public async Task>> GetLog(IEnumerable setpointKeys, CancellationToken token) { var result = await ExecuteGetResponse( async () => await refitSetpointClient.GetLog(setpointKeys, token), token); foreach(var item in result) DeserializeList(result[item.Key]); return result!; } public async Task GetDatesRangeAsync(CancellationToken token) { var result = await ExecuteGetResponse( async () => await refitSetpointClient.GetDatesRangeAsync(token), token); return result!; } public async Task> GetPart(DateTimeOffset dateBegin, int take, CancellationToken token) { var result = await ExecuteGetResponse( async () => await refitSetpointClient.GetPart(dateBegin, take, token), token); DeserializeList(result); return result!; } public async Task Add(Guid setpointKey, object newValue, CancellationToken token) { await ExecutePostResponse( async () => await refitSetpointClient.Add(setpointKey, newValue, token), token); } public void Dispose() { refitSetpointClient.Dispose(); GC.SuppressFinalize(this); } private object DeserializeValue(Guid key, JsonElement value) { if (setpointConfigStorage.TryGetType(key, out var type)) return value.Deserialize(type)!; return value; } private void DeserializeList(IEnumerable? result) { foreach (var log in result) log.Value = DeserializeValue(log.Key, (JsonElement)log.Value); } }