using AsbCloudApp.Data;
using AsbCloudApp.Data.SAUB;
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.SAUB
{
///
/// Инфо о передающих телеметрию устройствах
///
[Route("api/telemetry")]
[ApiController]
public class TelemetryController : ControllerBase
{
private readonly ITelemetryService telemetryService;
private readonly IMessageService messageService;
private readonly IEventService eventService;
private readonly ITelemetryUserService telemetryUserService;
private readonly IHubContext telemetryHubContext;
public TelemetryController(
ITelemetryService telemetryService,
IMessageService messageService,
IEventService eventService,
ITelemetryUserService telemetryUserService,
IHubContext telemetryHubContext)
{
this.telemetryService = telemetryService;
this.messageService = messageService;
this.eventService = eventService;
this.telemetryUserService = telemetryUserService;
this.telemetryHubContext = telemetryHubContext;
}
///
/// Принимает общую информацию по скважине
///
/// Уникальный идентификатор отправителя
/// Информация об отправителе
/// Токен отмены задачи
///
[HttpPost]
[Route("{uid}/info")]
public async Task PostInfoAsync(string uid, [FromBody] TelemetryInfoDto info,
CancellationToken token)
{
await telemetryService.UpdateInfoAsync(uid, info, token).ConfigureAwait(false);
return Ok();
}
///
/// Принимает список новых сообщений от телеметрии
///
/// Уникальный идентификатор отправителя
/// сообщения
/// Токен для отмены задачи
///
[HttpPost]
[Route("{uid}/message")]
public async Task PostMessagesAsync(string uid, [FromBody] IEnumerable dtos,
CancellationToken token)
{
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);
return Ok();
}
///
/// Принимает справочник событий
///
/// Уникальный идентификатор отправителя
/// справочник событий
/// Токен для отмены задачи
///
[HttpPost]
[Route("{uid}/event")]
public async Task PostEventsAsync(string uid, [FromBody] List events,
CancellationToken token)
{
await eventService.UpsertAsync(uid, events, token)
.ConfigureAwait(false);
return Ok();
}
///
/// Принимает справочник пользователей телеметрии
///
/// Уникальный идентификатор отправителя
/// справочник пользователей телеметрии
///
///
[HttpPost]
[Route("{uid}/user")]
public async Task PostUsersAsync(string uid, [FromBody] List users,
CancellationToken token)
{
await telemetryUserService.UpsertAsync(uid, users, token);
return Ok();
}
}
}