using System.Linq; using Kavita.Models.DTOs.Filtering; using Kavita.Models.Entities; using Kavita.Models.Entities.User; using Microsoft.EntityFrameworkCore; namespace Kavita.Database.Extensions; public static class BookmarkSortExtensions { /// /// Applies the correct sort based on /// /// /// /// public static IQueryable Sort(this IQueryable query, SortOptions? sortOptions) { // If no sort options, default to using SortName sortOptions ??= new SortOptions() { IsAscending = true, SortField = SortField.SortName }; query = sortOptions.SortField switch { SortField.SortName => query.DoOrderBy(s => s.Series.SortName.ToLower(), sortOptions), SortField.CreatedDate => query.DoOrderBy(s => s.Series.Created, sortOptions), SortField.LastModifiedDate => query.DoOrderBy(s => s.Series.LastModified, sortOptions), SortField.LastChapterAdded => query.DoOrderBy(s => s.Series.LastChapterAdded, sortOptions), SortField.TimeToRead => query.DoOrderBy(s => s.Series.AvgHoursToRead, sortOptions), SortField.ReleaseYear => query.DoOrderBy(s => s.Series.Metadata.ReleaseYear, sortOptions), SortField.ReadProgress => query.DoOrderBy(s => s.Series.Progress.Where(p => p.SeriesId == s.Series.Id).Select(p => p.LastModified).Max(), sortOptions), SortField.AverageRating => query.DoOrderBy(s => s.Series.ExternalSeriesMetadata.ExternalRatings .Where(p => p.SeriesId == s.Series.Id).Average(p => p.AverageScore), sortOptions), SortField.Random => query.DoOrderBy(s => EF.Functions.Random(), sortOptions), _ => query }; return query; } }