From 7eb62376eba7fba7860e63ed64ea6367c71432b6 Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Wed, 10 Feb 2021 15:18:52 -0600 Subject: [PATCH 1/6] Removed some extra code that was not needed in parallelization code. --- API/DTOs/SearchQueryDto.cs | 7 +++++++ API/DTOs/SearchResultDto.cs | 7 +++++++ API/Extensions/HttpExtensions.cs | 7 +++++++ API/Helpers/PagedList.cs | 7 +++++++ API/Helpers/PaginationHeader.cs | 7 +++++++ API/Helpers/UserParams.cs | 7 +++++++ API/Services/ScannerService.cs | 22 ++++++++++------------ 7 files changed, 52 insertions(+), 12 deletions(-) create mode 100644 API/DTOs/SearchQueryDto.cs create mode 100644 API/DTOs/SearchResultDto.cs create mode 100644 API/Extensions/HttpExtensions.cs create mode 100644 API/Helpers/PagedList.cs create mode 100644 API/Helpers/PaginationHeader.cs create mode 100644 API/Helpers/UserParams.cs diff --git a/API/DTOs/SearchQueryDto.cs b/API/DTOs/SearchQueryDto.cs new file mode 100644 index 000000000..ea31a9266 --- /dev/null +++ b/API/DTOs/SearchQueryDto.cs @@ -0,0 +1,7 @@ +namespace API.DTOs +{ + public class SearchQueryDto + { + + } +} \ No newline at end of file diff --git a/API/DTOs/SearchResultDto.cs b/API/DTOs/SearchResultDto.cs new file mode 100644 index 000000000..89c5bd349 --- /dev/null +++ b/API/DTOs/SearchResultDto.cs @@ -0,0 +1,7 @@ +namespace API.DTOs +{ + public class SearchResultDto + { + + } +} \ No newline at end of file diff --git a/API/Extensions/HttpExtensions.cs b/API/Extensions/HttpExtensions.cs new file mode 100644 index 000000000..b930e2652 --- /dev/null +++ b/API/Extensions/HttpExtensions.cs @@ -0,0 +1,7 @@ +namespace API.Extensions +{ + public class HttpExtensions + { + + } +} \ No newline at end of file diff --git a/API/Helpers/PagedList.cs b/API/Helpers/PagedList.cs new file mode 100644 index 000000000..b5a8fae03 --- /dev/null +++ b/API/Helpers/PagedList.cs @@ -0,0 +1,7 @@ +namespace API.Helpers +{ + public class PagedList + { + + } +} \ No newline at end of file diff --git a/API/Helpers/PaginationHeader.cs b/API/Helpers/PaginationHeader.cs new file mode 100644 index 000000000..ea0140d4c --- /dev/null +++ b/API/Helpers/PaginationHeader.cs @@ -0,0 +1,7 @@ +namespace API.Helpers +{ + public class PaginationHeader + { + + } +} \ No newline at end of file diff --git a/API/Helpers/UserParams.cs b/API/Helpers/UserParams.cs new file mode 100644 index 000000000..a6aa2d304 --- /dev/null +++ b/API/Helpers/UserParams.cs @@ -0,0 +1,7 @@ +namespace API.Helpers +{ + public class UserParams + { + + } +} \ No newline at end of file diff --git a/API/Services/ScannerService.cs b/API/Services/ScannerService.cs index 07f3404c6..d711c0d04 100644 --- a/API/Services/ScannerService.cs +++ b/API/Services/ScannerService.cs @@ -162,36 +162,34 @@ namespace API.Services _logger.LogInformation("Removed {RemoveCount} series that are no longer on disk", removeCount); // Add new series that have parsedInfos - foreach (var info in parsedSeries) + foreach (var (key, _) in parsedSeries) { - var existingSeries = library.Series.SingleOrDefault(s => s.NormalizedName == Parser.Parser.Normalize(info.Key)); + var existingSeries = library.Series.SingleOrDefault(s => s.NormalizedName == Parser.Parser.Normalize(key)); if (existingSeries == null) { existingSeries = new Series() { - Name = info.Key, - OriginalName = info.Key, - NormalizedName = Parser.Parser.Normalize(info.Key), - SortName = info.Key, + Name = key, + OriginalName = key, + NormalizedName = Parser.Parser.Normalize(key), + SortName = key, Summary = "", Volumes = new List() }; library.Series.Add(existingSeries); } - existingSeries.NormalizedName = Parser.Parser.Normalize(info.Key); + existingSeries.NormalizedName = Parser.Parser.Normalize(key); } - - int total = 0; + // Now, we only have to deal with series that exist on disk. Let's recalculate the volumes for each series var librarySeries = library.Series.ToList(); - Parallel.ForEach(librarySeries, () => 0, (series, state, subtotal) => + Parallel.ForEach(librarySeries, (series) => { _logger.LogInformation("Processing series {SeriesName}", series.Name); UpdateVolumes(series, parsedSeries[series.Name].ToArray()); series.Pages = series.Volumes.Sum(v => v.Pages); _metadataService.UpdateMetadata(series, _forceUpdate); - return 0; - }, finalResult => Interlocked.Add(ref total, finalResult)); + }); foreach (var folder in library.Folders) folder.LastScanned = DateTime.Now; } From a6b49052b94293ade916d2af0fffdabe738cd3e7 Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Thu, 11 Feb 2021 15:49:58 -0600 Subject: [PATCH 2/6] Added a conditional check on bookmark API to ensure we don't over or under set progress vs chapter's pages. --- API/Controllers/ReaderController.cs | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/API/Controllers/ReaderController.cs b/API/Controllers/ReaderController.cs index 7c535aa57..478a5dd58 100644 --- a/API/Controllers/ReaderController.cs +++ b/API/Controllers/ReaderController.cs @@ -33,7 +33,7 @@ namespace API.Controllers // Temp let's iterate the directory each call to get next image var chapter = await _cacheService.Ensure(chapterId); - if (chapter == null) return BadRequest("There was an issue finding image file for reading."); + if (chapter == null) return BadRequest("There was an issue finding image file for reading"); var (path, mangaFile) = await _cacheService.GetCachedPagePath(chapter, page); if (string.IsNullOrEmpty(path)) return BadRequest($"No such image for page {page}"); @@ -51,25 +51,33 @@ namespace API.Controllers if (user.Progresses == null) return Ok(0); var progress = user.Progresses.SingleOrDefault(x => x.AppUserId == user.Id && x.ChapterId == chapterId); - if (progress != null) return Ok(progress.PagesRead); - - return Ok(0); + return Ok(progress?.PagesRead ?? 0); } [HttpPost("bookmark")] public async Task Bookmark(BookmarkDto bookmarkDto) { var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync(User.GetUsername()); - _logger.LogInformation($"Saving {user.UserName} progress for Chapter {bookmarkDto.ChapterId} to page {bookmarkDto.PageNum}"); + _logger.LogInformation("Saving {UserName} progress for Chapter {ChapterId} to page {PageNum}", user.UserName, bookmarkDto.ChapterId, bookmarkDto.PageNum); - // TODO: Don't let user bookmark past total pages. + // Don't let user bookmark past total pages. + var chapter = await _unitOfWork.VolumeRepository.GetChapterAsync(bookmarkDto.ChapterId); + if (bookmarkDto.PageNum > chapter.Pages) + { + return BadRequest("Can't bookmark past max pages"); + } + if (bookmarkDto.PageNum < 0) + { + return BadRequest("Can't bookmark less than 0"); + } + + user.Progresses ??= new List(); var userProgress = user.Progresses.SingleOrDefault(x => x.ChapterId == bookmarkDto.ChapterId && x.AppUserId == user.Id); if (userProgress == null) { - user.Progresses.Add(new AppUserProgress { PagesRead = bookmarkDto.PageNum, From 9a502417346dd7e92dbaab8a381fd5d5a25cfa92 Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Fri, 12 Feb 2021 17:43:19 -0600 Subject: [PATCH 3/6] Fixed an off by 1 issue with reading manga. --- API/Controllers/ReaderController.cs | 10 ++++++++++ API/Services/CacheService.cs | 8 +++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/API/Controllers/ReaderController.cs b/API/Controllers/ReaderController.cs index 478a5dd58..4ead36701 100644 --- a/API/Controllers/ReaderController.cs +++ b/API/Controllers/ReaderController.cs @@ -34,12 +34,22 @@ namespace API.Controllers var chapter = await _cacheService.Ensure(chapterId); if (chapter == null) return BadRequest("There was an issue finding image file for reading"); + + // TODO: This code works, but might need bounds checking. UI can send bad data + // if (page >= chapter.Pages) + // { + // page = chapter.Pages - 1; + // } else if (page < 0) + // { + // page = 0; + // } var (path, mangaFile) = await _cacheService.GetCachedPagePath(chapter, page); if (string.IsNullOrEmpty(path)) return BadRequest($"No such image for page {page}"); var file = await _directoryService.ReadImageAsync(path); file.Page = page; file.MangaFileName = mangaFile.FilePath; + file.NeedsSplitting = file.Width > file.Height; return Ok(file); } diff --git a/API/Services/CacheService.cs b/API/Services/CacheService.cs index 1092c57c1..a37812f53 100644 --- a/API/Services/CacheService.cs +++ b/API/Services/CacheService.cs @@ -106,12 +106,18 @@ namespace API.Services var chapterFiles = chapter.Files ?? await _unitOfWork.VolumeRepository.GetFilesForChapter(chapter.Id); foreach (var mangaFile in chapterFiles) { - if (page < (mangaFile.NumberOfPages + pagesSoFar)) + if (page <= (mangaFile.NumberOfPages + pagesSoFar)) { var path = GetCachePath(chapter.Id); var files = _directoryService.GetFiles(path, Parser.Parser.ImageFileExtensions); Array.Sort(files, _numericComparer); + // Since array is 0 based, we need to keep that in account (only affects last image) + if (page - 1 == files.Length) + { + return (files.ElementAt(page - 1 - pagesSoFar), mangaFile); + } + return (files.ElementAt(page - pagesSoFar), mangaFile); } From 852317d3a6f0aef514f0807b4a81ef2b4609958b Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Fri, 12 Feb 2021 17:56:21 -0600 Subject: [PATCH 4/6] Fixed an off by 1 issue with reading manga (for real now) --- API/Services/CacheService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/API/Services/CacheService.cs b/API/Services/CacheService.cs index a37812f53..b7b46e86f 100644 --- a/API/Services/CacheService.cs +++ b/API/Services/CacheService.cs @@ -113,7 +113,7 @@ namespace API.Services Array.Sort(files, _numericComparer); // Since array is 0 based, we need to keep that in account (only affects last image) - if (page - 1 == files.Length) + if (page == files.Length) { return (files.ElementAt(page - 1 - pagesSoFar), mangaFile); } From 2887fab53f135017b9b9903ce1c3850f283c45a4 Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Mon, 15 Feb 2021 13:08:30 -0600 Subject: [PATCH 5/6] Implements search functionality and prepares for upcoming paging in v0.3. --- API/Controllers/LibraryController.cs | 27 +++++++++++++++++++++++- API/DTOs/ImageDto.cs | 3 ++- API/DTOs/SearchQueryDto.cs | 2 +- API/DTOs/SearchResultDto.cs | 9 ++++++++ API/Data/LibraryRepository.cs | 9 ++++++++ API/Data/SeriesRepository.cs | 25 ++++++++++++++++++++-- API/Data/UnitOfWork.cs | 7 +++++-- API/Entities/FTSSeries.cs | 14 +++++++++++++ API/Entities/Series.cs | 1 + API/Extensions/HttpExtensions.cs | 16 +++++++++++--- API/Helpers/AutoMapperProfiles.cs | 7 +++++++ API/Helpers/PagedList.cs | 31 +++++++++++++++++++++++++--- API/Helpers/PaginationHeader.cs | 13 +++++++++++- API/Helpers/UserParams.cs | 10 ++++++++- API/Interfaces/ILibraryRepository.cs | 1 + API/Interfaces/ISeriesRepository.cs | 12 +++++++++++ API/Services/MetadataService.cs | 2 ++ 17 files changed, 174 insertions(+), 15 deletions(-) create mode 100644 API/Entities/FTSSeries.cs diff --git a/API/Controllers/LibraryController.cs b/API/Controllers/LibraryController.cs index b068ffa0b..eda23081d 100644 --- a/API/Controllers/LibraryController.cs +++ b/API/Controllers/LibraryController.cs @@ -2,14 +2,18 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Text; using System.Threading.Tasks; +using API.Data; using API.DTOs; using API.Entities; using API.Extensions; +using API.Helpers; using API.Interfaces; using AutoMapper; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; namespace API.Controllers @@ -22,16 +26,18 @@ namespace API.Controllers private readonly IMapper _mapper; private readonly ITaskScheduler _taskScheduler; private readonly IUnitOfWork _unitOfWork; + private readonly DataContext _dataContext; // TODO: Remove, only for FTS prototyping public LibraryController(IDirectoryService directoryService, ILogger logger, IMapper mapper, ITaskScheduler taskScheduler, - IUnitOfWork unitOfWork) + IUnitOfWork unitOfWork, DataContext dataContext) { _directoryService = directoryService; _logger = logger; _mapper = mapper; _taskScheduler = taskScheduler; _unitOfWork = unitOfWork; + _dataContext = dataContext; } /// @@ -213,5 +219,24 @@ namespace API.Controllers return Ok(); } + + [HttpGet("search")] + public async Task>> Search(string queryString) + { + //NOTE: What about normalizing search query and only searching against normalizedname in Series? + // So One Punch would match One-Punch + // This also means less indexes we need. + queryString = queryString.Replace(@"%", ""); + + var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync(User.GetUsername()); + // Get libraries user has access to + var libraries = (await _unitOfWork.LibraryRepository.GetLibrariesForUserIdAsync(user.Id)).ToList(); + + if (!libraries.Any()) return BadRequest("User does not have access to any libraries"); + + var series = await _unitOfWork.SeriesRepository.SearchSeries(libraries.Select(l => l.Id).ToArray(), queryString); + + return Ok(series); + } } } \ No newline at end of file diff --git a/API/DTOs/ImageDto.cs b/API/DTOs/ImageDto.cs index 18ffe7178..6e3f0ae7c 100644 --- a/API/DTOs/ImageDto.cs +++ b/API/DTOs/ImageDto.cs @@ -9,7 +9,8 @@ public int Height { get; init; } public string Format { get; init; } public byte[] Content { get; init; } - public int Chapter { get; set; } + //public int Chapter { get; set; } public string MangaFileName { get; set; } + public bool NeedsSplitting { get; set; } } } \ No newline at end of file diff --git a/API/DTOs/SearchQueryDto.cs b/API/DTOs/SearchQueryDto.cs index ea31a9266..b637f952b 100644 --- a/API/DTOs/SearchQueryDto.cs +++ b/API/DTOs/SearchQueryDto.cs @@ -2,6 +2,6 @@ { public class SearchQueryDto { - + public string QueryString { get; init; } } } \ No newline at end of file diff --git a/API/DTOs/SearchResultDto.cs b/API/DTOs/SearchResultDto.cs index 89c5bd349..3e154d3b7 100644 --- a/API/DTOs/SearchResultDto.cs +++ b/API/DTOs/SearchResultDto.cs @@ -2,6 +2,15 @@ { public class SearchResultDto { + public int SeriesId { get; init; } + public string Name { get; init; } + public string OriginalName { get; init; } + public string SortName { get; init; } + public byte[] CoverImage { get; init; } // This should be optional or a thumbImage (much smaller) + + // Grouping information + public string LibraryName { get; set; } + public int LibraryId { get; set; } } } \ No newline at end of file diff --git a/API/Data/LibraryRepository.cs b/API/Data/LibraryRepository.cs index 9fe73a193..80dbbb553 100644 --- a/API/Data/LibraryRepository.cs +++ b/API/Data/LibraryRepository.cs @@ -60,6 +60,15 @@ namespace API.Data return await _context.SaveChangesAsync() > 0; } + public async Task> GetLibrariesForUserIdAsync(int userId) + { + return await _context.Library + .Include(l => l.AppUsers) + .Where(l => l.AppUsers.Select(ap => ap.Id).Contains(userId)) + .AsNoTracking() + .ToListAsync(); + } + public async Task> GetLibraryDtosAsync() { return await _context.Library diff --git a/API/Data/SeriesRepository.cs b/API/Data/SeriesRepository.cs index e682648a6..8c41adfd2 100644 --- a/API/Data/SeriesRepository.cs +++ b/API/Data/SeriesRepository.cs @@ -9,6 +9,7 @@ using API.Interfaces; using AutoMapper; using AutoMapper.QueryableExtensions; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; namespace API.Data { @@ -16,11 +17,13 @@ namespace API.Data { private readonly DataContext _context; private readonly IMapper _mapper; + private readonly ILogger _logger; - public SeriesRepository(DataContext context, IMapper mapper) + public SeriesRepository(DataContext context, IMapper mapper, ILogger logger) { _context = context; _mapper = mapper; + _logger = logger; } public void Add(Series series) @@ -74,7 +77,25 @@ namespace API.Data await AddSeriesModifiers(userId, series); - Console.WriteLine("Processed GetSeriesDtoForLibraryIdAsync in {0} milliseconds", sw.ElapsedMilliseconds); + _logger.LogDebug("Processed GetSeriesDtoForLibraryIdAsync in {ElapsedMilliseconds} milliseconds", sw.ElapsedMilliseconds); + return series; + } + + public async Task> SearchSeries(int[] libraryIds, string searchQuery) + { + var sw = Stopwatch.StartNew(); + var series = await _context.Series + .Where(s => libraryIds.Contains(s.LibraryId)) + .Where(s => EF.Functions.Like(s.Name, $"%{searchQuery}%") + || EF.Functions.Like(s.OriginalName, $"%{searchQuery}%")) + .Include(s => s.Library) // NOTE: Is there a way to do this faster? + .OrderBy(s => s.SortName) + .AsNoTracking() + .ProjectTo(_mapper.ConfigurationProvider) + .ToListAsync(); + + + _logger.LogDebug("Processed SearchSeries in {ElapsedMilliseconds} milliseconds", sw.ElapsedMilliseconds); return series; } diff --git a/API/Data/UnitOfWork.cs b/API/Data/UnitOfWork.cs index 6cffc1392..4b8ffac81 100644 --- a/API/Data/UnitOfWork.cs +++ b/API/Data/UnitOfWork.cs @@ -3,6 +3,7 @@ using API.Entities; using API.Interfaces; using AutoMapper; using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.Logging; namespace API.Data { @@ -11,15 +12,17 @@ namespace API.Data private readonly DataContext _context; private readonly IMapper _mapper; private readonly UserManager _userManager; + private readonly ILogger _seriesLogger; - public UnitOfWork(DataContext context, IMapper mapper, UserManager userManager) + public UnitOfWork(DataContext context, IMapper mapper, UserManager userManager, ILogger seriesLogger) { _context = context; _mapper = mapper; _userManager = userManager; + _seriesLogger = seriesLogger; } - public ISeriesRepository SeriesRepository => new SeriesRepository(_context, _mapper); + public ISeriesRepository SeriesRepository => new SeriesRepository(_context, _mapper, _seriesLogger); public IUserRepository UserRepository => new UserRepository(_context, _userManager); public ILibraryRepository LibraryRepository => new LibraryRepository(_context, _mapper); diff --git a/API/Entities/FTSSeries.cs b/API/Entities/FTSSeries.cs new file mode 100644 index 000000000..a9c207ce2 --- /dev/null +++ b/API/Entities/FTSSeries.cs @@ -0,0 +1,14 @@ +namespace API.Entities +{ + public class FTSSeries + { + public int RowId { get; set; } + public Series Series { get; set; } + + public string Name { get; set; } + public string OriginalName { get; set; } + + public string Match { get; set; } + public double? Rank { get; set; } + } +} \ No newline at end of file diff --git a/API/Entities/Series.cs b/API/Entities/Series.cs index ddc9a3b61..a0f7b119c 100644 --- a/API/Entities/Series.cs +++ b/API/Entities/Series.cs @@ -30,6 +30,7 @@ namespace API.Entities public DateTime Created { get; set; } public DateTime LastModified { get; set; } public byte[] CoverImage { get; set; } + // NOTE: Do I want to store a thumbImage for search results? /// /// Sum of all Volume page counts /// diff --git a/API/Extensions/HttpExtensions.cs b/API/Extensions/HttpExtensions.cs index b930e2652..5a4b4238d 100644 --- a/API/Extensions/HttpExtensions.cs +++ b/API/Extensions/HttpExtensions.cs @@ -1,7 +1,17 @@ -namespace API.Extensions +using System.Text.Json; +using API.Helpers; +using Microsoft.AspNetCore.Http; + +namespace API.Extensions { - public class HttpExtensions + public static class HttpExtensions { - + public static void AddPaginationHeader(this HttpResponse response, int currentPage, + int itemsPerPage, int totalItems, int totalPages) + { + var paginationHeader = new PaginationHeader(currentPage, itemsPerPage, totalItems, totalPages); + response.Headers.Add("Pagination", JsonSerializer.Serialize(paginationHeader)); + response.Headers.Add("Access-Control-Expose-Headers", "Pagination"); + } } } \ No newline at end of file diff --git a/API/Helpers/AutoMapperProfiles.cs b/API/Helpers/AutoMapperProfiles.cs index 4994cbb0d..f5d670b59 100644 --- a/API/Helpers/AutoMapperProfiles.cs +++ b/API/Helpers/AutoMapperProfiles.cs @@ -22,6 +22,13 @@ namespace API.Helpers CreateMap(); CreateMap(); + + CreateMap() + .ForMember(dest => dest.SeriesId, + opt => opt.MapFrom(src => src.Id)) + .ForMember(dest => dest.LibraryName, + opt => opt.MapFrom(src => src.Library.Name)); + CreateMap() .ForMember(dest => dest.Folders, diff --git a/API/Helpers/PagedList.cs b/API/Helpers/PagedList.cs index b5a8fae03..0900f02a5 100644 --- a/API/Helpers/PagedList.cs +++ b/API/Helpers/PagedList.cs @@ -1,7 +1,32 @@ -namespace API.Helpers +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; + +namespace API.Helpers { - public class PagedList + public class PagedList : List { - + public PagedList(IEnumerable items, int count, int pageNumber, int pageSize) + { + CurrentPage = pageNumber; + TotalPages = (int) Math.Ceiling(count / (double) pageSize); + PageSize = pageSize; + TotalCount = count; + AddRange(items); + } + + public int CurrentPage { get; set; } + public int TotalPages { get; set; } + public int PageSize { get; set; } + public int TotalCount { get; set; } + + public static async Task> CreateAsync(IQueryable source, int pageNumber, int pageSize) + { + var count = await source.CountAsync(); + var items = await source.Skip((pageNumber - 1) * pageSize).Take(pageSize).ToListAsync(); + return new PagedList(items, count, pageNumber, pageSize); + } } } \ No newline at end of file diff --git a/API/Helpers/PaginationHeader.cs b/API/Helpers/PaginationHeader.cs index ea0140d4c..8d24eeca0 100644 --- a/API/Helpers/PaginationHeader.cs +++ b/API/Helpers/PaginationHeader.cs @@ -2,6 +2,17 @@ { public class PaginationHeader { - + public PaginationHeader(int currentPage, int itemsPerPage, int totalItems, int totalPages) + { + CurrentPage = currentPage; + ItemsPerPage = itemsPerPage; + TotalItems = totalItems; + TotalPages = totalPages; + } + + public int CurrentPage { get; set; } + public int ItemsPerPage { get; set; } + public int TotalItems { get; set; } + public int TotalPages { get; set; } } } \ No newline at end of file diff --git a/API/Helpers/UserParams.cs b/API/Helpers/UserParams.cs index a6aa2d304..344738f6d 100644 --- a/API/Helpers/UserParams.cs +++ b/API/Helpers/UserParams.cs @@ -2,6 +2,14 @@ { public class UserParams { - + private const int MaxPageSize = 50; + public int PageNumber { get; set; } = 1; + private int _pageSize = 10; + + public int PageSize + { + get => _pageSize; + set => _pageSize = (value > MaxPageSize) ? MaxPageSize : value; + } } } \ No newline at end of file diff --git a/API/Interfaces/ILibraryRepository.cs b/API/Interfaces/ILibraryRepository.cs index 3955355f2..43e0db6e6 100644 --- a/API/Interfaces/ILibraryRepository.cs +++ b/API/Interfaces/ILibraryRepository.cs @@ -16,5 +16,6 @@ namespace API.Interfaces Task> GetLibraryDtosForUsernameAsync(string userName); Task> GetLibrariesAsync(); Task DeleteLibrary(int libraryId); + Task> GetLibrariesForUserIdAsync(int userId); } } \ No newline at end of file diff --git a/API/Interfaces/ISeriesRepository.cs b/API/Interfaces/ISeriesRepository.cs index 6b11ecb8f..92c4d2431 100644 --- a/API/Interfaces/ISeriesRepository.cs +++ b/API/Interfaces/ISeriesRepository.cs @@ -11,7 +11,19 @@ namespace API.Interfaces void Update(Series series); Task GetSeriesByNameAsync(string name); Series GetSeriesByName(string name); + /// + /// Adds user information like progress, ratings, etc + /// + /// + /// + /// Task> GetSeriesDtoForLibraryIdAsync(int libraryId, int userId); + /// + /// Does not add user information like progress, ratings, etc. + /// + /// + /// + Task> SearchSeries(int[] libraryIds, string searchQuery); Task> GetSeriesForLibraryIdAsync(int libraryId); Task> GetVolumesDtoAsync(int seriesId, int userId); IEnumerable GetVolumes(int seriesId); diff --git a/API/Services/MetadataService.cs b/API/Services/MetadataService.cs index 589bdc49c..4ae9f5723 100644 --- a/API/Services/MetadataService.cs +++ b/API/Services/MetadataService.cs @@ -52,6 +52,8 @@ namespace API.Services public void UpdateMetadata(Series series, bool forceUpdate) { + // TODO: this doesn't actually invoke finding a new cover. Also all these should be groupped ideally so we limit + // disk I/O to one method. if (series == null) return; if (ShouldFindCoverImage(series.CoverImage, forceUpdate)) { From 63fe1cb9ef5de6d81dfc1b3008fd3cb98336693f Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Mon, 15 Feb 2021 13:09:30 -0600 Subject: [PATCH 6/6] Implements search functionality and prepares for upcoming paging in v0.3. --- API/Entities/FTSSeries.cs | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 API/Entities/FTSSeries.cs diff --git a/API/Entities/FTSSeries.cs b/API/Entities/FTSSeries.cs deleted file mode 100644 index a9c207ce2..000000000 --- a/API/Entities/FTSSeries.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace API.Entities -{ - public class FTSSeries - { - public int RowId { get; set; } - public Series Series { get; set; } - - public string Name { get; set; } - public string OriginalName { get; set; } - - public string Match { get; set; } - public double? Rank { get; set; } - } -} \ No newline at end of file