Пример #1
0
        public HolidaysWithSpecifications(HolidayParams holidayParams, bool isForCount)
        {
            if (!isForCount)
            {
                AddInclude(x => x.TravelAgency);
                AddInclude(x => x.MealPlan);
                AddInclude(x => x.Country);
                AddInclude(x => x.Photos);
                ApplyPaging(holidayParams.PageSize * (holidayParams.PageIndex - 1), holidayParams.PageSize);
            }

            //filtered by names of Countries/Agencies/Meals

            string[] countriesNames = null;
            string[] agenciesNames  = null;
            string[] mealsNames     = null;

            if (holidayParams.Countries != null)
            {
                countriesNames = holidayParams.Countries.Split(',');
            }

            if (holidayParams.Agencies != null)
            {
                agenciesNames = holidayParams.Agencies.Split(',');
            }

            if (holidayParams.Meals != null)
            {
                mealsNames = holidayParams.Meals.Split(',');
            }

            AddFilters(x => (countriesNames == null || countriesNames.Contains(x.Country.Name)) &&
                       (agenciesNames == null || agenciesNames.Contains(x.TravelAgency.Name)) &&
                       (mealsNames == null || mealsNames.Contains(x.MealPlan.Name)));

            // Min and Max Values filter

            if (holidayParams.MinPrice != null)
            {
                AddFilters(x => x.Price >= holidayParams.MinPrice);
            }

            if (holidayParams.MaxPrice != null)
            {
                AddFilters(x => x.Price <= holidayParams.MaxPrice);
            }

            if (holidayParams.MinDuration != null)
            {
                AddFilters(x => x.DurationOfStay >= holidayParams.MinDuration);
            }

            if (holidayParams.MaxDuration != null)
            {
                AddFilters(x => x.DurationOfStay <= holidayParams.MaxDuration);
            }

            if (holidayParams.MinStars != null)
            {
                AddFilters(x => x.Stars >= holidayParams.MinStars);
            }


            // Sort Type

            AddOrderBy(x => x.HotelName);
            if (!isForCount)
            {
                if (!string.IsNullOrEmpty(holidayParams.Sort))
                {
                    switch (holidayParams.Sort)
                    {
                    case "priceAsc":
                        AddOrderBy(x => x.Price);
                        break;

                    case "priceDesc":
                        AddOrderByDescending(x => x.Price);
                        break;

                    case "durationAsc":
                        AddOrderBy(x => x.DurationOfStay);
                        break;

                    case "durationDesc":
                        AddOrderByDescending(x => x.DurationOfStay);
                        break;

                    case "byIdAsc":
                        AddOrderBy(x => x.Id);
                        break;

                    case "byIdDesc":
                        AddOrderByDescending(x => x.Id);
                        break;

                    default:
                        AddOrderBy(x => x.HotelName);
                        break;
                    }
                }
            }
        }
        public async Task <ActionResult <IReadOnlyList <HolidayToReturnDto> > > GetAllOffers([FromQuery] HolidayParams holidayParams)
        {
            var spec      = new HolidaysWithSpecifications(holidayParams, false);
            var countSpec = new HolidaysWithSpecifications(holidayParams, true);

            var filteredOffers = await _unitOfWork.Holiday.ListWithSpecAsync(spec);

            var filteredOffersCount = await _unitOfWork.Holiday.CountAsync(countSpec);

            var offersToReturn = _mapper.Map <IReadOnlyList <Holiday>, IReadOnlyList <HolidayToReturnDto> >(filteredOffers);

            return(Ok(new Pagination <HolidayToReturnDto>(holidayParams.PageIndex, holidayParams.PageSize, filteredOffersCount, offersToReturn)));
        }