コード例 #1
0
        public async Task <ActionResult <IEnumerable <PlaceResponse> > > GetPlaces([FromQuery] PlacesParameters parameters)
        {
            var places = await _context.Places
                         .Include(p => p.PlaceType)
                         .Include(p => p.OpeningTimes)
                         .Include(p => p.Reviews)
                         .Include(p => p.Owners)
                         .Include(p => p.Images)
                         .ToListAsync();

            var placesFiltered = places.Where(p => MatchesPlaceFilter(p, parameters));

            var placeResponses = _mapper.Map <List <PlaceResponse> >(placesFiltered);

            foreach (var place in placeResponses)
            {
                place.UserIsOwner = IsAuthorized(place.ID);
            }

            var placesSorted = placeResponses.Sort(parameters.OrderBy);

            var placesPaged = PagedList <PlaceResponse> .ToPagedList(placesSorted, parameters.PageNumber, parameters.PageSize);

            Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(placesPaged.Metadata));

            return(placesPaged);
        }
コード例 #2
0
        private bool MatchesPlaceFilter(Place p, PlacesParameters parameters)
        {
            bool matchingCity = string.IsNullOrEmpty(parameters.City)
                ? true
                : p.City.Equals(parameters.City, StringComparison.OrdinalIgnoreCase);

            if (!matchingCity)
            {
                return(false);
            }

            bool matchingCountry = string.IsNullOrEmpty(parameters.Country)
                ? true
                : p.Country.Equals(parameters.Country, StringComparison.OrdinalIgnoreCase);

            if (!matchingCountry)
            {
                return(false);
            }

            bool matchingVerified = parameters.IsVerified.HasValue
                ? p.IsVerified == parameters.IsVerified.Value
                : true;

            if (!matchingVerified)
            {
                return(false);
            }

            bool matchingName = string.IsNullOrEmpty(parameters.Name)
                ? true
                : parameters.Name.Split(' ').All(s => p.Name.Contains(s, StringComparison.OrdinalIgnoreCase));

            if (!matchingName)
            {
                return(false);
            }

            var avgRating = p.Reviews.Count > 0
                ? p.Reviews.Average(r => r.Rating)
                : 0;

            bool matchingMinRating = parameters.MinRating.HasValue
                ? parameters.MinRating <= avgRating
                : true;

            if (!matchingMinRating)
            {
                return(false);
            }

            bool matchingMaxRating = parameters.MaxRating.HasValue
                ? parameters.MaxRating >= avgRating
                : true;

            if (!matchingMaxRating)
            {
                return(false);
            }

            bool matchingPlaceType = parameters.PlaceType.Count > 0
                ? parameters.PlaceType.Contains(p.PlaceType.ID)
                : true;

            if (!matchingPlaceType)
            {
                return(false);
            }

            var now   = DateTime.Now.TimeOfDay;
            var today = (int)(DateTime.Today.DayOfWeek + 6) % 7;


            // value, no opening times => no
            // value, opening times => check
            // _ => ok

            bool matchingIsOpen = true;

            if (parameters.IsOpen.HasValue && p.OpeningTimes.Count == 0)
            {
                matchingIsOpen = false;
            }

            if (parameters.IsOpen.HasValue && p.OpeningTimes.Count > 0)
            {
                var open = p.OpeningTimes.Any(ot =>
                                              ot.Day == today &&
                                              ot.Open <now &&
                                                       ot.Close> now);

                matchingIsOpen = (parameters.IsOpen.Value)
                    ? open
                    : !open;
            }

            if (!matchingIsOpen)
            {
                return(false);
            }

            return(true);
        }
コード例 #3
0
 public void Setup()
 {
     _sut = new PlacesParameters(new Places());
 }