コード例 #1
0
        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);
        }
コード例 #2
0
        //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));
        }
コード例 #3
0
        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);
        }