public static async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, ILogger log) { #region validate input // validate input parameter string latStr = req.Query["lat"]; string lonStr = req.Query["lon"]; double lat, lon; if (string.IsNullOrWhiteSpace(latStr) || string.IsNullOrWhiteSpace(lonStr) || !Double.TryParse(latStr, out lat) || !Double.TryParse(lonStr, out lon) || !(lat >= -90 && lat <= 90) || !(lon >= -180 && lon <= 180)) { return(new BadRequestObjectResult("Please pass valid values for parameters ?lat=<value>&lon=<value> on the query string")); } #endregion log.LogInformation($"Trucks location req received for {lat},{lon}"); #region fetch settings // connection string to SQL DB _sqlConnection.ConnectionString = Environment.GetEnvironmentVariable("DatabaseConnectionString"); // get the UUID for Maps API data from conguration // TODO: Ideally should come from database after Maps API upload var mapsDataUUID = Environment.GetEnvironmentVariable("MapsData.UUID"); // Maps API subscription key from Azure portal var mapsSubsKey = Environment.GetEnvironmentVariable("MapsData.SubsKey"); #endregion TruckLocator locator = new TruckLocator(); TruckInfoResponse resp = await locator.Locate(_sqlConnection, lat, lon, mapsDataUUID, mapsSubsKey); return((ActionResult) new OkObjectResult(resp)); //catch(Exception ex) //{ // return (ActionResult)new BadRequestObjectResult(ex.ToString()); //} }
/// <summary> /// Locates 5 closest points to a given point. It uses Maps API closest point algorithm. After the points are identified, /// more properties like business name, type, hours of operation are appended to the response /// </summary> /// <param name="sqlConnection">static connection object</param> /// <param name="lat">source latitude coordinate</param> /// <param name="lon">source longitude coordinate</param> /// <param name="mapsDataUUID">UUID that was returned by Maps API when the data was uploaded</param> /// <param name="mapsSubsKey">Account key to access Maps API</param> /// <returns></returns> public async Task <TruckInfoResponse> Locate(SqlConnection sqlConnection, double lat, double lon, string mapsDataUUID, string mapsSubsKey) { Stopwatch sw = Stopwatch.StartNew(); TruckInfoResponse resp = new TruckInfoResponse(); // query MapsAPI Spatial - Get Closest Point var qString = $"?subscription-key={mapsSubsKey}&api-version=1.0&udid={mapsDataUUID}&lat={lat}&lon={lon}&numberOfClosestPoints=5"; var client = new RestClient(_mapsAPIClosestPointURL + qString); var response = await client.ExecuteGetTaskAsync(new RestRequest()); dynamic closestPoints = JsonConvert.DeserializeObject(response.Content); // inspect the response if (closestPoints != null) { // create response object from Maps API response resp.Trucks = new List <TruckInfo>(); var points = closestPoints.result; // loop through closest points foreach (var point in points) { var t = await getTruckInfo(sqlConnection, point); resp.Trucks.Add(t); } resp.Header = new ResponseSummary { ReqestedLocation = new GeoCoordinate { Latitude = lat, Longitude = lon }, ElapsedMilliseconds = sw.ElapsedMilliseconds }; } return(resp); }