diff --git a/API/Controllers/SeriesController.cs b/API/Controllers/SeriesController.cs index b739b62bd..7bf59c7e0 100644 --- a/API/Controllers/SeriesController.cs +++ b/API/Controllers/SeriesController.cs @@ -168,8 +168,17 @@ namespace API.Controllers [HttpPost("in-progress")] public async Task>> GetInProgress(FilterDto filterDto, [FromQuery] UserParams userParams, [FromQuery] int libraryId = 0) { + // NOTE: This has to be done manually like this due to the DisinctBy requirement var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync(User.GetUsername()); - return Ok((await _unitOfWork.SeriesRepository.GetInProgress(user.Id, libraryId, userParams, filterDto)).DistinctBy(s => s.Name)); + var results = await _unitOfWork.SeriesRepository.GetInProgress(user.Id, libraryId, userParams, filterDto); + + var listResults = results.DistinctBy(s => s.Name).Skip((userParams.PageNumber - 1) * userParams.PageSize) + .Take(userParams.PageSize).ToList(); + var pagedList = new PagedList(listResults, listResults.Count, userParams.PageNumber, userParams.PageSize); + + Response.AddPaginationHeader(pagedList.CurrentPage, pagedList.PageSize, pagedList.TotalCount, pagedList.TotalPages); + + return Ok(pagedList); } [Authorize(Policy = "RequireAdminRole")] diff --git a/API/Data/SeriesRepository.cs b/API/Data/SeriesRepository.cs index afaf17f5b..7a608882a 100644 --- a/API/Data/SeriesRepository.cs +++ b/API/Data/SeriesRepository.cs @@ -323,7 +323,6 @@ namespace API.Data var allQuery = _context.Series .Where(s => userLibraries.Contains(s.LibraryId) && formats.Contains(s.Format)) - .AsNoTracking() .OrderByDescending(s => s.Created) .ProjectTo(_mapper.ConfigurationProvider) .AsNoTracking(); @@ -333,7 +332,6 @@ namespace API.Data var query = _context.Series .Where(s => s.LibraryId == libraryId && formats.Contains(s.Format)) - .AsNoTracking() .OrderByDescending(s => s.Created) .ProjectTo(_mapper.ConfigurationProvider) .AsNoTracking(); @@ -349,48 +347,55 @@ namespace API.Data /// Pagination information /// Optional (default null) filter on query /// - public async Task> GetInProgress(int userId, int libraryId, UserParams userParams, FilterDto filter) + public async Task> GetInProgress(int userId, int libraryId, UserParams userParams, FilterDto filter) { var formats = filter.GetSqlFilter(); + IList userLibraries; + if (libraryId == 0) + { + userLibraries = _context.Library + .Include(l => l.AppUsers) + .Where(library => library.AppUsers.Any(user => user.Id == userId)) + .AsNoTracking() + .Select(library => library.Id) + .ToList(); + } + else + { + userLibraries = new List() {libraryId}; + } + var series = _context.Series - .Where(s => formats.Contains(s.Format)) + .Where(s => formats.Contains(s.Format) && userLibraries.Contains(s.LibraryId)) .Join(_context.AppUserProgresses, s => s.Id, progress => progress.SeriesId, (s, progress) => new { Series = s, PagesRead = _context.AppUserProgresses.Where(s1 => s1.SeriesId == s.Id).Sum(s1 => s1.PagesRead), progress.AppUserId, LastModified = _context.AppUserProgresses.Where(p => p.Id == progress.Id).Max(p => p.LastModified) - }).AsNoTracking(); - if (libraryId == 0) - { - var userLibraries = _context.Library - .Include(l => l.AppUsers) - .Where(library => library.AppUsers.Any(user => user.Id == userId)) - .AsNoTracking() - .Select(library => library.Id) - .ToList(); - series = series.Where(s => s.AppUserId == userId - && s.PagesRead > 0 - && s.PagesRead < s.Series.Pages - && userLibraries.Contains(s.Series.LibraryId) - && formats.Contains(s.Series.Format)); - } - else - { - series = series.Where(s => s.AppUserId == userId - && s.PagesRead > 0 - && s.PagesRead < s.Series.Pages - && s.Series.LibraryId == libraryId - && formats.Contains(s.Series.Format)); - } - - var retSeries = series - .OrderByDescending(s => s.LastModified) - .Select(s => s.Series) - .ProjectTo(_mapper.ConfigurationProvider) + }) .AsNoTracking(); - return await PagedList.CreateAsync(retSeries, userParams.PageNumber, userParams.PageSize); + + + var retSeries = series.Where(s => s.AppUserId == userId + && s.PagesRead > 0 + && s.PagesRead < s.Series.Pages + /*&& userLibraries.Contains(s.Series.LibraryId)*/ + /* && formats.Contains(s.Series.Format) */) + .OrderByDescending(s => s.LastModified) + .Select(s => s.Series) + .ProjectTo(_mapper.ConfigurationProvider) + .AsNoTracking(); + + // var retSeries = series + // .OrderByDescending(s => s.LastModified) + // .Select(s => s.Series) + // .ProjectTo(_mapper.ConfigurationProvider) + // .AsNoTracking(); + // BUG: Pagination does not work for this query as when we pull the data back, we get multiple rows of the same series + return await retSeries.ToListAsync(); + //return await PagedList.CreateAsync(retSeries, userParams.PageNumber, userParams.PageSize); } public async Task GetSeriesMetadata(int seriesId) diff --git a/API/Extensions/FilterDtoExtensions.cs b/API/Extensions/FilterDtoExtensions.cs index 1b6689d49..7e5a818ec 100644 --- a/API/Extensions/FilterDtoExtensions.cs +++ b/API/Extensions/FilterDtoExtensions.cs @@ -7,7 +7,7 @@ namespace API.Extensions { public static class FilterDtoExtensions { - private static IList _allFormats = Enum.GetValues(); + private static readonly IList AllFormats = Enum.GetValues(); public static IList GetSqlFilter(this FilterDto filter) { @@ -19,10 +19,7 @@ namespace API.Extensions (MangaFormat) format }; } - else - { - return _allFormats; - } + return AllFormats; } } } diff --git a/API/Interfaces/ISeriesRepository.cs b/API/Interfaces/ISeriesRepository.cs index bedbf8b56..399bf4f1a 100644 --- a/API/Interfaces/ISeriesRepository.cs +++ b/API/Interfaces/ISeriesRepository.cs @@ -58,7 +58,7 @@ namespace API.Interfaces Task GetVolumeCoverImageAsync(int volumeId); Task GetSeriesCoverImageAsync(int seriesId); - Task> GetInProgress(int userId, int libraryId, UserParams userParams, FilterDto filter); + Task> GetInProgress(int userId, int libraryId, UserParams userParams, FilterDto filter); Task> GetRecentlyAdded(int libraryId, int userId, UserParams userParams, FilterDto filter); Task GetSeriesMetadata(int seriesId); Task> GetSeriesDtoForCollectionAsync(int collectionId, int userId, UserParams userParams); diff --git a/Kavita.Common/Kavita.Common.csproj b/Kavita.Common/Kavita.Common.csproj index b4bc5f86a..d099ff6ea 100644 --- a/Kavita.Common/Kavita.Common.csproj +++ b/Kavita.Common/Kavita.Common.csproj @@ -4,7 +4,7 @@ net5.0 kavitareader.com Kavita - 0.4.3.6 + 0.4.3.7 en