From f26b68351cd672cbc46a3334c584f021323b7897 Mon Sep 17 00:00:00 2001 From: Amelia <77553571+Fesaa@users.noreply.github.com> Date: Tue, 24 Jun 2025 15:49:40 +0200 Subject: [PATCH] Simply code, moving to my PC --- API/Data/Repositories/GenreRepository.cs | 75 ++++++------------ API/Data/Repositories/PersonRepository.cs | 79 ++++++------------- API/Data/Repositories/TagRepository.cs | 73 ++++++----------- .../RestrictByLibraryExtensions.cs | 7 +- 4 files changed, 74 insertions(+), 160 deletions(-) diff --git a/API/Data/Repositories/GenreRepository.cs b/API/Data/Repositories/GenreRepository.cs index 3c7200530..cbf758e2b 100644 --- a/API/Data/Repositories/GenreRepository.cs +++ b/API/Data/Repositories/GenreRepository.cs @@ -174,59 +174,32 @@ public class GenreRepository : IGenreRepository var ageRating = await _context.AppUser.GetUserAgeRestriction(userId); var allLibrariesCount = await _context.Library.CountAsync(); - var userLibs = await _context.Library - .Includes(LibraryIncludes.AppUser) - .Where(lib => lib.AppUsers.Any(user => user.Id == userId)) - .Select(lib => lib.Id) - .ToListAsync(); + var userLibs = await _context.Library.GetUserLibraries(userId).ToListAsync(); - var query = _context.Genre.RestrictAgainstAgeRestriction(ageRating); + var seriesIds = await _context.Series.Where(s => userLibs.Contains(s.LibraryId)).Select(s => s.Id).ToListAsync(); - IQueryable finalQuery; - var seriesIds = _context.Series.Where(s => userLibs.Contains(s.LibraryId)).Select(s => s.Id); - if (allLibrariesCount != userLibs.Count) - { + var query = _context.Genre + .RestrictAgainstAgeRestriction(ageRating) + .WhereIf(allLibrariesCount != userLibs.Count, + genre => genre.Chapters.Any(cp => seriesIds.Contains(cp.Volume.SeriesId)) || + genre.SeriesMetadatas.Any(sm => seriesIds.Contains(sm.SeriesId))) + .Select(g => new BrowseGenreDto + { + Id = g.Id, + Title = g.Title, + SeriesCount = g.SeriesMetadatas + .Where(sm => allLibrariesCount == userLibs.Count || seriesIds.Contains(sm.SeriesId)) + .RestrictAgainstAgeRestriction(ageRating) + .Distinct() + .Count(), + ChapterCount = g.Chapters + .Where(cp => allLibrariesCount == userLibs.Count || seriesIds.Contains(cp.Volume.SeriesId)) + .RestrictAgainstAgeRestriction(ageRating) + .Distinct() + .Count(), + }) + .OrderBy(g => g.Title); - query = query.Where(s => s.Chapters.Any(cp => seriesIds.Contains(cp.Volume.SeriesId)) || - s.SeriesMetadatas.Any(sm => seriesIds.Contains(sm.SeriesId))); - - finalQuery = query.Select(g => new BrowseGenreDto - { - Id = g.Id, - Title = g.Title, - SeriesCount = g.SeriesMetadatas - .Where(sm => seriesIds.Contains(sm.SeriesId)) - .RestrictAgainstAgeRestriction(ageRating) - .Distinct() - .Count(), - ChapterCount = g.Chapters - .Where(cp => seriesIds.Contains(cp.Volume.SeriesId)) - .RestrictAgainstAgeRestriction(ageRating) - .Distinct() - .Count() - }) - .OrderBy(g => g.Title); - } - else - { - finalQuery = query.Select(g => new BrowseGenreDto - { - Id = g.Id, - Title = g.Title, - SeriesCount = g.SeriesMetadatas - .RestrictAgainstAgeRestriction(ageRating) - .Distinct() - .Count(), - ChapterCount = g.Chapters - .RestrictAgainstAgeRestriction(ageRating) - .Distinct() - .Count() - }) - .OrderBy(g => g.Title); - } - - - - return await PagedList.CreateAsync(finalQuery, userParams.PageNumber, userParams.PageSize); + return await PagedList.CreateAsync(query, userParams.PageNumber, userParams.PageSize); } } diff --git a/API/Data/Repositories/PersonRepository.cs b/API/Data/Repositories/PersonRepository.cs index 0e03d5b0b..c718f8fdd 100644 --- a/API/Data/Repositories/PersonRepository.cs +++ b/API/Data/Repositories/PersonRepository.cs @@ -216,10 +216,8 @@ public class PersonRepository : IPersonRepository private async Task> CreateFilteredPersonQueryable(int userId, BrowsePersonFilterDto filter, AgeRestriction ageRating) { - var libs = await _context.Library.Includes(LibraryIncludes.AppUser).ToListAsync(); - var libIds = libs.Select(l => l.Id).ToList(); - var userLibs = libs.Where(lib => lib.AppUsers.Any(user => user.Id == userId)).Select(lib => lib.Id).ToList(); - var shouldLibRestrict = libIds.Count != userLibs.Count; + var allLibrariesCount = await _context.Library.CountAsync(); + var userLibs = await _context.Library.GetUserLibraries(userId).ToListAsync(); var seriesIds = await _context.Series.Where(s => userLibs.Contains(s.LibraryId)).Select(s => s.Id).ToListAsync(); @@ -229,64 +227,35 @@ public class PersonRepository : IPersonRepository query = BuildPersonFilterQuery(userId, filter, query); // Apply restrictions - query = query.RestrictAgainstAgeRestriction(ageRating); - - if (shouldLibRestrict) - { - query = query.Where(p => p.ChapterPeople.Any(cp => seriesIds.Contains(cp.Chapter.Volume.SeriesId)) || - p.SeriesMetadataPeople.Any(smp => seriesIds.Contains(smp.SeriesMetadata.SeriesId))); - } + query = query.RestrictAgainstAgeRestriction(ageRating) + .WhereIf(allLibrariesCount != userLibs.Count, + person => person.ChapterPeople.Any(cp => seriesIds.Contains(cp.Chapter.Volume.SeriesId)) || + person.SeriesMetadataPeople.Any(smp => seriesIds.Contains(smp.SeriesMetadata.SeriesId))); // Apply sorting and limiting var sortedQuery = query.SortBy(filter.SortOptions); var limitedQuery = ApplyPersonLimit(sortedQuery, filter.LimitTo); - IQueryable projectedQuery; - if (shouldLibRestrict) + return limitedQuery.Select(p => new BrowsePersonDto { - projectedQuery = limitedQuery.Select(p => new BrowsePersonDto - { - Id = p.Id, - Name = p.Name, - Description = p.Description, - CoverImage = p.CoverImage, - SeriesCount = p.SeriesMetadataPeople - .Select(smp => smp.SeriesMetadata) - .Where(sm => seriesIds.Contains(sm.SeriesId)) - .RestrictAgainstAgeRestriction(ageRating) - .Distinct() - .Count(), - ChapterCount = p.ChapterPeople - .Select(chp => chp.Chapter) - .Where(ch => seriesIds.Contains(ch.Volume.SeriesId)) - .RestrictAgainstAgeRestriction(ageRating) - .Distinct() - .Count() - }); - } - else - { - projectedQuery = limitedQuery.Select(p => new BrowsePersonDto - { - Id = p.Id, - Name = p.Name, - Description = p.Description, - CoverImage = p.CoverImage, - SeriesCount = p.SeriesMetadataPeople - .Select(smp => smp.SeriesMetadata) - .RestrictAgainstAgeRestriction(ageRating) - .Distinct() - .Count(), - ChapterCount = p.ChapterPeople - .Select(chp => chp.Chapter) - .RestrictAgainstAgeRestriction(ageRating) - .Distinct() - .Count() - }); - } - - return projectedQuery; + Id = p.Id, + Name = p.Name, + Description = p.Description, + CoverImage = p.CoverImage, + SeriesCount = p.SeriesMetadataPeople + .Select(smp => smp.SeriesMetadata) + .Where(sm => allLibrariesCount == userLibs.Count || seriesIds.Contains(sm.SeriesId)) + .RestrictAgainstAgeRestriction(ageRating) + .Distinct() + .Count(), + ChapterCount = p.ChapterPeople + .Select(chp => chp.Chapter) + .Where(ch => allLibrariesCount == userLibs.Count || seriesIds.Contains(ch.Volume.SeriesId)) + .RestrictAgainstAgeRestriction(ageRating) + .Distinct() + .Count(), + }); } private static IQueryable BuildPersonFilterQuery(int userId, BrowsePersonFilterDto filterDto, IQueryable query) diff --git a/API/Data/Repositories/TagRepository.cs b/API/Data/Repositories/TagRepository.cs index 976367ed2..474de8163 100644 --- a/API/Data/Repositories/TagRepository.cs +++ b/API/Data/Repositories/TagRepository.cs @@ -111,57 +111,34 @@ public class TagRepository : ITagRepository { var ageRating = await _context.AppUser.GetUserAgeRestriction(userId); - var libs = await _context.Library.Includes(LibraryIncludes.AppUser).ToListAsync(); - var userLibs = libs.Where(lib => lib.AppUsers.Any(user => user.Id == userId)) - .Select(lib => lib.Id).ToList(); + var allLibrariesCount = await _context.Library.CountAsync(); + var userLibs = await _context.Library.GetUserLibraries(userId).ToListAsync(); - var query = _context.Tag.RestrictAgainstAgeRestriction(ageRating); + var seriesIds = _context.Series.Where(s => userLibs.Contains(s.LibraryId)).Select(s => s.Id); - IQueryable finalQuery; - if (userLibs.Count != libs.Count) - { - var seriesIds = _context.Series.Where(s => userLibs.Contains(s.LibraryId)).Select(s => s.Id); - query = query.Where(tag => tag.Chapters.Any(cp => seriesIds.Contains(cp.Volume.SeriesId)) || - tag.SeriesMetadatas.Any(sm => seriesIds.Contains(sm.SeriesId))); + var query = _context.Tag + .RestrictAgainstAgeRestriction(ageRating) + .WhereIf(userLibs.Count != allLibrariesCount, + tag => tag.Chapters.Any(cp => seriesIds.Contains(cp.Volume.SeriesId)) || + tag.SeriesMetadatas.Any(sm => seriesIds.Contains(sm.SeriesId))) + .Select(g => new BrowseTagDto + { + Id = g.Id, + Title = g.Title, + SeriesCount = g.SeriesMetadatas + .Where(sm => allLibrariesCount == userLibs.Count || seriesIds.Contains(sm.SeriesId)) + .RestrictAgainstAgeRestriction(ageRating) + .Distinct() + .Count(), + ChapterCount = g.Chapters + .Where(ch => allLibrariesCount == userLibs.Count || seriesIds.Contains(ch.Volume.SeriesId)) + .RestrictAgainstAgeRestriction(ageRating) + .Distinct() + .Count() + }) + .OrderBy(g => g.Title); - finalQuery = query - .Select(g => new BrowseTagDto - { - Id = g.Id, - Title = g.Title, - SeriesCount = g.SeriesMetadatas - .Where(sm => seriesIds.Contains(sm.SeriesId)) - .RestrictAgainstAgeRestriction(ageRating) - .Distinct() - .Count(), - ChapterCount = g.Chapters - .Where(ch => seriesIds.Contains(ch.Volume.SeriesId)) - .RestrictAgainstAgeRestriction(ageRating) - .Distinct() - .Count() - }) - .OrderBy(g => g.Title); - } - else - { - finalQuery = query - .Select(g => new BrowseTagDto - { - Id = g.Id, - Title = g.Title, - SeriesCount = g.SeriesMetadatas - .RestrictAgainstAgeRestriction(ageRating) - .Distinct() - .Count(), - ChapterCount = g.Chapters - .RestrictAgainstAgeRestriction(ageRating) - .Distinct() - .Count() - }) - .OrderBy(g => g.Title); - } - - return await PagedList.CreateAsync(finalQuery, userParams.PageNumber, userParams.PageSize); + return await PagedList.CreateAsync(query, userParams.PageNumber, userParams.PageSize); } public async Task> GetAllTagsAsync() diff --git a/API/Extensions/QueryExtensions/RestrictByLibraryExtensions.cs b/API/Extensions/QueryExtensions/RestrictByLibraryExtensions.cs index 83ada7892..9ec1b8621 100644 --- a/API/Extensions/QueryExtensions/RestrictByLibraryExtensions.cs +++ b/API/Extensions/QueryExtensions/RestrictByLibraryExtensions.cs @@ -1,14 +1,9 @@ -using System.Collections.Generic; -using System.Linq; +using System.Linq; using API.Entities; using API.Entities.Person; namespace API.Extensions.QueryExtensions; -// TODO: Refactor with IQueryable userLibs? But then I can't do the allLibs check? -/// -/// Optionally pass ids of all libraries, will then be smart and not restrict if the person has access to all -/// public static class RestrictByLibraryExtensions {