using AsbCloudApp.Data; using AsbCloudApp.Requests; using AsbCloudApp.Services; using Microsoft.AspNetCore.Mvc; using System.Threading; using System.Threading.Tasks; namespace AsbCloudWebApi.Controllers.SAUB { /// <summary> /// Сообщения панели бурильщика /// </summary> [Route("api/well/{idWell}/message")] [ApiController] public class MessageController : ControllerBase { private readonly IMessageService messageService; private readonly IWellService wellService; public MessageController(IMessageService messageService, IWellService wellService) { this.messageService = messageService; this.wellService = wellService; } /// <summary> /// Выдает список сообщений по скважине /// </summary> /// <param name="idWell">id скважины</param> /// <param name="request">Параметры запроса</param> /// <param name="token">Токен для отмены задачи</param> /// <returns>список сообщений по скважине</returns> [HttpGet] [Permission] [ProducesResponseType(typeof(PaginationContainer<MessageDto>), (int)System.Net.HttpStatusCode.OK)] [ProducesResponseType(typeof(ValidationProblemDetails), (int)System.Net.HttpStatusCode.BadRequest)] public async Task<IActionResult> GetMessagesAsync( [FromRoute] int idWell, [FromQuery] MessageRequestBase request, CancellationToken token) { if (!await UserHasAccesToWellAsync(idWell, token)) return Forbid(); if (request.Take > 1024) return this.ValidationBadRequest(nameof(request.Take), "limit mast be less then 1024"); var requestToService = new MessageRequest(request, idWell); var result = await messageService.GetMessagesAsync( requestToService, token) .ConfigureAwait(false); if (result is null || result.Count == 0) return NoContent(); return Ok(result); } /// <summary> /// Выдает список сообщений по скважине /// </summary> /// <param name="idWell">id скважины</param> /// <param name="token">Токен для отмены задачи</param> /// <returns>список сообщений по скважине</returns> [HttpGet("datesRange")] [Permission] [ProducesResponseType(typeof(DatesRangeDto), (int)System.Net.HttpStatusCode.OK)] public async Task<IActionResult> GetMessagesDateRangeAsync(int idWell, CancellationToken token) { int? idCompany = User.GetCompanyId(); if (idCompany is null) return Forbid(); bool isCompanyOwnsWell = await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, idWell, token).ConfigureAwait(false); if (!isCompanyOwnsWell) return Forbid(); var wellMessagesDatesRange = wellService.GetDatesRange(idWell); return Ok(wellMessagesDatesRange); } protected async Task<bool> UserHasAccesToWellAsync(int idWell, CancellationToken token) { var idCompany = User.GetCompanyId(); if (idCompany is not null && await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, idWell, token) .ConfigureAwait(false)) return true; return false; } } }