public async Task <WeatherForecastModel> GetForecast(string cityId, string zipCode) { _logger.LogDebug($"Getting forecasts for city ID = {cityId} and zipcode = {zipCode}"); //OpenWeatherMap: We recommend making calls to the API no more than one time every 10 minutes for one location //let's cache the response for 10 minutes WeatherForecastModel weatherForecast; if (!_cache.TryGetValue(String.Format(WeatherCache, cityId, zipCode), out weatherForecast)) { _logger.LogDebug($"Missing cache for city ID = {cityId} and zipcode = {zipCode}"); WeatherForecastModel sixDayForecast = await GetSixDayForecast(cityId, zipCode); //sometimes (after 23.00) the openweathermap api returns five next days but not today //in that case we fill the today's value from another endpoint if (sixDayForecast?.Forecasts.Count() < 6) { AveragedDayForecastModel currentForecast = await GetCurrentForecast(cityId, zipCode); sixDayForecast.Forecasts.Insert(0, currentForecast); } weatherForecast = sixDayForecast; _cache.Set(string.Format(WeatherCache, cityId, zipCode), sixDayForecast, TimeSpan.FromMinutes(10)); } return(weatherForecast); }
private List <AveragedDayForecastModel> GetAveragedSixDayForecast(SixDayForecast fiveDayForecast) { var retval = new List <AveragedDayForecastModel>(); var daysOfForecast = fiveDayForecast.DailyForecastList.Select(x => DateTime.Parse(x.DateTimeText).Date).Distinct(); foreach (var day in daysOfForecast) { var dayForecasts = fiveDayForecast.DailyForecastList.Where(x => DateTime.Parse(x.DateTimeText).Date == day); var averagedDayForecast = new AveragedDayForecastModel() { Date = day, AveragedHumidity = dayForecasts.Average(x => x.WeatherConditions.Humidity), AveragedTemperature = dayForecasts.Average(x => x.WeatherConditions.Temperature), AveragedWind = dayForecasts.Average(x => x.WindStats.Speed) }; retval.Add(averagedDayForecast); } return(retval); }