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); }
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); }
public void Setup() { _sut = new PlacesParameters(new Places()); }