Misc Bugfixes and Cleanup (#1144)

* Moved libraryType into chapter info

* Fixed a bug where you could not reset cover on a series

* Patched in relevant changes from another polish branch

* Refactored invite user setup to shift the checking for accessibility to the backend and always show the link. This will help with users who have some unique setups in docker.

* Refactored invite user to always print the url to setup a new account.

* Single page renderer uses canvasImage rather than re-requesting and relying on cache

* Fixed a rendering issue where fit to split on single on a cover wouldn't force width scaling just for that image

* Fixed a rendering bug with split image functionality

* Added title to copy button

* Fixed a bug in GetContinuePoint when a chapter is added to an already read volume and a new chapter is added loose leaf. The loose leaf would be prioritized over the volume chapter.

Refactored 2 methods from controller into service and unit tested.

* Fixed a bug on opening a volume in series detail that had a chapter added to it after the volume (0 chapter) was read would cause a loose leaf chapter to be opened.

* Added mark as read/actionables on Files in volume detail modal. Fixed a bug where we were showing the wrong page count in a volume detail modal.

* Removed OnDeck page and replaced it with a pre-filtered All-Series. Hooked up the ability to pass read state to the filter via query params. Fixed some spacing on filter post bootstrap update.

* Fixed up some poor documentation on FilterDto.
This commit is contained in:
Joseph Milazzo 2022-03-12 16:02:42 -06:00 committed by GitHub
parent 4b0ed18901
commit 54c1641728
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
36 changed files with 395 additions and 306 deletions

View file

@ -98,7 +98,7 @@ public class EmailService : IEmailService
return await SendEmailWithPost(emailLink + "/api/email/email-password-reset", data);
}
private static async Task<bool> SendEmailWithGet(string url)
private static async Task<bool> SendEmailWithGet(string url, int timeoutSecs = 30)
{
try
{
@ -108,7 +108,7 @@ public class EmailService : IEmailService
.WithHeader("x-api-key", "MsnvA2DfQqxSK5jh")
.WithHeader("x-kavita-version", BuildInfo.Version)
.WithHeader("Content-Type", "application/json")
.WithTimeout(TimeSpan.FromSeconds(30))
.WithTimeout(TimeSpan.FromSeconds(timeoutSecs))
.GetStringAsync();
if (!string.IsNullOrEmpty(response) && bool.Parse(response))
@ -124,7 +124,7 @@ public class EmailService : IEmailService
}
private static async Task<bool> SendEmailWithPost(string url, object data)
private static async Task<bool> SendEmailWithPost(string url, object data, int timeoutSecs = 30)
{
try
{
@ -134,7 +134,7 @@ public class EmailService : IEmailService
.WithHeader("x-api-key", "MsnvA2DfQqxSK5jh")
.WithHeader("x-kavita-version", BuildInfo.Version)
.WithHeader("Content-Type", "application/json")
.WithTimeout(TimeSpan.FromSeconds(30))
.WithTimeout(TimeSpan.FromSeconds(timeoutSecs))
.PostJsonAsync(data);
if (response.StatusCode != StatusCodes.Status200OK)

View file

@ -16,6 +16,8 @@ namespace API.Services;
public interface IReaderService
{
Task MarkSeriesAsRead(AppUser user, int seriesId);
Task MarkSeriesAsUnread(AppUser user, int seriesId);
void MarkChaptersAsRead(AppUser user, int seriesId, IEnumerable<Chapter> chapters);
void MarkChaptersAsUnread(AppUser user, int seriesId, IEnumerable<Chapter> chapters);
Task<bool> SaveReadingProgress(ProgressDto progressDto, int userId);
@ -45,6 +47,40 @@ public class ReaderService : IReaderService
return Parser.Parser.NormalizePath(Path.Join(baseDirectory, $"{userId}", $"{seriesId}", $"{chapterId}"));
}
/// <summary>
/// Does not commit. Marks all entities under the series as read.
/// </summary>
/// <param name="user"></param>
/// <param name="seriesId"></param>
public async Task MarkSeriesAsRead(AppUser user, int seriesId)
{
var volumes = await _unitOfWork.VolumeRepository.GetVolumes(seriesId);
user.Progresses ??= new List<AppUserProgress>();
foreach (var volume in volumes)
{
MarkChaptersAsRead(user, seriesId, volume.Chapters);
}
_unitOfWork.UserRepository.Update(user);
}
/// <summary>
/// Does not commit. Marks all entities under the series as unread.
/// </summary>
/// <param name="user"></param>
/// <param name="seriesId"></param>
public async Task MarkSeriesAsUnread(AppUser user, int seriesId)
{
var volumes = await _unitOfWork.VolumeRepository.GetVolumes(seriesId);
user.Progresses ??= new List<AppUserProgress>();
foreach (var volume in volumes)
{
MarkChaptersAsUnread(user, seriesId, volume.Chapters);
}
_unitOfWork.UserRepository.Update(user);
}
/// <summary>
/// Marks all Chapters as Read by creating or updating UserProgress rows. Does not commit.
/// </summary>
@ -364,7 +400,7 @@ public class ReaderService : IReaderService
.ToList();
// If there are any volumes that have progress, return those. If not, move on.
var currentlyReadingChapter = volumeChapters.FirstOrDefault(chapter => chapter.PagesRead < chapter.Pages && chapter.PagesRead > 0);
var currentlyReadingChapter = volumeChapters.FirstOrDefault(chapter => chapter.PagesRead < chapter.Pages); // (removed for GetContinuePoint_ShouldReturnFirstVolumeChapter_WhenPreExistingProgress), not sure if needed && chapter.PagesRead > 0
if (currentlyReadingChapter != null) return currentlyReadingChapter;
// Check loose leaf chapters (and specials). First check if there are any