Example #1
0
        public async Task <GetPostcodeCoordinatesResponse> GetPostcodeCoordinatesAsync(List <string> postCodes, CancellationToken cancellationToken)
        {
            string path = $"api/GetPostcodeCoordinates";

            GetPostcodeCoordinatesRequest getPostcodeCoordinatesRequest = new GetPostcodeCoordinatesRequest()
            {
                Postcodes = postCodes
            };

            var streamContent = HttpContentUtils.SerialiseToJsonAndCompress(getPostcodeCoordinatesRequest);

            ResponseWrapper <GetPostcodeCoordinatesResponse, AddressServiceErrorCode> getPostcodeCoordinatesResponseWithWrapper;

            using (HttpResponseMessage response = await _httpClientWrapper.PostAsync(HttpClientConfigName.AddressService, path, streamContent, cancellationToken).ConfigureAwait(false))
            {
                response.EnsureSuccessStatusCode();
                Stream stream = await response.Content.ReadAsStreamAsync();

                getPostcodeCoordinatesResponseWithWrapper = await Utf8Json.JsonSerializer.DeserializeAsync <ResponseWrapper <GetPostcodeCoordinatesResponse, AddressServiceErrorCode> >(stream, StandardResolver.AllowPrivate);
            }

            if (!getPostcodeCoordinatesResponseWithWrapper.IsSuccessful)
            {
                throw new Exception($"Calling Address Service GetPostcodeCoordinatesAsync endpoint unsuccessful: {getPostcodeCoordinatesResponseWithWrapper.Errors.FirstOrDefault()?.ErrorMessage}");
            }

            return(getPostcodeCoordinatesResponseWithWrapper.Content);
        }
        public async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage reqAsHttpRequestMessage,
            CancellationToken cancellationToken)
        {
            try
            {
                NewRelic.Api.Agent.NewRelic.SetTransactionName("AddressService", "GetPostcodeCoordinates");
                _logger.LogInformation("C# HTTP trigger function processed a request.");

                // accept compressed requests (can't do this with middleware)
                GetPostcodeCoordinatesRequest req = await HttpRequestMessageCompressionUtils.DeserialiseAsync <GetPostcodeCoordinatesRequest>(reqAsHttpRequestMessage);

                if (req.IsValid(out var validationResults))
                {
                    GetPostcodeCoordinatesResponse response = await _mediator.Send(req, cancellationToken);

                    return(new OkObjectResult(ResponseWrapper <GetPostcodeCoordinatesResponse, AddressServiceErrorCode> .CreateSuccessfulResponse(response)));
                }
                else
                {
                    return(new ObjectResult(ResponseWrapper <GetPostcodeCoordinatesResponse, AddressServiceErrorCode> .CreateUnsuccessfulResponse(AddressServiceErrorCode.ValidationError, validationResults))
                    {
                        StatusCode = 422
                    });
                }
            }
            catch (Exception ex)
            {
                _logger.LogErrorAndNotifyNewRelic($"Unhandled error in GetPostcodeCoordinates", ex);
                return(new ObjectResult(ResponseWrapper <GetPostcodeCoordinatesResponse, AddressServiceErrorCode> .CreateUnsuccessfulResponse(AddressServiceErrorCode.UnhandledError, "Internal Error"))
                {
                    StatusCode = StatusCodes.Status500InternalServerError
                });
            }
        }
Example #3
0
        private HttpRequestMessage CreateInvalidRequest()
        {
            GetPostcodeCoordinatesRequest req = new GetPostcodeCoordinatesRequest()
            {
                Postcodes = null
            };

            var httpRequestMessage = new HttpRequestMessage();

            httpRequestMessage.Content = new StringContent(JsonConvert.SerializeObject(req));
            return(httpRequestMessage);
        }
Example #4
0
        public async Task <GetPostcodeCoordinatesResponse> GetPostcodeCoordinates(GetPostcodeCoordinatesRequest getPostcodeCoordinatesRequest)
        {
            string              json     = JsonConvert.SerializeObject(getPostcodeCoordinatesRequest);
            StringContent       data     = new StringContent(json, Encoding.UTF8, "application/json");
            HttpResponseMessage response = await Client.PostAsync("/api/GetPostcodeCoordinates", data);

            string str = await response.Content.ReadAsStringAsync();

            var objResponse = JsonConvert.DeserializeObject <ResponseWrapper <GetPostcodeCoordinatesResponse, AddressServiceErrorCode> >(str);

            if (objResponse.HasContent && objResponse.IsSuccessful)
            {
                return(objResponse.Content);
            }
            throw new System.Exception("Unable to fetch postcode coordinate response");
        }
