using System.Linq; using System.Threading.Tasks; using API.Constants; using API.Data; using API.Data.Repositories; using API.DTOs; using API.Extensions; using API.Services; using API.SignalR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace API.Controllers; #nullable enable public class VolumeController : BaseApiController { private readonly IUnitOfWork _unitOfWork; private readonly ILocalizationService _localizationService; private readonly IEventHub _eventHub; public VolumeController(IUnitOfWork unitOfWork, ILocalizationService localizationService, IEventHub eventHub) { _unitOfWork = unitOfWork; _localizationService = localizationService; _eventHub = eventHub; } /// /// Returns the appropriate Volume /// /// /// [HttpGet] public async Task> GetVolume(int volumeId) { return Ok(await _unitOfWork.VolumeRepository.GetVolumeDtoAsync(volumeId, User.GetUserId())); } [Authorize(Policy = "RequireAdminRole")] [HttpDelete] public async Task> DeleteVolume(int volumeId) { var volume = await _unitOfWork.VolumeRepository.GetVolumeAsync(volumeId, VolumeIncludes.Chapters | VolumeIncludes.People | VolumeIncludes.Tags); if (volume == null) return BadRequest(_localizationService.Translate(User.GetUserId(), "volume-doesnt-exist")); _unitOfWork.VolumeRepository.Remove(volume); if (await _unitOfWork.CommitAsync()) { await _eventHub.SendMessageAsync(MessageFactory.VolumeRemoved, MessageFactory.VolumeRemovedEvent(volume.Id, volume.SeriesId), false); return Ok(true); } return Ok(false); } [Authorize(Policy = "RequireAdminRole")] [HttpPost("multiple")] public async Task> DeleteMultipleVolumes(int[] volumesIds) { var volumes = await _unitOfWork.VolumeRepository.GetVolumesById(volumesIds); if (volumes.Count != volumesIds.Length) { return BadRequest(_localizationService.Translate(User.GetUserId(), "volume-doesnt-exist")); } _unitOfWork.VolumeRepository.Remove(volumes); if (!await _unitOfWork.CommitAsync()) { return Ok(false); } foreach (var volume in volumes) { await _eventHub.SendMessageAsync(MessageFactory.VolumeRemoved, MessageFactory.VolumeRemovedEvent(volume.Id, volume.SeriesId), false); } return Ok(true); } }