private async Task <(int, int)> GetMileage(LoadshopSmartSpotQuoteRequest request) { var mileageRequest = new MileageRequestData { OriginCity = request.OriginCity, OriginState = request.OriginState, OriginPostalCode = request.OriginPostalCode, OriginCountry = request.OriginCountry, DestinationCity = request.DestinationCity, DestinationState = request.DestinationState, DestinationPostalCode = request.DestinationPostalCode, DestinationCountry = request.DestinationCountry }; var routeMiles = await _mileageService.GetDirectRouteMiles(mileageRequest); var directMiles = _mileageService.GetDirectMiles(mileageRequest); if (directMiles <= 0) { directMiles = routeMiles; } return(routeMiles, directMiles); }
public void BadRequest() { MockHttpResponse("", HttpStatusCode.BadRequest); var request = new MileageRequestData { OriginCity = "O_City", OriginState = "O_State", OriginCountry = "O_Country", OriginPostalCode = "O_PostalCode", DestinationCity = "D_City", DestinationState = "D_State", DestinationCountry = "D_Country", DestinationPostalCode = "D_PostalCode", DefaultMiles = 0 }; _svc.Awaiting(x => x.GetDirectRouteMiles(request)) .Should() .Throw <Exception>() .WithMessage("*Bad Request*"); }
public async Task <int> GetDirectRouteMiles(MileageRequestData request) { if (request == null) { return(0); } var url = $"{_googleDirectionApiUrl}?" + $"origin={request.OriginCity}, {request.OriginState} {request.OriginPostalCode}" + $"&destination={request.DestinationCity}, {request.DestinationState} {request.DestinationPostalCode}" + $"&key={_googleKey}"; var apiResponse = await _httpClient.GetAsync(url); apiResponse.EnsureSuccessStatusCode(); var content = await apiResponse.Content.ReadAsStringAsync(); var directions = JsonConvert.DeserializeObject <GoogleDirectionClass>(content); var meters = directions?.routes?.FirstOrDefault()?.legs?.FirstOrDefault()?.distance?.value; return((int)Math.Round((meters ?? 0) / 1609.34, MidpointRounding.AwayFromZero)); }
public int GetDirectMiles(MileageRequestData request) { if (request == null) { return(0); } try { HttpClientHandler handler = new HttpClientHandler() { AutomaticDecompression = System.Net.DecompressionMethods.GZip | System.Net.DecompressionMethods.Deflate }; using (var httpClient = new HttpClient(handler)) { httpClient.BaseAddress = new Uri(string.Format("{0}://{1}", _pcMilerAddress.Scheme, _pcMilerAddress.Host)); httpClient.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate"); httpClient.DefaultRequestHeaders.Add("SOAPAction", "\"http://tempuri.org/IPcMilerRest/GetMiles\""); httpClient.DefaultRequestHeaders.Add("Accept", "*/*"); httpClient.DefaultRequestHeaders.Add("Host", _pcMilerAddress.Host); if (request.DestinationCountry == "CAN") { request.DestinationCountry = "CA"; } if (request.OriginCountry == "CAN") { request.OriginCountry = "CA"; } string xmlRequestBody = string.Format("<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body><GetMiles xmlns=\"http://tempuri.org/\"><version>" + _pcMilerVersion + "</version><origin xmlns:a=\"http://schemas.datacontract.org/2004/07/TOPSPCMiler.AppCode\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><a:Addr1 i:nil=\"true\"/><a:Addr2 i:nil=\"true\"/><a:City{0}</a:City><a:Country>{2}</a:Country><a:IsValid>false</a:IsValid><a:LocationType>Origin</a:LocationType><a:LookupAddr i:nil=\"true\"/><a:PcMilerFormatted i:nil=\"true\"/><a:State{1}</a:State><a:Zip>{6}</a:Zip></origin><destination xmlns:a=\"http://schemas.datacontract.org/2004/07/TOPSPCMiler.AppCode\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><a:Addr1 i:nil=\"true\"/><a:Addr2 i:nil=\"true\"/><a:City{3}</a:City><a:Country>{5}</a:Country><a:IsValid>false</a:IsValid><a:LocationType>Destination</a:LocationType><a:LookupAddr i:nil=\"true\"/><a:PcMilerFormatted i:nil=\"true\"/><a:State{4}</a:State><a:Zip>{7}</a:Zip></destination><config xmlns:a=\"http://schemas.datacontract.org/2004/07/TOPSPCMiler.AppCode\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><a:ConfigId>DEFAULT</a:ConfigId><a:MilageCalcType>0</a:MilageCalcType><a:OpenBorders>true</a:OpenBorders><a:UseStreets>false</a:UseStreets></config></GetMiles></s:Body></s:Envelope>", string.IsNullOrEmpty(request.OriginCity) ? " i:nil=\"true\">" : ">" + request.OriginCity + "*", string.IsNullOrEmpty(request.OriginState) ? " i:nil=\"true\">" : ">" + request.OriginState, request.OriginCountry, string.IsNullOrEmpty(request.DestinationCity) ? " i:nil=\"true\">" : ">" + request.DestinationCity + "*", string.IsNullOrEmpty(request.DestinationState) ? " i:nil=\"true\">" : ">" + request.DestinationState, request.DestinationCountry, request.OriginPostalCode, request.DestinationPostalCode); var messageResponse = httpClient.PostAsync(_pcMilerAddress.LocalPath, new StringContent(xmlRequestBody, System.Text.Encoding.UTF8, "text/xml")).Result; string xmlResponse = messageResponse.Content.ReadAsStringAsync().Result; System.Xml.XmlDocument xmlResponseDocument = new System.Xml.XmlDocument(); xmlResponseDocument.LoadXml(xmlResponse); var hasErrors = xmlResponseDocument.GetElementsByTagName("a:Errors")[0].ChildNodes.Count > 0; if (hasErrors) { _logger.LogInformation($"GetDirectMiles Error for request ({request.OriginCity}, {request.OriginState} {request.OriginCountry} {request.OriginPostalCode} to " + $"{request.DestinationCity}, {request.DestinationState} {request.DestinationCountry} {request.DestinationPostalCode}): {xmlResponseDocument.GetElementsByTagName("a:Errors")[0].InnerText}"); if (xmlResponseDocument.GetElementsByTagName("a:Errors")[0].ChildNodes[0].InnerText.ToLower().Contains("invalid destination location") && !string.IsNullOrEmpty(request.DestinationCity) && !string.IsNullOrEmpty(request.DestinationState)) { //Try Destination with only zip code request.DestinationCity = ""; request.DestinationState = ""; return(GetDirectMiles(request)); } if (xmlResponseDocument.GetElementsByTagName("a:Errors")[0].ChildNodes[0].InnerText.ToLower().Contains("invalid origin location") && !string.IsNullOrEmpty(request.OriginCity) && !string.IsNullOrEmpty(request.OriginState)) { //Try Origin with only zip code request.OriginCity = ""; request.OriginState = ""; return(GetDirectMiles(request)); } return(request.DefaultMiles); } else { string milesString = xmlResponseDocument.GetElementsByTagName("a:Miles")[0].InnerText; decimal.TryParse(milesString, out decimal miles); return(Convert.ToInt32(miles)); } } } catch (Exception e) { _logger.LogError($"GetDirectMiles Error for request ({request.OriginCity}, {request.OriginState} {request.OriginCountry} {request.OriginPostalCode} to " + $"{request.DestinationCity}, {request.DestinationState} {request.DestinationCountry} {request.DestinationPostalCode}): {e.Message}"); return(request.DefaultMiles); } }