using AsbCloudApp.Data.SAUB; using AsbCloudApp.Repositories; 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.SAUB; /// /// Инфо о передающих телеметрию устройствах /// [Route("api/telemetry")] [ApiController] public class TelemetryController : ControllerBase { private readonly ITelemetryService telemetryService; private readonly IMessageRepository messageRepository; private readonly IEventRepository eventRepository; private readonly ITelemetryUserService telemetryUserService; private readonly IHubContext telemetryHubContext; public TelemetryController( ITelemetryService telemetryService, IMessageRepository messageRepository, IEventRepository eventRepository, ITelemetryUserService telemetryUserService, IHubContext telemetryHubContext) { this.telemetryService = telemetryService; this.messageRepository = messageRepository; this.eventRepository = eventRepository; this.telemetryUserService = telemetryUserService; this.telemetryHubContext = telemetryHubContext; } /// /// Информация о версиях ПО по телеметриям, данные от которых приходили не позднее From /// /// [HttpGet("Active")] [ProducesResponseType(typeof(PhysicalFileResult), (int)System.Net.HttpStatusCode.OK)] public async Task GetTelemetriesInfoByLastData(CancellationToken token) { var from = DateTimeOffset.UtcNow.AddDays(-1); var stream = await telemetryService.GetTelemetriesInfoByLastData(from, token); return File(stream, "text/csv", $"Software versions by active telemetries from {from:yy-MM-dd hh-mm}.csv"); } /// /// Принимает общую информацию по скважине /// /// Уникальный идентификатор отправителя /// Информация об отправителе /// Токен отмены задачи /// [HttpPost("{uid}/info")] public async Task PostInfoAsync(string uid, [FromBody] TelemetryInfoDto info, CancellationToken token) { await telemetryService.UpdateInfoAsync(uid, info, token).ConfigureAwait(false); return Ok(); } /// /// Принимает список новых сообщений от телеметрии /// /// Уникальный идентификатор отправителя /// сообщения /// Токен для отмены задачи /// [HttpPost("{uid}/message")] public async Task PostMessagesAsync(string uid, [FromBody] IEnumerable dtos, CancellationToken token) { var idWell = telemetryService.GetIdWellByTelemetryUid(uid); await messageRepository.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("{uid}/event")] public async Task PostEventsAsync(string uid, [FromBody] List events, CancellationToken token) { await eventRepository.UpsertAsync(uid, events, token) .ConfigureAwait(false); return Ok(); } /// /// Принимает справочник пользователей телеметрии /// /// Уникальный идентификатор отправителя /// справочник пользователей телеметрии /// /// [HttpPost("{uid}/user")] public async Task PostUsersAsync(string uid, [FromBody] List users, CancellationToken token) { await telemetryUserService.UpsertAsync(uid, users, token); return Ok(); } }