Beispiel #1
0
        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
            };
        }
Beispiel #2
0
 /// <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());
 }
Beispiel #3
0
 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)
     });
Beispiel #4
0
 /// <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());
 }
Beispiel #5
0
 /// <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());
 }
Beispiel #6
0
        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
            };
        }