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(); } } }