using AsbCloudApp.Data; using AsbCloudApp.Exceptions; using AsbCloudApp.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Threading; using System.Threading.Tasks; namespace AsbCloudWebApi.Controllers; /// /// Формирование программы бурения /// [Route("api/well/{idWell}/drillingProgram")] [ApiController] [Authorize] public class DrillingProgramController : ControllerBase { private readonly IDrillingProgramService drillingProgramService; private readonly IWellService wellService; public DrillingProgramController(IDrillingProgramService drillingProgramService, IWellService wellService) { this.drillingProgramService = drillingProgramService; this.wellService = wellService; } /// /// Список категорий файлов из которых состоит программа бурения /// /// /// [HttpGet("categories")] [ProducesResponseType(typeof(FileCategoryDto[]), (int)System.Net.HttpStatusCode.OK)] public async Task GetCategories(CancellationToken token) { var result = await drillingProgramService.GetCategoriesAsync(token); return Ok(result); } /// /// Список пользователей /// /// id скважины /// /// [HttpGet("availableUsers")] [ProducesResponseType(typeof(FileCategoryDto[]), (int)System.Net.HttpStatusCode.OK)] public async Task GetAvailableUsers(int idWell, CancellationToken token) { var result = await drillingProgramService.GetAvailableUsers(idWell, token); return Ok(result); } /// /// Состояние процесса согласования программы бурения /// /// id скважины /// Токен отмены задачи /// Возвращает файл программы бурения [HttpGet] [ProducesResponseType(typeof(DrillingProgramStateDto), (int)System.Net.HttpStatusCode.OK)] public async Task GetStateAsync(int idWell, CancellationToken token) { var idCompany = User.GetCompanyId(); var idUser = User.GetUserId(); if (idCompany is null || idUser is null || !await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, idWell, token).ConfigureAwait(false)) return Forbid(); var result = await drillingProgramService.GetStateAsync(idWell, (int)idUser, token); return Ok(result); } /// /// Сброс ошибки формирования ПБ /// /// /// [HttpDelete("errors")] [Permission("DrillingProgram.get")] public IActionResult ClearError(int idWell) { drillingProgramService.ClearError(idWell); return Ok(); } /// /// Загрузка файла для части программы бурения /// /// /// ID части программы. Не путать с категорией файла /// /// /// [HttpPost("part/{idFileCategory}")] [Permission("DrillingProgram.get")] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] public async Task AddFile( int idWell, int idFileCategory, [FromForm] IFormFileCollection files, CancellationToken token) { 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(); if (files.Count > 1) return this.ValidationBadRequest(nameof(files), "only 1 file can be uploaded"); if (files.Count == 0) return this.ValidationBadRequest(nameof(files), "at list 1 file should be uploaded"); var fileName = files[0].FileName; var fileStream = files[0].OpenReadStream(); var result = await drillingProgramService.AddFile(idWell, idFileCategory, (int)idUser, fileName, fileStream, token); return Ok(result); } /// /// Добавляет разделы программы бурения /// /// /// Список категорий файлов, по которым будут добавлены части ПБ /// /// [HttpPost("part")] [Permission] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] public async Task AddPartsAsync(int idWell, [Required] IEnumerable idFileCategories, CancellationToken token) { 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(); var result = await drillingProgramService.AddPartsAsync(idWell, idFileCategories, token); return Ok(result); } /// /// Удаляет разделы программы бурения /// /// /// Список категорий файлов, по которым будут удалены части ПБ /// /// [HttpDelete("part")] [Permission] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] public async Task RemovePartsAsync(int idWell, [Required] IEnumerable idFileCategories, CancellationToken token) { 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(); var result = await drillingProgramService.RemovePartsAsync(idWell, idFileCategories, token); return Ok(result); } /// /// Добавить пользователя в список publishers или approvers части программы бурения /// /// /// /// /// /// /// [HttpPost("part/{idFileCategory}/user")] [Permission] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] public async Task AddUserAsync(int idWell, [Required] int idUser, int idFileCategory, [Required] int idUserRole, CancellationToken token) { int? idCompany = User.GetCompanyId(); int? idUserEditor = User.GetUserId(); if (idCompany is null || idUserEditor is null) return Forbid(); if (!await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, idWell, token).ConfigureAwait(false)) return Forbid(); var result = await drillingProgramService.AddUserAsync(idWell, idFileCategory, idUser, idUserRole, token); return Ok(result); } /// /// Удалить пользователя из списка publishers или approvers части программы бурения /// /// /// /// /// /// /// [HttpDelete("part/{idFileCategory}/user/{idUser}")] [Permission] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] public async Task RemoveUserAsync(int idWell, int idUser, int idFileCategory, [Required] int idUserRole, CancellationToken token) { int? idCompany = User.GetCompanyId(); int? idUserEditor = User.GetUserId(); if (idCompany is null || idUserEditor is null) return Forbid(); if (!await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, idWell, token).ConfigureAwait(false)) return Forbid(); var result = await drillingProgramService.RemoveUserAsync(idWell, idFileCategory, idUser, idUserRole, token); return Ok(result); } /// /// Создает метку для файла входящего в программу бурения, заменить существующую /// /// id скважины /// метка файла /// Токен отмены задачи /// [HttpPost("fileMark")] [Permission("DrillingProgram.get")] public async Task AddOrReplaceFileMarkAsync(int idWell, FileMarkDto markDto, CancellationToken token) { var idCompany = User.GetCompanyId(); var idUser = User.GetUserId(); if (idCompany is null || idUser is null || !await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, idWell, token).ConfigureAwait(false)) return Forbid(); var result = await drillingProgramService.AddOrReplaceFileMarkAsync(markDto, (int)idUser, token) .ConfigureAwait(false); return Ok(result); } /// /// Помечает метку у файла входящего, в программу бурения, как удаленную /// /// id скважины /// id метки /// Токен отмены задачи /// [HttpDelete("fileMark/{idMark}")] [Permission("DrillingProgram.get")] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] public async Task MarkAsDeletedFileMarkAsync(int idWell, int idMark, CancellationToken token) { var idCompany = User.GetCompanyId(); if (idCompany is null || !await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, idWell, token).ConfigureAwait(false)) return Forbid(); var result = await drillingProgramService.MarkAsDeletedFileMarkAsync(idMark, token) .ConfigureAwait(false); return Ok(result); } }