Exemple #1
0
        public async Task <IList> SearchNearByAsync(SearchPlacesRequest model)
        {
            var parameters = _queryStringBuilder
                             .SetLocation(model)
                             .SetRadius(model.Radius)
                             .SetTypes(model.Types)
                             .Build();


            HttpClient httpClient = new HttpClient
            {
                BaseAddress = new Uri(Settings.Default.GooglePlacesApiUri + Settings.Default.GoogleNearBySearch)
            };

            HttpResponseMessage response = httpClient.GetAsync(parameters).Result;

            if (response.IsSuccessStatusCode)
            {
                var result = await response.Content.ReadAsAsync <SearchPlacesResult>();

                return(result.Results);
            }

            return(null);
        }
        public async Task PlaceAutocompleteSearchProcessTest_WithRequiredValues()
        {
            var httpClient  = new HttpClient();
            var restService = new RESTRequest <PlacesResponse, Dictionary <string, string> >(httpClient);
            BusinessResult <SearchPlacesResponse> result = default;

            try
            {
                var request = new SearchPlacesRequest()
                {
                    ApiKey = Globals.Credentials.PlacesApiKey,
                    //Address = "1600 Amphitheatre Pkwy, Mountain View, CA 94043",
                    Address           = "1600 Amphitheatre",
                    PlaceBaseUrl      = _baseUrl,
                    OperationId       = $"{Guid.NewGuid()}",
                    CancellationToken = CancellationToken.None,
                };

                var searchProcessor = new PlaceAutocompleteSearchProcessor(restService, _logger);
                result = await searchProcessor.ExecuteAsync(request);

                _output.WriteLine(JsonConvert.SerializeObject(result));

                Assert.NotNull(result);
                Assert.NotNull(result.Result);
                Assert.IsType <SearchPlacesResponse>(result.Result);
                Assert.Empty(result.Error);
            }
            catch (Exception ex)
            {
                result.Error.Add(new BusinessError(LogLevel.Critical, "test exception", ex, result?.Result?.OperationId));
                _output.WriteLine($"{result.Error}");
                Assert.True(false);
            }
        }
        public async Task <ActionResult> PlacesAutocomplete(SearchPlacesRequest request)
        {
            BusinessResult <SearchPlacesResponse> response = default;

            request.ApiKey       = Globals.Credentials?.PlacesApiKey;
            request.PlaceBaseUrl = Globals.Configuration?.PlaceBaseUrl;

            using (var httpClient = new HttpClient())
            {
                var restService = new RESTRequest <PlacesResponse, Dictionary <string, string> >(httpClient);
                response = await new PlaceAutocompleteSearchProcessor(restService, _logger).ExecuteAsync(request);
            }

            return(new ActionResponse <SearchPlacesResponse>(response, _displayErrors, _logger));
        }
