//TODO: sort by //TODO: pagination public async Task <IActionResult> Featured( SchoolingEventFilterViewModel filter, [FromQuery(Name = "TagValues[]")] IEnumerable <string> tagValues, SchoolingEventSortType sort, int page = 0, int pageSize = 10) { filter.TagValues = tagValues; var entities = await _schoolingEventService.GetFeaturedEvents(filter, sort, page, pageSize); return(Response(entities)); }
public async Task <IEnumerable <FeaturedSchoolingEventViewModel> > GetFeaturedEvents(SchoolingEventFilterViewModel filter, SchoolingEventSortType sort, int page, int pageSize) { var featuredEventsQuery = _schoolingEventRepository .GetAll() .Where(e => e.IsPublic); if (filter != null) { featuredEventsQuery = ApplyFilters(featuredEventsQuery, filter); } if (sort != SchoolingEventSortType.None) { featuredEventsQuery = ApplySort(featuredEventsQuery, sort); } featuredEventsQuery = featuredEventsQuery .Skip(page * pageSize) .Take(pageSize); var vm = await featuredEventsQuery.ProjectTo <FeaturedSchoolingEventViewModel>().ToListAsync(); if (_user.IsAuthenticated()) { var currentUserId = _user.Id; foreach (var eventViewModel in vm) { eventViewModel.IsFollowing = await _schoolingEventRepository.IsUserFollowingEvent(currentUserId, eventViewModel.Id); eventViewModel.HasCreated = eventViewModel.CreatedByUserId == _user.Id; } } return(vm); }
private IQueryable <SchoolingEvent> ApplySort(IQueryable <SchoolingEvent> query, SchoolingEventSortType sort) { Expression <Func <SchoolingEvent, decimal> > minTicketPricePredicate = e => e.AvailableTickets.Any() ? e.AvailableTickets.Min(t => t.Price) : decimal.MaxValue; switch (sort) { case SchoolingEventSortType.TicketPriceAscending: query = query.OrderBy(minTicketPricePredicate); break; case SchoolingEventSortType.TicketPriceDescending: query = query.OrderByDescending(minTicketPricePredicate); break; } return(query); }