using AsbCloudApp.Services; using System; using System.Collections.Generic; using System.Linq; using AsbCloudDb.Model; using AsbCloudInfrastructure.Services.Cache; using Microsoft.EntityFrameworkCore; namespace AsbCloudInfrastructure.Services { public class TelemetryTracker : ITelemetryTracker { class TrackerStat { //public int Id { get; set; } public string RemoteUid { get; set; } /// /// Время последнего запроса (по времени сервера) /// public DateTime LastTimeServer { get; set; } /// /// Время указанное в данных последнего запроса (из удаленного источника) /// public DateTime LastTimeRemote { get; set; } } private readonly Dictionary requests; public TelemetryTracker(CacheDb cacheDb) { var options = new DbContextOptionsBuilder() .UseNpgsql("Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True") .Options; using var db = new AsbCloudDbContext(options); var cacheTelemetry = cacheDb.GetCachedTable(db); var lastTelemetriesDates = (from d in db.TelemetryDataSaub group d by d.IdTelemetry into g select new { IdTelemetry = g.Key, Date = g.Max(t => t.Date) }) .AsNoTracking() .ToList(); requests = lastTelemetriesDates.Select(t => new { //Id = t.IdTelemetry, RemoteUid = cacheTelemetry.FirstOrDefault(c => c.Id == t.IdTelemetry).RemoteUid, LastTimeRemote = t.Date, }).ToDictionary(t => t.RemoteUid, t => new TrackerStat { //Id = t.Id, RemoteUid = t.RemoteUid, LastTimeRemote = t.LastTimeRemote, LastTimeServer = t.LastTimeRemote, }); } public void SaveRequestDate(string uid, DateTime remoteDate) { var stat = requests.GetValueOrDefault(uid); if(stat is null) { stat = new TrackerStat{ RemoteUid = uid }; requests[uid] = stat; } stat.LastTimeServer = DateTime.Now; stat.LastTimeRemote = remoteDate; } public DateTime GetLastTelemetryDateByUid(string uid) => requests.GetValueOrDefault(uid)?.LastTimeRemote ?? default; public IEnumerable GetTransmittingTelemetriesUids() => requests.Keys; } }