Exemplo n.º 1
0
        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());
            //}
        }
Exemplo n.º 2
0
        /// <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);
        }