Implemented ability to mark a series as Read/Unread.

This commit is contained in:
Joseph Milazzo 2021-02-16 12:48:04 -06:00
parent 90318e8e78
commit 83b9394b17
6 changed files with 100 additions and 11 deletions

View File

@ -73,7 +73,7 @@ namespace API.Controllers
if (!await _unitOfWork.Complete()) return BadRequest("There was a critical issue. Please try again."); if (!await _unitOfWork.Complete()) return BadRequest("There was a critical issue. Please try again.");
_logger.LogInformation($"Created a new library: {library.Name}"); _logger.LogInformation("Created a new library: {LibraryName}", library.Name);
_taskScheduler.ScanLibrary(library.Id); _taskScheduler.ScanLibrary(library.Id);
return Ok(); return Ok();
} }
@ -111,7 +111,7 @@ namespace API.Controllers
if (user == null) return BadRequest("Could not validate user"); if (user == null) return BadRequest("Could not validate user");
var libraryString = String.Join(",", updateLibraryForUserDto.SelectedLibraries.Select(x => x.Name)); var libraryString = String.Join(",", updateLibraryForUserDto.SelectedLibraries.Select(x => x.Name));
_logger.LogInformation($"Granting user {updateLibraryForUserDto.Username} access to: {libraryString}"); _logger.LogInformation("Granting user {UserName} access to: {Libraries}", updateLibraryForUserDto.Username, libraryString);
var allLibraries = await _unitOfWork.LibraryRepository.GetLibrariesAsync(); var allLibraries = await _unitOfWork.LibraryRepository.GetLibrariesAsync();
foreach (var library in allLibraries) foreach (var library in allLibraries)
@ -133,13 +133,13 @@ namespace API.Controllers
if (!_unitOfWork.HasChanges()) if (!_unitOfWork.HasChanges())
{ {
_logger.LogInformation($"Added: {updateLibraryForUserDto.SelectedLibraries} to {updateLibraryForUserDto.Username}"); _logger.LogInformation("Added: {SelectedLibraries} to {Username}",libraryString, updateLibraryForUserDto.Username);
return Ok(_mapper.Map<MemberDto>(user)); return Ok(_mapper.Map<MemberDto>(user));
} }
if (await _unitOfWork.Complete()) if (await _unitOfWork.Complete())
{ {
_logger.LogInformation($"Added: {updateLibraryForUserDto.SelectedLibraries} to {updateLibraryForUserDto.Username}"); _logger.LogInformation("Added: {SelectedLibraries} to {Username}",libraryString, updateLibraryForUserDto.Username);
return Ok(_mapper.Map<MemberDto>(user)); return Ok(_mapper.Map<MemberDto>(user));
} }

View File

@ -64,6 +64,88 @@ namespace API.Controllers
return Ok(progress?.PagesRead ?? 0); return Ok(progress?.PagesRead ?? 0);
} }
[HttpPost("mark-read")]
public async Task<ActionResult> MarkRead(MarkReadDto markReadDto)
{
var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync(User.GetUsername());
var volumes = await _unitOfWork.SeriesRepository.GetVolumes(markReadDto.SeriesId); // TODO: Make this async
user.Progresses ??= new List<AppUserProgress>();
foreach (var volume in volumes)
{
foreach (var chapter in volume.Chapters)
{
var userProgress = user.Progresses.SingleOrDefault(x => x.ChapterId == chapter.Id && x.AppUserId == user.Id);
if (userProgress == null) // I need to get all chapters and generate new user progresses for them?
{
user.Progresses.Add(new AppUserProgress
{
PagesRead = chapter.Pages,
VolumeId = volume.Id,
SeriesId = markReadDto.SeriesId,
ChapterId = chapter.Id
});
}
else
{
userProgress.PagesRead = chapter.Pages;
userProgress.SeriesId = markReadDto.SeriesId;
userProgress.VolumeId = volume.Id;
}
}
}
_unitOfWork.UserRepository.Update(user);
if (await _unitOfWork.Complete())
{
return Ok();
}
return BadRequest("There was an issue saving progress");
}
[HttpPost("mark-unread")]
public async Task<ActionResult> MarkUnread(MarkReadDto markReadDto)
{
var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync(User.GetUsername());
var volumes = await _unitOfWork.SeriesRepository.GetVolumes(markReadDto.SeriesId);
user.Progresses ??= new List<AppUserProgress>();
foreach (var volume in volumes)
{
foreach (var chapter in volume.Chapters)
{
var userProgress = user.Progresses.SingleOrDefault(x => x.ChapterId == chapter.Id && x.AppUserId == user.Id);
if (userProgress == null)
{
user.Progresses.Add(new AppUserProgress
{
PagesRead = 0,
VolumeId = volume.Id,
SeriesId = markReadDto.SeriesId,
ChapterId = chapter.Id
});
}
else
{
userProgress.PagesRead = 0;
userProgress.SeriesId = markReadDto.SeriesId;
userProgress.VolumeId = volume.Id;
}
}
}
_unitOfWork.UserRepository.Update(user);
if (await _unitOfWork.Complete())
{
return Ok();
}
return BadRequest("There was an issue saving progress");
}
[HttpPost("bookmark")] [HttpPost("bookmark")]
public async Task<ActionResult> Bookmark(BookmarkDto bookmarkDto) public async Task<ActionResult> Bookmark(BookmarkDto bookmarkDto)
{ {

7
API/DTOs/MarkReadDto.cs Normal file
View File

@ -0,0 +1,7 @@
namespace API.DTOs
{
public class MarkReadDto
{
public int SeriesId { get; set; }
}
}

View File

@ -116,14 +116,14 @@ namespace API.Data
} }
public IEnumerable<Volume> GetVolumes(int seriesId) public async Task<IEnumerable<Volume>> GetVolumes(int seriesId)
{ {
return _context.Volume return await _context.Volume
.Where(vol => vol.SeriesId == seriesId) .Where(vol => vol.SeriesId == seriesId)
.Include(vol => vol.Chapters) .Include(vol => vol.Chapters)
.ThenInclude(c => c.Files) .ThenInclude(c => c.Files)
.OrderBy(vol => vol.Number) .OrderBy(vol => vol.Number)
.ToList(); .ToListAsync();
} }
public async Task<SeriesDto> GetSeriesDtoByIdAsync(int seriesId, int userId) public async Task<SeriesDto> GetSeriesDtoByIdAsync(int seriesId, int userId)

