示例#1
0
        private async Task <ApiResponse <Forecast, Error> > ExecuteQuery(GetForecastByCityNameRequest query)
        {
            string cacheKey = GetCacheKey(query);

            return(await _cache.GetOrCreateAsync(cacheKey, (entry) =>
            {
                entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(3);
                entry.SlidingExpiration = TimeSpan.FromHours(3);
                return _openWeatherMapApiService.GetForecastByCityName(query.CityName);
            }));
        }
示例#2
0
        /// <summary>
        ///     Handle GetForecastByCityNameRequest request
        /// </summary>
        /// <param name="query">query</param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public async Task <QueryResponse <GetForecastByCityNameResponse> > Handle(GetForecastByCityNameRequest query, CancellationToken cancellationToken)
        {
            try
            {
                if (!Validate(query))
                {
                    return(new QueryResponse <GetForecastByCityNameResponse>(MessageType.Validation, new QueryResponseError("Validate", Errors.First())));
                }

                var apiResult = await ExecuteQuery(query);

                if (apiResult.IsSuccessful)
                {
                    var current = apiResult.Response.list.ToList().OrderBy(item => item.dt_txt).First();

                    _userSearchRepository.Add(new UserSearch(query.UserId, apiResult.Response.city.name, current.main.temp, current.main.humidity, DateTime.Now));

                    return(new QueryResponse <GetForecastByCityNameResponse>(
                               new GetForecastByCityNameResponse
                    {
                        Locality = new Locality
                        {
                            CityName = apiResult.Response.city.name,
                            Lat = apiResult.Response.city.coord.lat,
                            Lon = apiResult.Response.city.coord.lon
                        },
                        Forecasts = apiResult.Response.list.ToList()
                                    .GroupBy(item => item.dt_txt.Substring(8, 2))
                                    .Select(group => new DayForecast()
                        {
                            Date = group.Key,
                            Day = DateTime.Parse(group.First().dt_txt).DayOfWeek.ToString(),
                            MinTemp = (int)group.Min(item => item.main.temp_min),
                            MaxTemp = (int)group.Min(item => item.main.temp_max),
                            AvgHumidity = (int)group.Average(item => item.main.humidity),
                            AvgWindSpeed = (int)group.Average(item => item.wind.deg),
                        }).ToList()
                    }));
                }
                else
                {
                    var msgType = apiResult.Error.cod.Equals("404") ? MessageType.NotFound : MessageType.Error;
                    return(new QueryResponse <GetForecastByCityNameResponse>(msgType, new QueryResponseError(apiResult.Error.cod, apiResult.Error.message)));
                }
            }
            catch (Exception ex)
            {
                return(new QueryResponse <GetForecastByCityNameResponse>(MessageType.Error, ex));
            }
        }
示例#3
0
        private bool Validate(GetForecastByCityNameRequest query)
        {
            if (query == null)
            {
                this.Errors.Add("Error: Query parameter is null!");
            }
            else
            {
                if (string.IsNullOrEmpty(query.CityName))
                {
                    this.Errors.Add("Error: CityName is empty!");
                }
                else if (query.CityName.Length < 3)
                {
                    this.Errors.Add("Error: CityName must be at least 3 alphabetic letters!");
                }
                else if (Regex.IsMatch(query.CityName, "[^a-zA-ZöäüÖÄÜß :]"))
                {
                    this.Errors.Add("The CityName can contain only german alphabetic letters and space!");
                }
            }

            return(Errors.Count == 0);
        }