using AsbCloudApp.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.Threading.Tasks; using AsbCloudApp.Data; using System.Linq; using AsbCloudWebApi.SignalR; using Microsoft.AspNetCore.SignalR; namespace AsbCloudWebApi.Controllers; /// /// Редактор кустов для админки /// [Route("api/admin/[controller]")] [ApiController] [Authorize] public class ReduceSamplingController: ControllerBase { private readonly IReduceSamplingService service; private readonly IHubContext telemetryHubContext; private const string sirnalRGroupName = "ReduceSampling"; private const string sirnalRMethodOnProgress = "OnProgress"; public ReduceSamplingController( IReduceSamplingService service, IHubContext telemetryHubContext ) { this.service = service; this.telemetryHubContext = telemetryHubContext; } /// /// Получить все задания. Задания удаляются минимум через 10 сек после выполнения, возможно позднее. /// /// /// [HttpGet] public virtual ActionResult> GetAll(int idTelemetry) { var result = service.GetJobs(); if (result.Any()) return Ok(result); else return NoContent(); } /// /// Получить состояние определенной задачи /// /// /// [HttpGet("{idTelemetry}")] public virtual ActionResult GetOrDefault(int idTelemetry) { var result = service.GetOrDefaultState(idTelemetry); return Ok(result); } /// /// Создать задачу прореживанию архива и добавить её в очередь на выполнение. /// Если задача есть в очереди, она же и возвращается, но подписка не происходит. /// [HttpPost] [Permission] public virtual ActionResult Enqueue(int idTelemetry) { void onProgress(JobDto job) => Task.Run(async () => await telemetryHubContext.Clients.Group(sirnalRGroupName) .SendAsync(sirnalRMethodOnProgress, job)); service.TryEnqueueRediceSamplingJob(idTelemetry, onProgress, out JobDto job); return Ok(job); } }