private IQueryable <SchoolingEvent> ApplyFilters(IQueryable <SchoolingEvent> query, SchoolingEventFilterViewModel filter) { // Date if (filter.DateStart.HasValue) { query = query.Where(e => e.Schedule.Any() && e.Schedule.Min(d => d.Start) >= filter.DateStart.Value); } if (filter.DateEnd.HasValue) { query = query.Where(e => e.Schedule.Any() && e.Schedule.Max(d => d.End) <= filter.DateEnd.Value); } // Price if (filter.PriceFrom.HasValue) { query = query.Where(e => e.AvailableTickets.Any(t => t.Price >= filter.PriceFrom)); } if (filter.PriceTo.HasValue) { query = query.Where(e => e.AvailableTickets.Any(t => t.Price <= filter.PriceTo)); } // Only favorites for current user if (filter.OnlyFavorites.HasValue) { Func <SchoolingEventFollower, bool> followPredicate = f => f.UserId == _user.Id; query = filter.OnlyFavorites.Value ? query.Where(e => e.Followers.Any(f => followPredicate(f))) : query.Where(e => e.Followers.Any(f => !followPredicate(f))); } // Only private for current user if (filter.OnlyPrivate.HasValue) { Func <SchoolingEvent, bool> privatePredicate = e => !e.IsPublic && e.CreatedByUserId == _user.Id; query = filter.OnlyPrivate.Value ? query.Where(e => privatePredicate(e)) : query.Where(e => !privatePredicate(e)); } //Only created by current user if (filter.OnlyMy.HasValue) { Func <SchoolingEvent, bool> onlyMyPredicate = e => e.CreatedByUserId == _user.Id; query = filter.OnlyMy.Value ? query.Where(e => onlyMyPredicate(e)) : query.Where(e => !onlyMyPredicate(e)); } //Tags by its value if (filter.TagValues != null && filter.TagValues.Any()) { query = query.Where(e => e.Schedule.SelectMany(d => d.Tags).Any(t => filter.TagValues.Any(v => v == t.Value))); } return(query); }
//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); }