Example #1
0
        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));
        }