Example #5
0
        public async Task <List <PostcodeCoordinate> > GetPostcodeCoordinates(string postcode)
        {
            postcode = PostcodeFormatter.FormatPostcode(postcode);

            GetPostcodeCoordinatesRequest getPostcodeCoordinatesRequest = new GetPostcodeCoordinatesRequest()
            {
                Postcodes = new List <string>()
                {
                    postcode
                }
            };

            var response = await _addressRepository.GetPostcodeCoordinates(getPostcodeCoordinatesRequest);

            return(response.PostcodeCoordinates.ToList());
        }
Example #6
0
        public async Task <GetPostcodeCoordinatesResponse> GetPostcodeCoordinates(GetPostcodeCoordinatesRequest getPostcodeCoordinatesRequest)
        {
            string        json = JsonConvert.SerializeObject(getPostcodeCoordinatesRequest);
            StringContent data = new StringContent(json, Encoding.UTF8, "application/json");

            using (HttpResponseMessage response = await _httpClientWrapper.PostAsync(HttpClientConfigName.AddressService, "/api/GetPostcodeCoordinates", data, CancellationToken.None))
            {
                string jsonResponse = await response.Content.ReadAsStringAsync();

                var sendEmailResponse = JsonConvert.DeserializeObject <ResponseWrapper <GetPostcodeCoordinatesResponse, AddressServiceErrorCode> >(jsonResponse);
                if (sendEmailResponse.HasContent && sendEmailResponse.IsSuccessful)
                {
                    return(sendEmailResponse.Content);
                }
            }
            return(null);
        }
Example #7
0
        public async Task Success()
        {
            GetPostcodeCoordinatesRequest getPostcodeCoordinatesRequest = new GetPostcodeCoordinatesRequest()
            {
                Postcodes = new List <string>()
                {
                    "NG1 1AA"
                },
            };

            Core.Services.AddressService addressService = new Core.Services.AddressService(_httpClientWrapper.Object);

            GetPostcodeCoordinatesResponse result = await addressService.GetPostcodeCoordinatesAsync(getPostcodeCoordinatesRequest, CancellationToken.None);

            Assert.IsTrue(result.PostcodeCoordinates.Any(x => x.Postcode == "NG1 1AA" && x.Latitude == 45 && x.Longitude == 50));

            _httpClientWrapper.Setup(x => x.PostAsync(It.Is <HttpClientConfigName>(y => y == HttpClientConfigName.AddressService), It.Is <string>(y => y == "api/GetPostcodeCoordinates"), It.IsAny <HttpContent>(), It.IsAny <CancellationToken>()));
        }
Example #8
0
        public async Task Unsuccessful()
        {
            HttpResponseMessage httpResponseMessage = CreateUnsuccesssfuResponseWrapperHttpResponseMessage <GetPostcodeCoordinatesResponse>();

            _httpClientWrapper.Setup(x => x.PostAsync(It.IsAny <HttpClientConfigName>(), It.IsAny <string>(), It.IsAny <HttpContent>(), It.IsAny <CancellationToken>())).ReturnsAsync(httpResponseMessage);

            GetPostcodeCoordinatesRequest getPostcodeCoordinatesRequest = new GetPostcodeCoordinatesRequest()
            {
                Postcodes = new List <string>()
                {
                    "NG1 1AA"
                },
            };

            Core.Services.AddressService addressService = new Core.Services.AddressService(_httpClientWrapper.Object);

            Exception ex = Assert.ThrowsAsync <Exception>(async() => await addressService.GetPostcodeCoordinatesAsync(getPostcodeCoordinatesRequest, CancellationToken.None));

            Assert.AreEqual("Calling Address Service GetPostcodeCoordinatesAsync endpoint unsuccessful: Error", ex.Message);
        }
Example #9
0
        public async Task GetPostcodeCoordinates()
        {
            GetPostcodeCoordinatesRequest getPostcodeCoordinatesRequest = new GetPostcodeCoordinatesRequest()
            {
                Postcodes = new List <string>()
                {
                    "NG1 5FS", "NG1 5BL"
                }
            };

            GetPostcodeCoordinatesHandler getPostcodeCoordinatesHandler = new GetPostcodeCoordinatesHandler(_postcodeCoordinatesGetter.Object);

            GetPostcodeCoordinatesResponse result = await getPostcodeCoordinatesHandler.Handle(getPostcodeCoordinatesRequest, CancellationToken.None);

            Assert.AreEqual(2, result.PostcodeCoordinates.Count());

            Assert.AreEqual(52.954885, result.PostcodeCoordinates.FirstOrDefault(x => x.Postcode == "NG1 5FS").Latitude);
            Assert.AreEqual(-1.155263, result.PostcodeCoordinates.FirstOrDefault(x => x.Postcode == "NG1 5FS").Longitude);

            Assert.AreEqual(52.955494, result.PostcodeCoordinates.FirstOrDefault(x => x.Postcode == "NG1 5BL").Latitude);
            Assert.AreEqual(-1.154864, result.PostcodeCoordinates.FirstOrDefault(x => x.Postcode == "NG1 5BL").Longitude);
        }