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.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;
public TelemetryController(
ITelemetryService telemetryService,
IDataService DataService,
IMessageService messageService,
IEventService eventService,
ITelemetryUserService telemetryUserService,
IHubContext telemetryHubContext)
{
this.DataService = DataService;
this.telemetryService = telemetryService;
this.messageService = messageService;
this.eventService = eventService;
this.telemetryUserService = telemetryUserService;
this.telemetryHubContext = telemetryHubContext;
}
///
/// Принимает общую информацию по скважине
///
/// Уникальный идентификатор отправителя
/// нформация об отправителе
///
[HttpPost]
[Route("{uid}/info")]
public IActionResult Info(string uid, [FromBody] TelemetryInfoDto info)
{
telemetryService.UpdateInfo(uid, info);
return Ok();
}
///
/// Принимает данные от разных систем по скважине
///
/// Уникальный идентификатор отправителя
/// Данные
///
[HttpPost]
[Route("{uid}/data")]
public IActionResult Data(string uid, [FromBody] IEnumerable dtos)
{
var wellId = telemetryService.GetWellIdByTelemetryUid(uid);
DataService.UpdateData(uid, dtos);
if (wellId != null && dtos.Any())
Task.Run(() => telemetryHubContext.Clients.Group($"well_{wellId}").SendAsync(nameof(ITelemetryHubClient.ReceiveDataSaub), dtos));
return Ok();
}
///
/// Принимает список новых сообщений от телеметрии
///
/// Уникальный идентификатор отправителя
/// сообщения
///
[HttpPost]
[Route("{uid}/message")]
public IActionResult Message(string uid, [FromBody] IEnumerable dtos)
{
var wellId = telemetryService.GetWellIdByTelemetryUid(uid);
messageService.Insert(uid, dtos);
if (dtos.Any())
Task.Run(() => telemetryHubContext.Clients.Group($"well_{wellId}").SendAsync(nameof(ITelemetryHubClient.ReceiveMessages), dtos));
return Ok();
}
///
/// Принимает справочник событий
///
/// Уникальный идентификатор отправителя
/// справочник событий
///
[HttpPost]
[Route("{uid}/event")]
public IActionResult Events(string uid, [FromBody] List events)
{
eventService.Upsert(uid, events);
return Ok();
}
///
/// Принимает справочник пользователей телеметрии
///
/// Уникальный идентификатор отправителя
/// справочник пользователей телеметрии
///
[HttpPost]
[Route("{uid}/user")]
public IActionResult Users(string uid, [FromBody] List users)
{
telemetryUserService.Upsert(uid, users);
return Ok();
}
}
}