mirror of
				https://github.com/Kareadita/Kavita.git
				synced 2025-11-04 03:27:05 -05:00 
			
		
		
		
	* Added some basic OPDS implementation * Fixed an issue with feed href * More changes * Added library routes and moved user code to a method so we can hack in fixed code without authentication * Images now load on the OPDS reusing our existing Image infrastructure. * Added the ability to download and moved some download code to a dedicated service * Download is working, pagination is implemented. * Refactored libraries to use pagination * Laid foundation for OpenSearch implementation * Fixed up some serialization issues and some old code that wasn't referencing helper methods * Ensure chapters are sorted when we send them over OPDS * OpenSearch implemented * Removed any support for OPDS-PS due to lack of apps supporting it. * Don't distribute development.json nor stats directory on build. * Implemented In Progress feed as well. * Ability to enable OPDS for server. OPDS now accepts initial call as POST in case app uses username/password. * UI now properly renders state for OPDS enablement. Added Collections routes. * Fixed pagination startIndex on OPDS feeds when there is less than 1 page. * Chunky Reader now works. It only accepts UTF-8 encodings * More Chunky fixes * More chunky changes, such a fussy client. * Implemented the ability to have a custom api key assigned to a user and use that api key as your authentication token against OPDS routing. * Implemented the ability to reset your API Key * Fixed favicon not being sent back correctly * Fixed an issue where images wouldn't send on OPDS feed. * Implemented Page streaming and fixed a pagination bug * Hooked in the ability to save progress in Kavita when Page Streaming
		
			
				
	
	
		
			83 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
 | 
						|
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System.Linq;
 | 
						|
using System.Threading.Tasks;
 | 
						|
using API.DTOs;
 | 
						|
using API.Entities;
 | 
						|
 | 
						|
namespace API.Interfaces.Services
 | 
						|
{
 | 
						|
    public class ReaderService : IReaderService
 | 
						|
    {
 | 
						|
        private readonly IUnitOfWork _unitOfWork;
 | 
						|
 | 
						|
        public ReaderService(IUnitOfWork unitOfWork)
 | 
						|
        {
 | 
						|
            _unitOfWork = unitOfWork;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Saves progress to DB
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="progressDto"></param>
 | 
						|
        /// <param name="user"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        public async Task<bool> SaveReadingProgress(ProgressDto progressDto, AppUser user)
 | 
						|
        {
 | 
						|
            // Don't let user save past total pages.
 | 
						|
            var chapter = await _unitOfWork.VolumeRepository.GetChapterAsync(progressDto.ChapterId);
 | 
						|
            if (progressDto.PageNum > chapter.Pages)
 | 
						|
            {
 | 
						|
                progressDto.PageNum = chapter.Pages;
 | 
						|
            }
 | 
						|
 | 
						|
            if (progressDto.PageNum < 0)
 | 
						|
            {
 | 
						|
                progressDto.PageNum = 0;
 | 
						|
            }
 | 
						|
 | 
						|
            try
 | 
						|
            {
 | 
						|
                user.Progresses ??= new List<AppUserProgress>();
 | 
						|
                var userProgress =
 | 
						|
                    user.Progresses.FirstOrDefault(x => x.ChapterId == progressDto.ChapterId && x.AppUserId == user.Id);
 | 
						|
 | 
						|
                if (userProgress == null)
 | 
						|
                {
 | 
						|
                    user.Progresses.Add(new AppUserProgress
 | 
						|
                    {
 | 
						|
                        PagesRead = progressDto.PageNum,
 | 
						|
                        VolumeId = progressDto.VolumeId,
 | 
						|
                        SeriesId = progressDto.SeriesId,
 | 
						|
                        ChapterId = progressDto.ChapterId,
 | 
						|
                        BookScrollId = progressDto.BookScrollId,
 | 
						|
                        LastModified = DateTime.Now
 | 
						|
                    });
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    userProgress.PagesRead = progressDto.PageNum;
 | 
						|
                    userProgress.SeriesId = progressDto.SeriesId;
 | 
						|
                    userProgress.VolumeId = progressDto.VolumeId;
 | 
						|
                    userProgress.BookScrollId = progressDto.BookScrollId;
 | 
						|
                    userProgress.LastModified = DateTime.Now;
 | 
						|
                }
 | 
						|
 | 
						|
                _unitOfWork.UserRepository.Update(user);
 | 
						|
 | 
						|
                if (await _unitOfWork.CommitAsync())
 | 
						|
                {
 | 
						|
                    return true;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            catch (Exception)
 | 
						|
            {
 | 
						|
                await _unitOfWork.RollbackAsync();
 | 
						|
            }
 | 
						|
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |