using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Data.ProcessMap; using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; using AsbCloudApp.Services; using Microsoft.AspNetCore.Mvc; using System; namespace AsbCloudWebApi.Controllers; /// /// Проработка скважины /// public class ProcessMapWellboreDevelopmentController : CrudWellRelatedController { private readonly IUserRepository userRepository; private readonly IProcessMapWellboreDevelopmentService processMapWellboreDevelopmentService; public ProcessMapWellboreDevelopmentController(IWellService wellService, IProcessMapWellboreDevelopmentRepository processMapWellboreDevelopmentRepository, IUserRepository userRepository, IProcessMapWellboreDevelopmentService processMapWellboreDevelopmentService) : base(wellService, processMapWellboreDevelopmentRepository) { this.userRepository = userRepository; this.processMapWellboreDevelopmentService = processMapWellboreDevelopmentService; } /// /// Добавить запись проработки /// /// /// /// /// public override async Task> InsertAsync(ProcessMapWellboreDevelopmentDto value, CancellationToken token) { await AssertUserHasAccessToProcessMapWellboreDevelopmentAsync(value.IdWell, token); return await processMapWellboreDevelopmentService.InsertAsync(value, token); } /// /// Обновить запись проработки /// /// /// /// public override async Task> UpdateAsync(ProcessMapWellboreDevelopmentDto value, CancellationToken token) { await AssertUserHasAccessToProcessMapWellboreDevelopmentAsync(value.IdWell, token); return await processMapWellboreDevelopmentService.UpdateAsync(value, token); } /// /// Возвращает проработки по uid телеметрии /// /// Уникальный ключ телеметрии /// Необязательный параметр. Начальная дата /// /// [HttpGet("telemetry/{uid}")] [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] public async Task GetByUidAsync(string uid, DateTime updateFrom, CancellationToken cancellationToken) { var dto = await processMapWellboreDevelopmentService.GetByTelemetryAsync(uid, updateFrom, cancellationToken); return Ok(dto); } private async Task AssertUserHasAccessToProcessMapWellboreDevelopmentAsync(int idWell, CancellationToken cancellationToken) { var idUser = User.GetUserId(); if (!idUser.HasValue) throw new ForbidException("Неизвестный пользователь"); var well = await wellService.GetOrDefaultAsync(idWell, cancellationToken) ?? throw new ForbidException($"Скважины с {idWell} не существует"); if (well.IdState == 2 && !userRepository.HasPermission(idUser.Value, "ProcessMap.editCompletedWell")) throw new ForbidException("Недостаточно прав для редактирования проработки"); } }