Exemple #4
0
        public async Task <IHttpActionResult> Get([FromUri] SearchPlacesRequest model)
        {
            if (model == null || !ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var result = await _placeService.SearchNearByAsync(model);

            if (result != null || result.Count > 0)
            {
                return(Ok(result));
            }
            return(NotFound());
        }
        public async Task PlaceAutocompleteSearchProcessTest_WithoutHttpClient()
        {
            BusinessResult <SearchPlacesResponse> result = default;

            var request = new SearchPlacesRequest()
            {
                ApiKey            = Globals.Credentials.PlacesApiKey,
                Address           = "1600 Amphitheatre",
                PlaceBaseUrl      = _baseUrl,
                OperationId       = $"{Guid.NewGuid()}",
                CancellationToken = CancellationToken.None,
            };

            var searchProcessor = new PlaceAutocompleteSearchProcessor(null, _logger);

            result = await searchProcessor.ExecuteAsync(request);

            _output.WriteLine(JsonConvert.SerializeObject(result));

            Assert.NotNull(result);
            Assert.NotNull(result.Error);
        }
        public async Task PlaceAutocompleteSearchProcessTest_WithBadApiKey()
        {
            BusinessResult <SearchPlacesResponse> result = default;

            var request = new SearchPlacesRequest()
            {
                ApiKey            = "SWdaAjDTZ",
                Address           = "1600 Amphitheatre",
                PlaceBaseUrl      = _baseUrl,
                OperationId       = $"{Guid.NewGuid()}",
                CancellationToken = CancellationToken.None,
            };

            var searchProcessor = new PlaceAutocompleteSearchProcessor(_restService, _logger);

            result = await searchProcessor.ExecuteAsync(request);

            _output.WriteLine(JsonConvert.SerializeObject(result));

            Assert.NotNull(result);
            Assert.NotNull(result.Error);
            Assert.Contains(result.Error, e => e.Message.Contains("Error"));
        }
        /// <summary>
        /// Place Autocomplete search request and response processor
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public async Task <BusinessResult <SearchPlacesResponse> > ExecuteAsync(SearchPlacesRequest request)
        {
            var result = new BusinessResult <SearchPlacesResponse>()
            {
                Result = new SearchPlacesResponse()
            };

            if (request == null)
            {
                result.Error.Add(new BusinessError($"{this.GetType().FullName}.ExecuteAsync", LogLevel.Error,
                                                   "Invalid request: request object is null", null, null));
                return(result);
            }

            if (string.IsNullOrEmpty(request.Address))
            {
                result.Error.Add(new BusinessError($"{this.GetType().FullName}.ExecuteAsync", LogLevel.Error,
                                                   "Invalid request:  search address  is invalid", null, request?.OperationId));
                return(result);
            }

            if (string.IsNullOrEmpty(request.ApiKey))
            {
                result.Error.Add(new BusinessError($"{this.GetType().FullName}.ExecuteAsync", LogLevel.Error,
                                                   "Invalid ApiKey", null, request?.OperationId));
                return(result);
            }

            if (string.IsNullOrWhiteSpace(request.OperationId))
            {
                request.OperationId = $"{Guid.NewGuid()}";
            }

            try
            {
                //  generate request
                var restServiceParameters = new RESTRequestParameters()
                {
                    Url = request.PlaceBaseUrl,
                    CancellationToken = request.CancellationToken,
                };
                var restRequest = CreateRequestDictionary(request);

                //  make service request
                var restService = await _restService.Get(restServiceParameters, restRequest.Result);

                result.Error.AddRange(restService.Error);

                //  check response status
                if (!string.IsNullOrEmpty(restService.Result?.Error_message))
                {
                    result.Error.Add(new BusinessError(LogLevel.Error, restService.Result.Error_message, null, request.OperationId));
                }
                if (!restService.Result?.Status?.Equals($"{PlaceResponseStatus.OK}") ?? true)
                {
                    result.Error.Add(new BusinessError(LogLevel.Error, $"Reponse Status: {restService.Result.Status}", null, request.OperationId));
                }

                if (result.Error.Count == 0)
                {
                    //  process response
                    result.Result.Status       = restService.Result.Status;
                    result.Result.SessionToken = request.SessionToken;
                    result.Result.OperationId  = string.IsNullOrEmpty(result.Result.OperationId)
                                                    ? request.OperationId
                                                    : result.Result.OperationId;

                    result.Result.Predictions = new List <SearchPlacePrediction>();
                    foreach (var predicition in restService.Result.Predictions)
                    {
                        var searchPlacePredicition = new SearchPlacePrediction()
                        {
                            Description    = predicition.Description,
                            Id             = predicition.Id,
                            PlaceId        = predicition.Place_id,
                            Reference      = predicition.Reference,
                            Types          = predicition.Types.ToList(),
                            DistanceMeters = predicition.Distance_meters,
                        };
                        result.Result.Predictions.Add(searchPlacePredicition);
                    }
                }
            }
            catch (Exception ex)
            {
                result.Error.Add(new BusinessError($"{this.GetType().FullName}.ExecuteAsync", LogLevel.Critical, "Exception found", ex, request.OperationId));
            }

            return(result);
        }
        //  TODO:   use reflection
        private BusinessResult <Dictionary <string, string> > CreateRequestDictionary(SearchPlacesRequest request)
        {
            var result = new BusinessResult <Dictionary <string, string> >()
            {
                Result = new Dictionary <string, string>()
            };

            try
            {
                if (!string.IsNullOrEmpty(request.Address))
                {
                    result.Result.Add("input", request.Address);
                }
                else
                {
                    result.Error.Add(new BusinessError(LogLevel.Error, "request is missing an address", null, request.OperationId));
                }

                if (!string.IsNullOrEmpty(request.ApiKey))
                {
                    result.Result.Add("key", request.ApiKey);
                }
                else
                {
                    result.Error.Add(new BusinessError(LogLevel.Error, "missing api key", null, request.OperationId));
                }

                if (!string.IsNullOrEmpty(request.SessionToken))
                {
                    result.Result.Add("sessiontoken", request.SessionToken);
                }

                if (request.ComponentContries?.Components.Count > 0)
                {
                    var kvp = request.ComponentContries.ToKeyValuePair();
                    result.Result.Add(kvp.Key, kvp.Value);
                }

                if (request.Offset != null)
                {
                    result.Result.Add("offset", $"{request.Offset}");
                }

                if (request.OriginPoint != null)
                {
                    var kvp = request.OriginPoint.ToKeyValuePair();
                    result.Result.Add(kvp.Key, kvp.Value);
                }

                if (!string.IsNullOrEmpty(request.Language))
                {
                    result.Result.Add("language", request.Language);
                }

                if (request.Location != null)
                {
                    var kvp = request.Location.ToKeyValuePair();
                    result.Result.Add(kvp.Key, kvp.Value);
                }

                if (request.Radius != null)
                {
                    result.Result.Add("radius", $"{request.Radius}");
                }

                if (request.Strictbounds != null)
                {
                    result.Result.Add("strictbounds", $"{request.Strictbounds}");
                }

                if (request.Types != TypeOfResults.None)
                {
                    result.Result.Add("types", $"{request.Types}");
                }
            }
            catch (Exception ex)
            {
                result.Error.Add(new BusinessError($"{this.GetType().FullName}.CreateRequestDictionary", LogLevel.Critical, "Exception found", ex, request.OperationId));
            }

            return(result);
        }