using AsbCloudApp.Services; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System.ComponentModel.DataAnnotations; using System.IO; using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Repositories; using Microsoft.AspNetCore.Authorization; using System.Net; namespace AsbCloudWebApi.Controllers; /// /// Справки по страницам /// [Route("api/[controller]")] [ApiController] [Authorize] public class HelpPageController : ControllerBase { private readonly IHelpPageService helpPageService; private readonly IUserRepository userRepository; private readonly IHelpPageRepository helpPageRepository; public HelpPageController(IHelpPageService helpPageService, IUserRepository userRepository, IHelpPageRepository helpPageRepository) { this.helpPageService = helpPageService; this.userRepository = userRepository; this.helpPageRepository = helpPageRepository; } /// /// Загрузка файла справки /// /// Ключ страницы /// Id категории файла. Допустимое значение параметра: 20000 /// Файл справки /// Токен для отмены задачи /// [HttpPost] [Permission] [ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)] public async Task UploadAsync( [Required] string key, [Range(minimum: 20000, maximum: 20000, ErrorMessage = "Категория файла недопустима. Допустимые: 20000")] int idCategory, [Required] IFormFile file, CancellationToken cancellationToken) { int? idUser = User.GetUserId(); if(!idUser.HasValue) return Forbid(); if (!userRepository.HasPermission(idUser.Value, $"HelpPage.edit")) return Forbid(); using var fileStream = file.OpenReadStream(); int helpPageId = await helpPageService.AddOrUpdateAsync(key, idCategory, file.FileName, fileStream, cancellationToken); return Ok(helpPageId); } /// /// Получение файла справки /// /// Ключ страницы /// Id категории файла. Допустимое значение параметра: 20000 /// Токен для отмены задачи /// [HttpGet] [ProducesResponseType(typeof(PhysicalFileResult), (int)HttpStatusCode.OK)] [ProducesResponseType(StatusCodes.Status204NoContent)] public async Task GetFileAsync( [Required] string key, [Range(minimum: 20000, maximum: 20000, ErrorMessage = "Категория файла недопустима. Допустимые: 20000")] int idCategory, CancellationToken cancellationToken) { var file = await helpPageService.GetFileStreamAsync(key, idCategory, cancellationToken); if (!file.HasValue) return NoContent(); return File(file.Value.stream, "application/pdf", file.Value.fileName); } }