CS2-91: Moved TelemetryTracker from WellService to TelemetryService

This commit is contained in:
KharchenkoVladimir 2021-10-15 12:24:04 +05:00
parent 83d1527039
commit 02f344569e
11 changed files with 75 additions and 62 deletions

View File

@ -1,6 +1,7 @@
using AsbCloudApp.Data;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace AsbCloudApp.Services
{
@ -13,5 +14,8 @@ namespace AsbCloudApp.Services
int? GetIdTelemetryByIdWell(int idWell);
int Merge(IEnumerable<int> telemetryIds);
IEnumerable<(string Key, int[] Ids)> GetRedundentRemoteUids();
Task<IEnumerable<WellDto>> GetTransmittingWellsAsync(int idCompany,
CancellationToken token);
void SaveRequestDate(string uid);
}
}

View File

@ -1,10 +1,12 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
namespace AsbCloudApp.Services
{
public interface ITelemetryTracker
{
void SaveRequestDate(string uid);
DateTime GetLastTelemetryDateByUid(string uid);
IEnumerable<string> GetTransmittingTelemetryUids();
}
}

View File

@ -5,6 +5,7 @@ using System.Diagnostics;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Hosting;
using AsbCloudInfrastructure.Services.Cache;
using AsbCloudApp.Services;
using AsbCloudDb.Model;
namespace AsbCloudInfrastructure.Services.Analysis
@ -12,11 +13,13 @@ namespace AsbCloudInfrastructure.Services.Analysis
public class TelemetryAnalyticsBackgroundService : BackgroundService
{
private readonly CacheDb cacheDb;
private readonly ITelemetryTracker telemetryTracker;
private readonly TimeSpan period = TimeSpan.FromHours(1);
public TelemetryAnalyticsBackgroundService(CacheDb cacheDb)
public TelemetryAnalyticsBackgroundService(CacheDb cacheDb, ITelemetryTracker telemetryTracker)
{
this.cacheDb = cacheDb;
this.telemetryTracker = telemetryTracker;
}
protected override async Task ExecuteAsync(CancellationToken token = default)
@ -34,7 +37,7 @@ namespace AsbCloudInfrastructure.Services.Analysis
try
{
using var context = new AsbCloudDbContext(options);
var telemetryService = new TelemetryService(context, cacheDb);
var telemetryService = new TelemetryService(context, telemetryTracker, cacheDb);
var analyticsService = new TelemetryAnalyticsService(context,
telemetryService, cacheDb);

View File

@ -5,10 +5,10 @@ using AsbCloudInfrastructure.Services.Cache;
using Mapster;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System;
using Microsoft.EntityFrameworkCore;
using System.Threading.Tasks;
using System.Threading;
namespace AsbCloudInfrastructure.Services
{
@ -17,16 +17,43 @@ namespace AsbCloudInfrastructure.Services
private readonly CacheTable<Telemetry> cacheTelemetry;
private readonly CacheTable<Well> cacheWells;
private readonly IAsbCloudDbContext db;
private readonly ITelemetryTracker telemetryTracker;
public TelemetryService(IAsbCloudDbContext db, CacheDb cacheDb)
public TelemetryService(IAsbCloudDbContext db, ITelemetryTracker telemetryTracker,
CacheDb cacheDb)
{
cacheTelemetry = cacheDb.GetCachedTable<Telemetry>((AsbCloudDbContext)db);
cacheWells = cacheDb.GetCachedTable<Well>((AsbCloudDbContext)db);
this.db = db;
this.telemetryTracker = telemetryTracker;
}
public async Task<IEnumerable<WellDto>> GetTransmittingWellsAsync(int idCompany, CancellationToken token)
{
var wells = new List<Well>();
IEnumerable<string> activeTelemetriesUids = telemetryTracker.GetTransmittingTelemetryUids();
if (activeTelemetriesUids.Any())
{
wells = await db.GetWellsForCompany(idCompany)
.Where(w => activeTelemetriesUids.Contains(w.Telemetry.RemoteUid))
.AsNoTracking()
.ToListAsync(token)
.ConfigureAwait(false);
}
return wells.Select(w => new WellDto
{
Id = w.Id,
Caption = w.Caption,
Cluster = w.Cluster.Caption,
Deposit = w.Cluster.Deposit.Caption,
});
}
public void SaveRequestDate(string uid) =>
telemetryTracker.SaveRequestDate(uid);
public int GetOrCreateTemetryIdByUid(string uid)
=> GetOrCreateTelemetryByUid(uid).Id;
=> GetOrCreateTelemetryByUid(uid).Id;
public int? GetidWellByTelemetryUid(string uid)
=> GetWellByTelemetryUid(uid)?.Id;

View File

@ -10,21 +10,25 @@ namespace AsbCloudInfrastructure.Services
private IDictionary<string, DateTime> requests = new Dictionary<string, DateTime>();
private readonly TimeSpan timeout = TimeSpan.FromMinutes(6);
private void DeleteOldRequestDates()
{
requests = requests.Where(dValue => (DateTime.Now - dValue.Value) < timeout).ToDictionary(dValue => dValue.Key, dValue => dValue.Value);
}
public void SaveRequestDate(string uid)
{
requests[uid] = DateTime.Now;
DeleteOldRequestDates();
}
public DateTime GetLastTelemetryDateByUid(string uid) =>
requests[uid];
public IEnumerable<string> GetTransmittingTelemetryUids()
{
DeleteOldRequestDates();
return requests.Keys;
}
private void DeleteOldRequestDates()
{
requests = requests.Where(dValue => (DateTime.Now - dValue.Value) < timeout)
.ToDictionary(dValue => dValue.Key, dValue => dValue.Value);
}
}
}

View File

@ -15,37 +15,32 @@ namespace AsbCloudInfrastructure.Services
public class WellService : IWellService
{
private readonly IAsbCloudDbContext db;
private readonly ITelemetryTracker telemetryTracker;
private readonly ITelemetryService telemetryService;
private readonly CacheTable<RelationCompanyWell> cacheRelationCompaniesWells;
private readonly CacheTable<Well> cacheWells;
public WellService(IAsbCloudDbContext db, ITelemetryTracker telemetryTracker, CacheDb cacheDb)
public WellService(IAsbCloudDbContext db, ITelemetryService telemetryService, CacheDb cacheDb)
{
this.db = db;
this.telemetryTracker = telemetryTracker;
this.telemetryService = telemetryService;
cacheRelationCompaniesWells = cacheDb.GetCachedTable<RelationCompanyWell>((AsbCloudDbContext)db);
cacheWells = cacheDb.GetCachedTable<Well>((AsbCloudDbContext)db);
}
public async Task<IEnumerable<WellDto>> GetTransmittingWellsAsync(int idCompany, CancellationToken token)
{
var wells = new List<Well>();
IEnumerable<string> activeTelemetriesUids = telemetryTracker.GetTransmittingTelemetryUids();
if (activeTelemetriesUids.Any())
{
wells = await db.GetWellsForCompany(idCompany)
.Where(w => activeTelemetriesUids.Contains(w.Telemetry.RemoteUid))
.AsNoTracking()
.ToListAsync(token)
.ConfigureAwait(false);
}
return wells.Select(w => From(w));
}
public async Task<IEnumerable<WellDto>> GetTransmittingWellsAsync(int idCompany,
CancellationToken token) =>
await telemetryService.GetTransmittingWellsAsync(idCompany, token);
public async Task<IEnumerable<WellDto>> GetWellsByCompanyAsync(int idCompany, CancellationToken token)
{
var wells = await db.GetWellsForCompany(idCompany).ToListAsync(token);
return wells.Select(w => From(w));
return wells.Select(w => new WellDto
{
Id = w.Id,
Caption = w.Caption,
Cluster = w.Cluster.Caption,
Deposit = w.Cluster.Deposit.Caption,
});
}
public bool IsCompanyInvolvedInWell(int idCompany, int idWell)
@ -55,19 +50,6 @@ namespace AsbCloudInfrastructure.Services
=> await cacheRelationCompaniesWells.ContainsAsync(r => r.IdWell == idWell &&
r.IdCompany == idCompany, token).ConfigureAwait(false);
private static WellDto From(Well well)
{
var wellDto = new WellDto
{
Id = well.Id,
Caption = well.Caption,
Cluster = well.Cluster.Caption,
Deposit = well.Cluster.Deposit.Caption,
};
return wellDto;
}
public async Task<WellDto> GetAsync(int idWell, CancellationToken token)
{
var entity = await db.Wells

View File

@ -23,22 +23,19 @@ namespace AsbCloudWebApi.Controllers
private readonly IEventService eventService;
private readonly ITelemetryUserService telemetryUserService;
private readonly IHubContext<TelemetryHub> telemetryHubContext;
private readonly ITelemetryTracker telemetryTracker;
public TelemetryController(
ITelemetryService telemetryService,
IMessageService messageService,
IEventService eventService,
ITelemetryUserService telemetryUserService,
IHubContext<TelemetryHub> telemetryHubContext,
ITelemetryTracker telemetryTracker)
IHubContext<TelemetryHub> telemetryHubContext)
{
this.telemetryService = telemetryService;
this.messageService = messageService;
this.eventService = eventService;
this.telemetryUserService = telemetryUserService;
this.telemetryHubContext = telemetryHubContext;
this.telemetryTracker = telemetryTracker;
}
/// <summary>
@ -52,7 +49,7 @@ namespace AsbCloudWebApi.Controllers
public IActionResult PostInfo(string uid, [FromBody] TelemetryInfoDto info)
{
telemetryService.UpdateInfo(uid, info);
telemetryTracker.SaveRequestDate(uid);
telemetryService.SaveRequestDate(uid);
return Ok();
}
@ -75,7 +72,7 @@ namespace AsbCloudWebApi.Controllers
await Task.Run(() => telemetryHubContext.Clients.Group($"well_{idWell}")
.SendAsync("ReceiveMessages", dtos), token).ConfigureAwait(false);
telemetryTracker.SaveRequestDate(uid);
telemetryService.SaveRequestDate(uid);
return Ok();
}
@ -93,7 +90,7 @@ namespace AsbCloudWebApi.Controllers
{
await eventService.UpsertAsync(uid, events, token)
.ConfigureAwait(false);
telemetryTracker.SaveRequestDate(uid);
telemetryService.SaveRequestDate(uid);
return Ok();
}
@ -108,7 +105,7 @@ namespace AsbCloudWebApi.Controllers
public IActionResult PostUsers(string uid, [FromBody] List<TelemetryUserDto> users)
{
telemetryUserService.Upsert(uid, users);
telemetryTracker.SaveRequestDate(uid);
telemetryService.SaveRequestDate(uid);
return Ok();
}

View File

@ -18,7 +18,6 @@ namespace AsbCloudWebApi.Controllers
public abstract class TelemetryDataBaseController<TDto> : ControllerBase
where TDto: ITelemetryData
{
private readonly ITelemetryTracker telemetryTracker;
private readonly ITelemetryService telemetryService;
private readonly ITelemetryDataService<TDto> telemetryDataService;
private readonly IWellService wellService;
@ -27,13 +26,11 @@ namespace AsbCloudWebApi.Controllers
public string SirnalRMethodGetDataName { get; protected set; } = "ReceiveData";
public TelemetryDataBaseController(
ITelemetryTracker telemetryTracker,
ITelemetryService telemetryService,
ITelemetryDataService<TDto> telemetryDataService,
IWellService wellService,
IHubContext<TelemetryHub> telemetryHubContext)
{
this.telemetryTracker = telemetryTracker;
this.telemetryService = telemetryService;
this.telemetryDataService = telemetryDataService;
this.wellService = wellService;
@ -60,7 +57,7 @@ namespace AsbCloudWebApi.Controllers
await Task.Run(() => telemetryHubContext.Clients.Group($"well_{idWell}")
.SendAsync(SirnalRMethodGetDataName, dtos), token).ConfigureAwait(false);
telemetryTracker.SaveRequestDate(uid);
telemetryService.SaveRequestDate(uid);
return Ok();
}

View File

@ -11,13 +11,11 @@ namespace AsbCloudWebApi.Controllers
public class TelemetryDataSaubController : TelemetryDataBaseController<TelemetryDataSaubDto>
{
public TelemetryDataSaubController(
ITelemetryTracker telemetryTracker,
ITelemetryService telemetryService,
ITelemetryDataService<TelemetryDataSaubDto> telemetryDataService,
IWellService wellService,
IHubContext<TelemetryHub> telemetryHubContext)
: base(
telemetryTracker,
telemetryService,
telemetryDataService,
wellService,

View File

@ -11,13 +11,11 @@ namespace AsbCloudWebApi.Controllers
public class TelemetryDataSpinController : TelemetryDataBaseController<TelemetryDataSpinDto>
{
public TelemetryDataSpinController(
ITelemetryTracker telemetryTracker,
ITelemetryService telemetryService,
ITelemetryDataService<TelemetryDataSpinDto> telemetryDataService,
IWellService wellService,
IHubContext<TelemetryHub> telemetryHubContext)
: base(
telemetryTracker,
telemetryService,
telemetryDataService,
wellService,

View File

@ -21,7 +21,8 @@ namespace ConsoleApp1
.Options;
using var db = new AsbCloudDbContext(options);
var cacheDb = new CacheDb();
var wellService = new WellService(db, new TelemetryTracker(), cacheDb);
var telemetryService = new TelemetryService(db, new TelemetryTracker(), cacheDb);
var wellService = new WellService(db, telemetryService, cacheDb);
var wellOptsStat = new WellOperationsStatService(db, cacheDb, wellService);
var tvd = wellOptsStat.GetTvdAsync(1, default).Result;
Print(tvd);