Пример #1
0
        public HttpResponseMessage Get(string postcode)
        {
            if (String.IsNullOrEmpty(postcode))
            {
                return(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, string.Format("Postcode must not be null.")));
            }

            var regex = new Regex(Common.Config.PostcodeExpression);
            var match = regex.Match(postcode.ToUpper());

            if (match.Success)
            {
                var postcodeInfo = postcode.Replace(" ", "").ToUpper();

                bool isCacheEnabled;
                bool.TryParse(Common.Config.CacheEnabled, out isCacheEnabled);
                if (isCacheEnabled)
                {
                    //Check Cached Result
                    if (Cache.IsInCache("MC-POSTCODELOOKUP-" + postcodeInfo))
                    {
                        var list = Cache.GetFromCache <List <Models.PostcodeLookUp> >("MC-POSTCODELOOKUP-" + postcodeInfo);
                        return(ResponseHelper.FormatMessage(JsonConvert.SerializeObject(list)));
                    }
                }

                // Check Database
                var postcodeData = _dbContext.GetPostCode(postcodeInfo).ToList();
                if (postcodeData.Any())
                {
                    var postcodes = postcodeData.Select(x => new Models.PostcodeLookUp
                    {
                        Address1 = x.Address1,
                        Address2 = x.Address2,
                        Address3 = x.Address3,
                        Town     = x.Town,
                        County   = x.County,
                        Postcode = x.Postcode.NormalizePostcode().ToUpper()
                    }).ToList();

                    double time;
                    var    isParsed = double.TryParse(Common.Config.CacheExpiration, out time);
                    if (!isParsed)
                    {
                        return(ResponseHelper.FormatMessage(JsonConvert.SerializeObject(postcodes)));
                    }

                    if (isCacheEnabled)
                    {
                        Cache.SaveToCache("MC-POSTCODELOOKUP-" + postcodeInfo, postcodes,
                                          DateTimeOffset.Now.AddMinutes(time));
                    }
                    return(ResponseHelper.FormatMessage(JsonConvert.SerializeObject(postcodes)));
                }
                else
                {
                    //Make Grass Roots API WebRequest
                    var uri = new Uri(Common.Config.PostcodeApi)
                              .AddParameter("postcode", postcodeInfo.ToUpper())
                              .AddParameter("application", Common.Config.PostcodeApp);

                    var response = HttpWebRequestHelper.MakeRequest(uri.ToString(), 5000);
                    var json     = HttpWebRequestHelper.GetHttpWebResponseData(response);

                    if (!String.IsNullOrEmpty(json))
                    {
                        var postcodeApi =
                            (PostcodeLookUpApiViewModel)
                            JsonConvert.DeserializeObject(json, typeof(PostcodeLookUpApiViewModel));

                        //Save Result to DB
                        foreach (var address in postcodeApi.Addresses)
                        {
                            address.Postcode = postcode.ToUpper();
                            _dbContext.PostcodeLookUps.InsertOnSubmit(new PostcodeLookUp
                            {
                                Address1 = address.Address1,
                                Address2 = address.Address2,
                                Address3 = address.Address3,
                                Town     = address.Town,
                                County   = address.County,
                                Postcode = postcode.ToUpper()
                            });
                        }
                        _dbContext.SubmitChanges();

                        if (!isCacheEnabled)
                        {
                            return(ResponseHelper.FormatMessage(JsonConvert.SerializeObject(postcodeApi.Addresses)));
                        }

                        double time;
                        var    isParsed = double.TryParse(Common.Config.CacheExpiration, out time);
                        if (!isParsed)
                        {
                            Cache.SaveToCache("MC-POSTCODELOOKUP-" + postcodeInfo, postcodeApi.Addresses,
                                              DateTimeOffset.Now.AddMinutes(time));
                        }
                        return(ResponseHelper.FormatMessage(JsonConvert.SerializeObject(postcodeApi.Addresses)));
                    }
                    else
                    {
                        return(ResponseHelper.FormatMessage(JsonConvert.SerializeObject("")));
                    }
                }
            }
            var message = string.Format("Postcode is not valid.");

            return(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, message));
        }
