using System.Threading.Tasks;
using Kavita.API.Database;
using Kavita.API.Repositories;
using Kavita.API.Services;
using Kavita.API.Services.SignalR;
using Kavita.Models.Constants;
using Kavita.Models.DTOs;
using Kavita.Models.DTOs.SignalR;
using Kavita.Server.Attributes;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace Kavita.Server.Controllers;
public class VolumeController(IUnitOfWork unitOfWork, ILocalizationService localizationService, IEventHub eventHub)
: BaseApiController
{
///
/// Returns the appropriate Volume
///
///
///
[VolumeAccess]
[HttpGet]
public async Task> GetVolume(int volumeId)
{
return Ok(await unitOfWork.VolumeRepository.GetVolumeDtoAsync(volumeId, UserId));
}
[HttpDelete]
[Authorize(Policy = PolicyGroups.AdminPolicy)]
public async Task> DeleteVolume(int volumeId)
{
var volume = await unitOfWork.VolumeRepository.GetVolumeByIdAsync(volumeId,
VolumeIncludes.Chapters | VolumeIncludes.People | VolumeIncludes.Tags);
if (volume == null)
return BadRequest(localizationService.Translate(UserId, "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);
}
[HttpPost("multiple")]
[Authorize(Policy = PolicyGroups.AdminPolicy)]
public async Task> DeleteMultipleVolumes(int[] volumesIds)
{
var volumes = await unitOfWork.VolumeRepository.GetVolumesById(volumesIds);
if (volumes.Count != volumesIds.Length)
{
return BadRequest(localizationService.Translate(UserId, "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);
}
}