using AsbCloudApp.Data;
using AsbCloudApp.Services;
using AsbCloudWebApi.SignalR;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
using System;
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();
}
//TODO: remove when panels update will be done.
///
/// Принимает данные от разных систем по скважине
///
/// Уникальный идентификатор отправителя
/// Данные
/// Токен для отмены задачи
///
[HttpPost]
[Obsolete]
[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("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("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();
//}
}
}