using System; using System.Collections.Generic; using System.Threading.Tasks; using API.Constants; using API.Data; using API.DTOs; using API.DTOs.Filtering; using API.DTOs.Metadata; using API.DTOs.Uploads; using API.Entities; using API.Extensions; using API.Helpers; using API.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using TaskScheduler = API.Services.TaskScheduler; namespace API.Controllers; /// /// All APIs here are subject to be removed and are no longer maintained /// [Route("api/")] public class DeprecatedController : BaseApiController { private readonly IUnitOfWork _unitOfWork; private readonly ILocalizationService _localizationService; private readonly ITaskScheduler _taskScheduler; private readonly ILogger _logger; public DeprecatedController(IUnitOfWork unitOfWork, ILocalizationService localizationService, ITaskScheduler taskScheduler, ILogger logger) { _unitOfWork = unitOfWork; _localizationService = localizationService; _taskScheduler = taskScheduler; _logger = logger; } /// /// Return all Series that are in the current logged-in user's Want to Read list, filtered (deprecated, use v2) /// /// This will be removed in v0.9.0 /// /// /// [HttpPost("want-to-read")] [Obsolete("use v2 instead. This will be removed in v0.9.0")] public async Task>> GetWantToRead([FromQuery] UserParams? userParams, FilterDto filterDto) { userParams ??= new UserParams(); var pagedList = await _unitOfWork.SeriesRepository.GetWantToReadForUserAsync(UserId, userParams, filterDto); Response.AddPaginationHeader(pagedList.CurrentPage, pagedList.PageSize, pagedList.TotalCount, pagedList.TotalPages); await _unitOfWork.SeriesRepository.AddSeriesModifiers(UserId, pagedList); return Ok(pagedList); } /// /// All chapter entities will load this data by default. Will not be maintained as of v0.8.1 /// /// /// [Obsolete("All chapter entities will load this data by default. Will be removed in v0.9.0")] [HttpGet("series/chapter-metadata")] public async Task> GetChapterMetadata(int chapterId) { return Ok(await _unitOfWork.ChapterRepository.GetChapterMetadataDtoAsync(chapterId)); } /// /// Gets series with the applied Filter /// /// This is considered v1 and no longer used by Kavita, but will be supported for sometime. See series/v2 /// /// /// /// [HttpPost("series")] [Obsolete("use v2. Will be removed in v0.9.0")] public async Task>> GetSeriesForLibrary(int libraryId, [FromQuery] UserParams userParams, [FromBody] FilterDto filterDto) { var userId = UserId; var series = await _unitOfWork.SeriesRepository.GetSeriesDtoForLibraryIdAsync(libraryId, userId, userParams, filterDto); // Apply progress/rating information (I can't work out how to do this in initial query) if (series == null) return BadRequest(await _localizationService.Translate(UserId, "no-series")); await _unitOfWork.SeriesRepository.AddSeriesModifiers(userId, series); Response.AddPaginationHeader(series.CurrentPage, series.PageSize, series.TotalCount, series.TotalPages); return Ok(series); } /// /// Gets all recently added series. Obsolete, use recently-added-v2 /// /// /// /// /// [ResponseCache(CacheProfileName = "Instant")] [HttpPost("series/recently-added")] [Obsolete("use recently-added-v2. Will be removed in v0.9.0")] public async Task>> GetRecentlyAdded(FilterDto filterDto, [FromQuery] UserParams userParams, [FromQuery] int libraryId = 0) { var userId = UserId; var series = await _unitOfWork.SeriesRepository.GetRecentlyAdded(libraryId, userId, userParams, filterDto); // Apply progress/rating information (I can't work out how to do this in initial query) if (series == null) return BadRequest(await _localizationService.Translate(UserId, "no-series")); await _unitOfWork.SeriesRepository.AddSeriesModifiers(userId, series); Response.AddPaginationHeader(series.CurrentPage, series.PageSize, series.TotalCount, series.TotalPages); return Ok(series); } /// /// Returns all series for the library. Obsolete, use all-v2 /// /// /// /// /// [HttpPost("series/all")] [Obsolete("Use all-v2. Will be removed in v0.9.0")] public async Task>> GetAllSeries(FilterDto filterDto, [FromQuery] UserParams userParams, [FromQuery] int libraryId = 0) { var userId = UserId; var series = await _unitOfWork.SeriesRepository.GetSeriesDtoForLibraryIdAsync(libraryId, userId, userParams, filterDto); // Apply progress/rating information (I can't work out how to do this in initial query) if (series == null) return BadRequest(await _localizationService.Translate(UserId, "no-series")); await _unitOfWork.SeriesRepository.AddSeriesModifiers(userId, series); Response.AddPaginationHeader(series.CurrentPage, series.PageSize, series.TotalCount, series.TotalPages); return Ok(series); } /// /// Replaces chapter cover image and locks it with a base64 encoded image. This will update the parent volume's cover image. /// /// Does not use Url property /// [Authorize(Policy = PolicyGroups.AdminPolicy)] [HttpPost("upload/reset-chapter-lock")] [Obsolete("Use LockCover in UploadFileDto, will be removed in v0.9.0")] public async Task ResetChapterLock(UploadFileDto uploadFileDto) { try { var chapter = await _unitOfWork.ChapterRepository.GetChapterAsync(uploadFileDto.Id); if (chapter == null) return BadRequest(await _localizationService.Translate(UserId, "chapter-doesnt-exist")); var originalFile = chapter.CoverImage; chapter.CoverImage = string.Empty; chapter.CoverImageLocked = false; _unitOfWork.ChapterRepository.Update(chapter); var volume = (await _unitOfWork.VolumeRepository.GetVolumeByIdAsync(chapter.VolumeId))!; volume.CoverImage = chapter.CoverImage; _unitOfWork.VolumeRepository.Update(volume); var series = (await _unitOfWork.SeriesRepository.GetSeriesByIdAsync(volume.SeriesId))!; if (_unitOfWork.HasChanges()) { await _unitOfWork.CommitAsync(); if (originalFile != null) System.IO.File.Delete(originalFile); await _taskScheduler.RefreshSeriesMetadata(series.LibraryId, series.Id, true); return Ok(); } } catch (Exception e) { _logger.LogError(e, "There was an issue resetting cover lock for Chapter {Id}", uploadFileDto.Id); await _unitOfWork.RollbackAsync(); } return BadRequest(await _localizationService.Translate(UserId, "reset-chapter-lock")); } }