using AsbCloudApp.Services;
using AsbCloudApp.Data;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Threading;
namespace AsbCloudWebApi.Controllers
{
[ApiController]
[Authorize]
public class SetpointsController : ControllerBase
{
private readonly ISetpointsService setpointsService;
private readonly IWellService wellService;
private const int ObsolescenceSecMin = 30;
private const int ObsolescenceSecMax = 6 * 60 * 60;
public SetpointsController(ISetpointsService setpointsService, IWellService wellService)
{
this.setpointsService = setpointsService;
this.wellService = wellService;
}
///
/// Получает список запросов на изменение уставок.
///
///
///
[HttpGet("api/well/{idWell}/setpointsNames")]
[ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)]
[AllowAnonymous]
public IActionResult GetSetpointsNamesByIdWellAsync([FromRoute] int idWell)
{
var result = setpointsService.GetSetpointsNames(idWell);
return Ok(result);
}
///
/// Добавляет запрос на изменение заданий панели оператора.
///
///
///
///
///
[HttpPost("api/well/{idWell}/setpoints")]
[ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)]
public async Task InsertAsync(int idWell, SetpointsRequestDto setpoints, CancellationToken token = default)
{
int? idCompany = User.GetCompanyId();
int? idUser = User.GetUserId();
if (idCompany is null || idUser is null)
return Forbid();
if (!await wellService.IsCompanyInvolvedInWellAsync((int)idCompany,
idWell, token).ConfigureAwait(false))
return Forbid();
setpoints.IdAuthor = idUser ?? -1;
setpoints.IdWell = idWell;
setpoints.IdState = 1;
if (setpoints is null
|| setpoints.ObsolescenceSec > ObsolescenceSecMax
|| setpoints.ObsolescenceSec < ObsolescenceSecMin)
return BadRequest("Wrong ObsolescenceSec");
if (!setpoints.Setpoints.Any())
return BadRequest("Wrong Setpoints count");
var result = await setpointsService.InsertAsync(setpoints, token)
.ConfigureAwait(false);
return Ok(result);
}
///
/// Получает список запросов на изменение уставок.
///
///
///
///
[HttpGet("api/well/{idWell}/setpoints")]
[ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)]
public async Task GetByIdWellAsync([FromRoute] int idWell, CancellationToken token = default)
{
int? idCompany = User.GetCompanyId();
int? idUser = User.GetUserId();
if (idCompany is null || idUser is null)
return Forbid();
var result = await setpointsService.GetAsync(idWell, token)
.ConfigureAwait(false);
return Ok(result);
}
///
/// Отчет о принятии, или отклонении уставок оператором.
/// После уставка будет не изменяемой.
///
///
///
/// можно передать только новый state eg.: {state:3} - принято
///
///
[HttpPut("api/telemetry/{uid}/setpoints/{id}")]
[ProducesResponseType(typeof(SetpointsRequestDto), (int)System.Net.HttpStatusCode.OK)]
[AllowAnonymous]
public async Task UpdateByTelemetryUidAsync([FromRoute] string uid, int id, SetpointsRequestDto setpointsRequestDto, CancellationToken token = default)
{
var result = await setpointsService.UpdateStateAsync(uid, id, setpointsRequestDto, token)
.ConfigureAwait(false);
return Ok(result);
}
///
/// Получает запросы на изменение уставок панели.
/// !!SIDE EFFECT: изменяет состояние запросов уставок на отправлено, это не позволит удалить эти уставки после отправки на панель.
///
///
///
///
[HttpGet("api/telemetry/{uid}/setpoints")]
[ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)]
[AllowAnonymous]
public async Task GetByTelemetryUidAsync([FromRoute] string uid, CancellationToken token = default)
{
var result = await setpointsService.GetForPanelAsync(uid, token)
.ConfigureAwait(false);
return Ok(result);
}
///
/// Пробует удалить запрос на изменение уставок. Это будет выполнено, если запрос еще не был отправлен на панель.
///
///
///
///
/// 1 - удалено, 0 и меньше - не удалено
[HttpDelete("api/well/{idWell}/setpoints/{id}")]
public async Task TryDeleteByIdWellAsync(int idWell, int id, CancellationToken token = default)
{
int? idCompany = User.GetCompanyId();
int? idUser = User.GetUserId();
if (idCompany is null || idUser is null)
return Forbid();
var result = await setpointsService.TryDelete(idWell, id, token)
.ConfigureAwait(false);
return Ok(result);
}
}
}