using AsbCloudApp.Data; using AsbCloudApp.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; namespace AsbCloudWebApi.Controllers { [Route("api/analytics")] [ApiController] [Authorize] public class AnalyticsController : ControllerBase { private readonly IAnalyticsService analyticsService; private readonly IWellService wellService; public AnalyticsController(IAnalyticsService analyticsService, IWellService wellService) { this.analyticsService = analyticsService; this.wellService = wellService; } /// /// Возвращает список операций на скважине за все время /// /// id скважины /// список категорий /// дата начала /// окончание /// для пагинации кол-во записей пропустить /// для пагинации кол-во записей /// Список операций на скважине за все время [HttpGet] [Route("{idWell}/operationsByWell")] [ProducesResponseType(typeof(PaginationContainer), (int)System.Net.HttpStatusCode.OK)] public IActionResult GetOperationsByWell(int idWell, int skip = 0, int take = 32, [FromQuery] IEnumerable categoryIds = default, DateTime begin = default, DateTime end = default) { int? idCompany = User.GetCompanyId(); if (idCompany is null || !wellService.IsCompanyInvolvedInWell((int)idCompany, idWell)) return Forbid(); var analytics = analyticsService.GetOperationsByWell(idWell, categoryIds, begin, end, skip, take); if (analytics is null || analytics.Count == 0) return NoContent(); return Ok(analytics); } /// /// Возвращает данные по скважине "глубина-день" /// /// id скважины /// Коллекцию данных по скважине "глубина-день" [HttpGet] [Route("{idWell}/wellDepthToDay")] [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] public IActionResult GetWellDepthToDay(int idWell) { int? idCompany = User.GetCompanyId(); if (idCompany is null || !wellService.IsCompanyInvolvedInWell((int)idCompany, idWell)) return Forbid(); var wellDepthToDayData = analyticsService.GetWellDepthToDay(idWell); if (wellDepthToDayData is null || !wellDepthToDayData.Any()) return NoContent(); return Ok(wellDepthToDayData); } /// /// Возвращает данные по глубине скважины за период /// /// id скважины /// количество секунд в необходимом интервале времени /// количество секунд в времени начала смены /// Коллекцию данных по глубине скважины за период [HttpGet] [Route("{idWell}/wellDepthToInterval")] [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] public IActionResult GetWellDepthToInterval(int idWell, int intervalSeconds, int workBeginSeconds) { int? idCompany = User.GetCompanyId(); if (idCompany is null || !wellService.IsCompanyInvolvedInWell((int)idCompany, idWell)) return Forbid(); var wellDepthToIntervalData = analyticsService.GetWellDepthToInterval(idWell, intervalSeconds, workBeginSeconds); if (wellDepthToIntervalData is null || !wellDepthToIntervalData.Any()) return NoContent(); return Ok(wellDepthToIntervalData); } /// /// Возвращает данные по операциям на скважине "операции-время" /// /// id скважины /// дата начала интервала /// дата окончания интервала /// Коллекцию операций на скважине [HttpGet] [Route("{idWell}/operationsSummary")] [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] public IActionResult GetOperationsSummary(int idWell, DateTime begin = default, DateTime end = default) { int? idCompany = User.GetCompanyId(); if (idCompany is null || !wellService.IsCompanyInvolvedInWell((int)idCompany, idWell)) return Forbid(); var analytics = analyticsService.GetOperationsSummary(idWell, begin, end); if (analytics is null || !analytics.Any()) return NoContent(); return Ok(analytics); } /// /// Возвращает детальные данные по операциям на скважине за период /// /// id скважины /// количество секунд в необходимом интервале времени /// количество секунд в времени начала смены /// Коллекцию операций на скважине [HttpGet] [Route("{idWell}/operationsToInterval")] [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] public IActionResult GetOperationsToInterval(int idWell, int intervalSeconds, int workBeginSeconds) { int? idCompany = User.GetCompanyId(); if (idCompany is null || !wellService.IsCompanyInvolvedInWell((int)idCompany, idWell)) return Forbid(); var analytics = analyticsService.GetOperationsToInterval(idWell, intervalSeconds, workBeginSeconds); if (analytics is null || !analytics.Any()) return NoContent(); return Ok(analytics); } } }