Пример #2
0
        public HttpResponseMessage Get(string postcode)
        {
            if (String.IsNullOrEmpty(postcode))
            {
                return(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, string.Format("Postcode must not be null.")));
            }

            var regex = new Regex(Common.Config.PostcodeExpression);
            var match = regex.Match(postcode.ToUpper());

            if (match.Success)
            {
                var postcodeInfo = postcode.Replace(" ", "");

                bool isCacheEnabled;
                bool.TryParse(Common.Config.CacheEnabled, out isCacheEnabled);
                if (isCacheEnabled)
                {
                    //Check Cached Result
                    if (Cache.IsInCache("MC-DEALERLOOKUP-" + postcodeInfo))
                    {
                        var list = Cache.GetFromCache <List <Models.DealerLookUp> >("MC-DEALERLOOKUP-" + postcodeInfo);
                        return(ResponseHelper.FormatMessage(JsonConvert.SerializeObject(list)));
                    }
                }

                // Check Database
                var postcodeData = _dbContext.GetDealer(postcodeInfo).ToList();
                if (postcodeData.Any())
                {
                    var dealers = postcodeData.Select(x => new Models.DealerLookUp
                    {
                        DealerId  = x.DealerId,
                        Phone     = x.Phone,
                        Name      = x.Name,
                        Longitude = x.Longitude,
                        Latitude  = x.Latitude,
                        Distance  = x.Distance,
                        Address   = x.Address
                    }).OrderBy(x => x.Distance).ToList();

                    double time;
                    var    isParsed = double.TryParse(Common.Config.CacheExpiration, out time);
                    if (!isParsed)
                    {
                        return(ResponseHelper.FormatMessage(JsonConvert.SerializeObject(dealers)));
                    }

                    if (isCacheEnabled)
                    {
                        Cache.SaveToCache("MC-DEALERLOOKUP-" + postcodeInfo, dealers,
                                          DateTimeOffset.Now.AddMinutes(time));
                    }
                    return(ResponseHelper.FormatMessage(JsonConvert.SerializeObject(dealers)));
                }
                else
                {
                    // Make API WebRequest
                    var googleUri = new Uri(Common.Config.GoogleMapsApi)
                                    .AddParameter("address", postcodeInfo)
                                    .AddParameter("sensor", "false");
                    var response  = HttpWebRequestHelper.MakeRequest(googleUri.ToString(), 5000);
                    var json      = HttpWebRequestHelper.GetHttpWebResponseData(response);
                    var addresses =
                        (GoogleGeoCodeResponse)JsonConvert.DeserializeObject(json, typeof(GoogleGeoCodeResponse));
                    var location = addresses.results.Select(x => x.geometry.location).SingleOrDefault();

                    if (location == null)
                    {
                        return(null);
                    }

                    var dealerUri = new Uri(Common.Config.DealerApi)
                                    .AddParameter("application", Common.Config.DealerApplication)
                                    .AddParameter("brand", Common.Config.DealerCategory)
                                    .AddParameter("resultcount", Common.Config.DealerMaxTotal)
                                    .AddParameter("latitude", location.lat)
                                    .AddParameter("longitude", location.lng);
                    var dealerResponse = HttpWebRequestHelper.MakeRequest(dealerUri.ToString(), 5000);
                    var feed           = HttpWebRequestHelper.GetHttpWebResponseData(dealerResponse);

                    var dealerList = (DealerResponse)JsonConvert.DeserializeObject(feed, typeof(DealerResponse));

                    var viewModel = dealerList.dealers.Select(loc => new Models.DealerLookUp()
                    {
                        Address   = loc.address,
                        DealerId  = Convert.ToInt32(loc.dealerid),
                        Phone     = loc.telephone,
                        Latitude  = double.Parse(loc.latitude),
                        Longitude = double.Parse(loc.longitude),
                        Name      = loc.name,
                        Distance  = double.Parse(loc.distance)
                    }).OrderBy(x => x.Distance).ToList();

                    //Save Result to DB
                    foreach (var dealer in viewModel)
                    {
                        _dbContext.Dealers.InsertOnSubmit(new Dealer
                        {
                            Postcode     = postcodeInfo,
                            DealerLookUp = new DealerLookUp
                            {
                                Address   = dealer.Address,
                                DealerId  = dealer.DealerId,
                                Distance  = dealer.Distance,
                                Latitude  = dealer.Latitude,
                                Longitude = dealer.Longitude,
                                Name      = dealer.Name,
                                Phone     = dealer.Phone
                            }
                        });
                    }
                    _dbContext.SubmitChanges();

                    if (!isCacheEnabled)
                    {
                        return(ResponseHelper.FormatMessage(JsonConvert.SerializeObject(viewModel)));
                    }

                    double time;
                    var    isParsed = double.TryParse(Common.Config.CacheExpiration, out time);
                    if (!isParsed)
                    {
                        Cache.SaveToCache("MC-DEALERLOOKUP-" + postcodeInfo, viewModel,
                                          DateTimeOffset.Now.AddMinutes(time));
                    }
                    return(ResponseHelper.FormatMessage(JsonConvert.SerializeObject(viewModel)));
                }
            }
            var message = string.Format("Postcode is not valid.");

            return(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, message));
        }