using AsbCloudApp.Data; using AsbCloudApp.Services; using AsbCloudWebApi.SignalR; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.SignalR; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace AsbCloudWebApi.Controllers { /// /// Контроллер сбора данных от буровых /// [Route("api/telemetry")] [ApiController] public class TelemetryController : ControllerBase { private readonly IDataService DataService; private readonly ITelemetryService telemetryService; private readonly IMessageService messageService; private readonly IEventService eventService; private readonly ITelemetryUserService telemetryUserService; private readonly IHubContext telemetryHubContext; private readonly ITelemetryTracker telemetryTracker; public TelemetryController( ITelemetryService telemetryService, IDataService DataService, IMessageService messageService, IEventService eventService, ITelemetryUserService telemetryUserService, IHubContext telemetryHubContext, ITelemetryTracker telemetryTracker) { this.DataService = DataService; this.telemetryService = telemetryService; this.messageService = messageService; this.eventService = eventService; this.telemetryUserService = telemetryUserService; this.telemetryHubContext = telemetryHubContext; this.telemetryTracker = telemetryTracker; } /// /// Принимает общую информацию по скважине /// /// Уникальный идентификатор отправителя /// нформация об отправителе /// [HttpPost] [Route("{uid}/info")] public IActionResult PostInfo(string uid, [FromBody] TelemetryInfoDto info) { telemetryService.UpdateInfo(uid, info); telemetryTracker.SaveRequestDate(uid); return Ok(); } /// /// Принимает данные от разных систем по скважине /// /// Уникальный идентификатор отправителя /// Данные /// Токен для отмены задачи /// [HttpPost] [Route("{uid}/data")] public async Task PostDataAsync(string uid, [FromBody] IEnumerable dtos, CancellationToken token = default) { var idWell = telemetryService.GetidWellByTelemetryUid(uid); await DataService.UpdateDataAsync(uid, dtos, token).ConfigureAwait(false); if (idWell != null && dtos.Any()) await Task.Run(() => telemetryHubContext.Clients.Group($"well_{idWell}") .SendAsync(nameof(ITelemetryHubClient.ReceiveDataSaub), dtos), token).ConfigureAwait(false); telemetryTracker.SaveRequestDate(uid); return Ok(); } /// /// Принимает список новых сообщений от телеметрии /// /// Уникальный идентификатор отправителя /// сообщения /// Токен для отмены задачи /// [HttpPost] [Route("{uid}/message")] public async Task PostMessagesAsync(string uid, [FromBody] IEnumerable dtos, CancellationToken token = default) { var idWell = telemetryService.GetidWellByTelemetryUid(uid); await messageService.InsertAsync(uid, dtos, token).ConfigureAwait(false); if (dtos.Any()) await Task.Run(() => telemetryHubContext.Clients.Group($"well_{idWell}") .SendAsync(nameof(ITelemetryHubClient.ReceiveMessages), dtos), token).ConfigureAwait(false); telemetryTracker.SaveRequestDate(uid); return Ok(); } /// /// Принимает справочник событий /// /// Уникальный идентификатор отправителя /// справочник событий /// Токен для отмены задачи /// [HttpPost] [Route("{uid}/event")] public async Task PostEventsAsync(string uid, [FromBody] List events, CancellationToken token = default) { await eventService.UpsertAsync(uid, events, token) .ConfigureAwait(false); telemetryTracker.SaveRequestDate(uid); return Ok(); } /// /// Принимает справочник пользователей телеметрии /// /// Уникальный идентификатор отправителя /// справочник пользователей телеметрии /// [HttpPost] [Route("{uid}/user")] public IActionResult PostUsers(string uid, [FromBody] List users) { telemetryUserService.Upsert(uid, users); telemetryTracker.SaveRequestDate(uid); return Ok(); } ///// ///// Загрузка архива (sqlite3). ///// ///// var fileName = @"C:\temp\default.sqlite3"; ///// var fileStream = System.IO.File.OpenRead(fileName); ///// var file = new FileParameter(fileStream, System.IO.Path.GetFileName(fileName)); ///// cli.ApiTelemetryDbAsync("1", new List<FileParameter> { file }).Wait(); ///// ///// ///// ///// ///// //[HttpPost] //[Route("{uid}/db")] //public IActionResult PostDb(string uid, IFormFileCollection files) //{ // foreach (var file in files) // { // var fileName = string.IsNullOrEmpty(file.FileName) // ? System.IO.Path.GetTempFileName() // : file.FileName; // using (var stream = System.IO.File.Create(fileName)) // file.CopyTo(stream); // } // return Ok(); //} } }