View File

@ -26,7 +26,7 @@ namespace API.Interfaces
Task<IEnumerable<SearchResultDto>> SearchSeries(int[] libraryIds, string searchQuery); Task<IEnumerable<SearchResultDto>> SearchSeries(int[] libraryIds, string searchQuery);
Task<IEnumerable<Series>> GetSeriesForLibraryIdAsync(int libraryId); Task<IEnumerable<Series>> GetSeriesForLibraryIdAsync(int libraryId);
Task<IEnumerable<VolumeDto>> GetVolumesDtoAsync(int seriesId, int userId); Task<IEnumerable<VolumeDto>> GetVolumesDtoAsync(int seriesId, int userId);
IEnumerable<Volume> GetVolumes(int seriesId); Task<IEnumerable<Volume>> GetVolumes(int seriesId);
Task<SeriesDto> GetSeriesDtoByIdAsync(int seriesId, int userId); Task<SeriesDto> GetSeriesDtoByIdAsync(int seriesId, int userId);
Task<Volume> GetVolumeAsync(int volumeId); Task<Volume> GetVolumeAsync(int volumeId);
Task<VolumeDto> GetVolumeDtoAsync(int volumeId, int userId); Task<VolumeDto> GetVolumeDtoAsync(int volumeId, int userId);

View File

@ -78,12 +78,12 @@ namespace API.Services
var library = Task.Run(() => _unitOfWork.LibraryRepository.GetLibraryForIdAsync(libraryId)).Result; var library = Task.Run(() => _unitOfWork.LibraryRepository.GetLibraryForIdAsync(libraryId)).Result;
var allSeries = Task.Run(() => _unitOfWork.SeriesRepository.GetSeriesForLibraryIdAsync(libraryId)).Result.ToList(); var allSeries = Task.Run(() => _unitOfWork.SeriesRepository.GetSeriesForLibraryIdAsync(libraryId)).Result.ToList();
_logger.LogInformation($"Beginning metadata refresh of {library.Name}"); _logger.LogInformation("Beginning metadata refresh of {LibraryName}", library.Name);
foreach (var series in allSeries) foreach (var series in allSeries)
{ {
series.NormalizedName = Parser.Parser.Normalize(series.Name); series.NormalizedName = Parser.Parser.Normalize(series.Name);
var volumes = _unitOfWork.SeriesRepository.GetVolumes(series.Id).ToList(); var volumes = Task.Run(() => _unitOfWork.SeriesRepository.GetVolumes(series.Id)).Result.ToList();
foreach (var volume in volumes) foreach (var volume in volumes)
{ {
foreach (var chapter in volume.Chapters) foreach (var chapter in volume.Chapters)
@ -101,7 +101,7 @@ namespace API.Services
if (_unitOfWork.HasChanges() && Task.Run(() => _unitOfWork.Complete()).Result) if (_unitOfWork.HasChanges() && Task.Run(() => _unitOfWork.Complete()).Result)
{ {
_logger.LogInformation($"Updated metadata for {library.Name} in {sw.ElapsedMilliseconds} ms."); _logger.LogInformation("Updated metadata for {LibraryName} in {ElapsedMilliseconds} milliseconds", library.Name, sw.ElapsedMilliseconds);
} }
} }
} }