From fd6fa2fce48e6e28c6358a79380ec63f8aeab31c Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Thu, 29 Jul 2021 19:57:06 -0500 Subject: [PATCH] Bugfix/in progress (#452) # Fixed - Fixed: Fixed an issue in In Progress where it would not pull the series with correct pagination due to the unique situation with the query. All series that are in progress should now return. ============================ * Fixed In Progress not showing for all series due to pagination bug * Version bump --- API/Controllers/SeriesController.cs | 11 ++++- API/Data/SeriesRepository.cs | 71 ++++++++++++++------------- API/Extensions/FilterDtoExtensions.cs | 7 +-- API/Interfaces/ISeriesRepository.cs | 2 +- Kavita.Common/Kavita.Common.csproj | 2 +- 5 files changed, 52 insertions(+), 41 deletions(-) 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