public WeatherConditionModel GetWeatherConditions(string woeid, DateTime?date) { var result = new WeatherConditionModel(); IEnumerable <Repository.External.WeatherCondition> forecasts = null; int languageId = 2; // Russian if (CurrentLang != null) { languageId = CurrentLang.Id; } string key = "s" + woeid + "l" + languageId; try { // Don't us date because we get forecast for all dates of the week just by woeid. if (HttpContext.Current.Cache[woeid] != null) { forecasts = HttpContext.Current.Cache[key] as IEnumerable <Repository.External.WeatherCondition>; if (forecasts.Count() == 0) { forecasts = this._provider.GetWeatherForecastByWoeid(woeid, (languageId == 2) ? _provider.GetUnitsName(Units.Metric) : _provider.GetUnitsName(Units.Imperial)); HttpContext.Current.Cache.Add(key, forecasts, null, DateTime.MaxValue, TimeSpan.FromMinutes(20), CacheItemPriority.High, null); } } else { forecasts = this._provider.GetWeatherForecastByWoeid(woeid, (languageId == 2) ? _provider.GetUnitsName(Units.Metric) : _provider.GetUnitsName(Units.Imperial)); HttpContext.Current.Cache.Add(key, forecasts, null, DateTime.MaxValue, TimeSpan.FromMinutes(20), CacheItemPriority.High, null); } // If date parameter set, then select by date. Repository.External.WeatherCondition selectedConditions = null; if (date.HasValue) { selectedConditions = forecasts.FirstOrDefault(x => x.ForecastDate.HasValue && x.ForecastDate.Value.Date == date.Value.Date); } else { selectedConditions = forecasts.FirstOrDefault(x => !x.IsForecast); } if (selectedConditions != null) { var weatherCondition = ModelAdapter.ConvertTo(selectedConditions); if (weatherCondition != null) { this._dataStore.Insert(weatherCondition); } else { Debug.Assert(false); } result = _Convert(selectedConditions, forecasts, languageId); } } catch (Exception ex) { _logger.Error("Exception API Profile", ex); } return(result); }
/// <summary> /// Converts weather conditions to model for showing. /// </summary> /// <param name="currentConditions">The currentConditions.</param> /// <returns></returns> private WeatherConditionModel _Convert(Repository.External.WeatherCondition currentConditions, IEnumerable <Repository.External.WeatherCondition> forecasts, int languageId) { var result = new WeatherConditionModel(); if (currentConditions == null) { return(result); } if (currentConditions.Condition.HasValue) { var iconName = this._dataStore.GetConditionDescriptionByExtId(currentConditions.Condition.Value, languageId); if (iconName != null) { result.ConditionIcon = iconName.Icon; result.ShortDescription = iconName.ShortDescription; } } var unit = _dataStore.GetUnitByName((languageId == 2) ? UnitSystems.Metric.ToString() : UnitSystems.USA.ToString(), languageId); if (unit != null) { result.TemperatureUnits = unit.Temperature; result.PressureUnits = unit.Pressure; result.LightUnits = unit.Light; result.DistanceUnits = unit.Distance; result.HumidityUnits = unit.Humidity; result.SpeedUnits = unit.Speed; } result.TemperatureMax = currentConditions.TemperatureMax.HasValue ? String.Format(NUMERIC_FORMAT, currentConditions.TemperatureMax.Value) : ZERO; result.TemperatureMin = currentConditions.TemperatureMin.HasValue ? String.Format(NUMERIC_FORMAT, currentConditions.TemperatureMin.Value) : ZERO; result.EffectiveTemperature = currentConditions.EffectiveTemperature.HasValue ? String.Format(NUMERIC_FORMAT, currentConditions.EffectiveTemperature.Value) : ZERO; if (currentConditions.Temperature.HasValue) { result.Temperature = String.Format(NUMERIC_FORMAT, currentConditions.Temperature.Value); } else { // Calculate middle temperature. if (currentConditions.TemperatureMax.HasValue && currentConditions.TemperatureMin.HasValue) { result.Temperature = Convert.ToInt32(((currentConditions.TemperatureMax.Value + currentConditions.TemperatureMin.Value) / 2)).ToString(); } else { result.Temperature = ZERO; } } if (currentConditions.WindSpeed.HasValue) { result.WindSpeed = currentConditions.WindSpeed.Value.ToString(); // https://ru.wikipedia.org/wiki/%D0%A8%D0%BA%D0%B0%D0%BB%D0%B0_%D0%91%D0%BE%D1%84%D0%BE%D1%80%D1%82%D0%B0 result.IsWindy = (currentConditions.WindSpeed.Value >= 29); } else { result.WindSpeed = ZERO; } if (currentConditions.WindDirection.HasValue) { result.WindDirection = Phi.MobileWebApp.Helpers.CommonHelpers.GetWindDirectionByAngle(currentConditions.WindDirection.Value); } else { result.WindDirection = String.Empty; } result.AthmosphereHumidity = currentConditions.AthmosphereHumidity.HasValue ? String.Format(NUMERIC_FORMAT, currentConditions.AthmosphereHumidity.Value) : ZERO; result.AthmospherePressure = currentConditions.AthmospherePressure.HasValue ? String.Format(NUMERIC_FORMAT, currentConditions.AthmospherePressure.Value) : ZERO; result.AthmosphereVisibility = currentConditions.AthmosphereVisibility.HasValue ? String.Format(NUMERIC_FORMAT, currentConditions.AthmosphereVisibility.Value) : ZERO; result.AthmosphereRising = currentConditions.AthmosphereRising.HasValue ? String.Format(NUMERIC_FORMAT, currentConditions.AthmosphereRising.Value) : ZERO; result.IsForecast = currentConditions.IsForecast; result.ForecastDateString = currentConditions.ForecastDateString; if (currentConditions.ForecastDate.HasValue) { result.ForecastDate = currentConditions.ForecastDate.Value; } result.ForecastGuid = currentConditions.ForecastGuid; result.GenerationDateString = currentConditions.GenerationDateString; result.FullDescription = currentConditions.FullDescription; result.Precipitation = currentConditions.Precipitation; result.SeaLevel = currentConditions.SeaLevel.HasValue ? String.Format(NUMERIC_FORMAT, currentConditions.SeaLevel.Value) : ZERO; result.GroundLevel = currentConditions.GroundLevel.HasValue ? String.Format(NUMERIC_FORMAT, currentConditions.GroundLevel.Value) : ZERO; result.Sunrise = currentConditions.Sunrise.HasValue ? DateTimeHelpers.ToShortString(currentConditions.Sunrise.Value, languageId) : ZERO; result.Sunset = currentConditions.Sunset.HasValue ? DateTimeHelpers.ToShortString(currentConditions.Sunset.Value, languageId) : ZERO; // var lang = dataStore.GetLanguageByCode(condition.Language); result.Language = currentConditions.Language; // dataStore.GetLocationByCity(condition.City); result.Location = currentConditions.City; result.Latitude = currentConditions.Latitude; result.Longitude = currentConditions.Longitude; result.DataProviderName = "Hidden"; // Fill values for forecast dates. if (forecasts != null) { foreach (var forecast in forecasts) { if (forecast.ForecastDate.HasValue) { result.Forecasts.Add(_LocalizeWeekDay(forecast.ForecastDateString), forecast.ForecastDate.Value); } } } return(result); }