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);
}
}