public async Task <IActionResult> GetFilteredListings() { var filterRequest = new FilterRequest { minPrice = Request.Form["minPrice"].ToString(), maxPrice = Request.Form["maxPrice"].ToString(), neighbourhood = Request.Form["neighbourhood"].ToString(), minReviewRate = Request.Form["minReviewRate"].ToString(), }; var result = _validator.Validate(filterRequest); if (result.IsValid == false) { return(BadRequest(Newtonsoft.Json.JsonConvert.SerializeObject( new { errors = result.Errors.Select(e => e.ErrorMessage).ToList() }) )); } var filter = filterRequest.GetFilter(); var key = $"FilteredMapResponse-{filter.minPrice}-{filter.maxPrice}-{filter.neighbourhood}-{filter.minReviewRate}"; var cacheItem = await _cache.Get(key); if (cacheItem != null) { return(Ok(cacheItem)); } var listings = _listingsRepo.Filter(filter); var calendar = _calendarRepo.Join(listings); var geoJson = await GeoJson.Create(listings); var totalLocations = listings.Count(); var staysPerMonth = calendar.Count(); var collectionPerMonth = calendar.Sum(c => c.Price); var response = Newtonsoft.Json.JsonConvert.SerializeObject( new { geoJson, staysPerMonth, collectionPerMonth, totalLocations } ); _cache.Set(key, response); return(Ok(response)); }