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)); }
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)); }