using AsbCloudApp.Data; using AsbCloudApp.Services; using AsbCloudWebApi.SignalR; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.SignalR; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Requests; using AsbCloudWebApi.SignalR.Clients; namespace AsbCloudWebApi.Controllers { /// <summary> /// Отчет (временная диаграмма с сообщениями) /// </summary> [Route("api/well/{idWell}/report")] [ApiController] public class ReportController : ControllerBase { private readonly IReportService reportService; private readonly IWellService wellService; private readonly IHubContext<ReportsHub, IReportHubClient> reportsHubContext; public ReportController( IReportService reportService, IWellService wellService, IHubContext<ReportsHub, IReportHubClient> reportsHubContext) { this.reportService = reportService; this.wellService = wellService; this.reportsHubContext = reportsHubContext; } /// <summary> /// Создает отчет по скважине с указанными параметрами /// </summary> /// <param name="idWell">Id скважины</param> /// <param name="request">Параметры запроса</param> /// <param name="token">Токен для отмены задачи</param> /// <returns>id фоновой задачи формирования отчета</returns> [HttpPost] [Permission] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] public async Task<IActionResult> CreateReportAsync([Required] int idWell, [FromQuery] ReportParametersRequest request, CancellationToken token) { var idCompany = User.GetCompanyId(); var idUser = User.GetUserId(); if ((idCompany is null) || (idUser is null)) return Forbid(); if (!await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, idWell, token).ConfigureAwait(false)) return Forbid(); void HandleReportProgressAsync(object progress, string id) => Task.Run(async() => { await reportsHubContext.Clients.Group($"Report_{id}") .GetReportProgress(progress, token); }, token); var id = reportService.EnqueueCreateReportWork(idWell, (int)idUser, request, HandleReportProgressAsync); return Ok(id); } /// <summary> /// Возвращает имена всех отчетов по скважине /// </summary> /// <param name="idWell">id скважины</param> /// <param name="token">Токен для отмены задачи</param> /// <returns>Список имен существующих отчетов (отчетов)</returns> [HttpGet] [Permission] [ProducesResponseType(typeof(IEnumerable<string>), (int)System.Net.HttpStatusCode.OK)] public async Task<IActionResult> GetAllReportsNamesByWellAsync(int idWell, CancellationToken token) { int? idCompany = User.GetCompanyId(); if (idCompany is null) return Forbid(); if (!await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, idWell, token).ConfigureAwait(false)) return Forbid(); var reports = await reportService.GetAllReportsByWellAsync(idWell, token).ConfigureAwait(false); return Ok(reports); } /// <summary> /// Возвращает прогнозируемое количество страниц будущего отчета /// </summary> /// <param name="idWell">Id скважины</param> /// <param name="request">Параметры запроса</param> /// <param name="token">Токен для отмены задачи</param> /// <returns>прогнозируемое кол-во страниц отчета</returns> [HttpGet("reportSize")] [Permission] [ProducesResponseType(typeof(string), (int)System.Net.HttpStatusCode.OK)] public async Task<IActionResult> GetReportSizeAsync([Required] int idWell, [FromQuery] ReportParametersRequest request, CancellationToken token) { int? idCompany = User.GetCompanyId(); if (idCompany is null) return Forbid(); if (!await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, idWell, token).ConfigureAwait(false)) return Forbid(); int reportSize = reportService.GetReportPagesCount(idWell, request.Begin, request.End, request.StepSeconds, request.Format); return Ok(reportSize); } /// <summary> /// Возвращает даты самого старого и самого свежего отчетов в БД /// </summary> /// <param name="idWell">id скважины</param> /// <param name="token">Токен для отмены задачи</param> /// <returns>Даты самого старого и самого свежего отчетов в БД</returns> [HttpGet("datesRange")] [Permission] [ProducesResponseType(typeof(DatesRangeDto), (int)System.Net.HttpStatusCode.OK)] [ProducesResponseType((int)System.Net.HttpStatusCode.NoContent)] public async Task<IActionResult> GetReportsDateRangeAsync(int idWell, CancellationToken token) { int? idCompany = User.GetCompanyId(); if (idCompany is null) return Forbid(); if (!await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, idWell, token).ConfigureAwait(false)) return Forbid(); var wellReportsDatesRange = reportService.GetDatesRangeOrDefault(idWell); if (wellReportsDatesRange is null) return NoContent(); if (wellReportsDatesRange.From == wellReportsDatesRange.To) return NoContent(); return Ok(wellReportsDatesRange); } } }