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