public async Task OnGetAsync( [FromQuery] IList <long> tags, [FromQuery] string q = null, [FromQuery] EStorySortingOptions sort = EStorySortingOptions.DateDescending, [FromQuery] long?rating = null, [FromQuery] int page = 1 ) { SearchBy = q; SortBy = sort; Rating = rating; Tags = tags; // Load ratings Ratings = await _context.Ratings.ToListAsync(); // Load stories Stories = await _storiesRepo.SearchAndSortStoryCards(_config.StoriesPerPage, page, tags, q, rating, sort); // Prepare pagination Pagination = new Pagination { PerPage = _config.StoriesPerPage, ItemCount = await _storiesRepo.CountSearchResults(tags, q, rating), CurrentPage = page }; }
/// <summary> /// Get `StoryCard` objects, sorted according to `EStorySortingOptions` and paginated /// </summary> /// <param name="count">Number of objects</param> /// <param name="sort">Sorting method</param> /// <returns>Sorted and paginated list of `StoryCard` objects</returns> public async Task <List <StoryCard> > GetTopStoryCards(int count, EStorySortingOptions sort = EStorySortingOptions.DateDescending) { return(await _context.Stories .TagWith($"{nameof(StoriesRepository)}.{nameof(GetTopStoryCards)} -> {count}, {sort}") .Where(b => b.IsPublished) .Where(b => b.ContentBlockId == null) .Blacklist(_context, _uid) .SortByEnum(sort) .Take(count) .ProjectTo <StoryCard>(_mapper.ConfigurationProvider) .AsNoTracking() .ToListAsync()); }
public static IQueryable <Story> SortByEnum(this IQueryable <Story> query, EStorySortingOptions order) { return(order switch { EStorySortingOptions.TitleAscending => query.OrderBy(s => s.Title), EStorySortingOptions.TitleDescending => query.OrderByDescending(s => s.Title), EStorySortingOptions.DateAscending => query.OrderBy(s => s.ReleaseDate), EStorySortingOptions.DateDescending => query.OrderByDescending(s => s.ReleaseDate), EStorySortingOptions.WordsAscending => query.OrderBy(s => s.WordCount), EStorySortingOptions.WordsDescending => query.OrderByDescending(s => s.WordCount), EStorySortingOptions.ScoreAscending => query.OrderBy(s => s.Votes.Count), EStorySortingOptions.ScoreDescending => query.OrderByDescending(s => s.Votes.Count), EStorySortingOptions.UpdatedAscending => query.OrderBy(s => s.Chapters.OrderBy(c => c.PublishDate).First().PublishDate), EStorySortingOptions.UpdatedDescending => query.OrderByDescending(s => s.Chapters.OrderBy(c => c.PublishDate).First().PublishDate), _ => query.OrderByDescending(s => s.ReleaseDate) });
/// <summary> /// Get published `StoryCard` objects, sorted according to `EStorySortingOptions` /// and paginated, with a blacklist applied /// </summary> /// <param name="perPage">Number of objects per page</param> /// <param name="page">Number of the desired page</param> /// <param name="authorId">ID of the author whose stories are to be fetched</param> /// <param name="sort">Sorting method</param> /// <returns>Sorted and paginated list of `StoryCard` objects</returns> public async Task <List <StoryCard> > GetAndSortPaginatedStoryCards( int perPage, int page, long authorId, EStorySortingOptions sort = EStorySortingOptions.DateDescending ) { return(await _context.Stories .TagWith($"{nameof(StoriesRepository)}.{nameof(GetAndSortPaginatedStoryCards)} -> {perPage}, {page}, {authorId}, {sort}") .Where(b => b.IsPublished) .Where(b => b.ContentBlockId == null) .Where(b => b.AuthorId == authorId) .Blacklist(_context, _uid) .SortByEnum(sort) .Paginate(page, perPage) .ProjectTo <StoryCard>(_mapper.ConfigurationProvider) .AsNoTracking() .ToListAsync()); }
/// <summary> /// Get `StoryCard` objects, sorted according to `EStorySortingOptions`, filtered, and paginated /// </summary> /// <param name="perPage">Number of objects per page</param> /// <param name="page">Number of the desired page</param> /// <param name="tags">Tags to search by</param> /// <param name="searchQuery">Query to search the titles by</param> /// <param name="ratingId">Rating to filter by</param> /// <param name="sort">Sorting method</param> /// <returns>Sorted, filtered, and paginated list of `StoryCard` objects</returns> public async Task <List <StoryCard> > SearchAndSortStoryCards( int perPage, int page, IList <long>?tags = null, string?searchQuery = null, long?ratingId = null, EStorySortingOptions sort = EStorySortingOptions.DateDescending ) { return(await Search(tags, searchQuery, ratingId) .TagWith($"{nameof(StoriesRepository)}.{nameof(SearchAndSortStoryCards)} -> {perPage}, {page}, {searchQuery}. {ratingId}, {sort}") .Where(b => b.IsPublished) .Where(b => b.ContentBlockId == null) .Blacklist(_context, _uid) .SortByEnum(sort) .Paginate(page, perPage) .ProjectTo <StoryCard>(_mapper.ConfigurationProvider) .AsNoTracking() .ToListAsync()); }
public async Task OnGetAsync( [FromQuery] IList <long> tags, [FromQuery] string q = null, [FromQuery] EStorySortingOptions sort = EStorySortingOptions.DateDescending, [FromQuery] long?rating = null, [FromQuery] int page = 1 ) { var uid = User.GetNumericId(); SearchBy = q; SortBy = sort; Rating = rating; Tags = tags; // Load ratings Ratings = await _context.Ratings.ToListAsync(); // Load stories var query = _context.Stories .AsQueryable() .Search(tags, q, rating) .Where(b => b.IsPublished) .Where(b => b.ContentBlockId == null) .Blacklist(_context, uid); Stories = await query .SortByEnum(sort) .Paginate(page, _config.StoriesPerPage) .ProjectTo <StoryCard>(_mapper.ConfigurationProvider) .AsNoTracking() .ToListAsync(); // Prepare pagination Pagination = new Pagination { PerPage = _config.StoriesPerPage, ItemCount = await query.CountAsync(), CurrentPage = page }; }