Example #1
0
        public async Task <ActionResult> Get([FromRoute] GetPaymentRequestModel requestModel)
        {
            if (!EnsureMerchantValidity(out var merchant))
            {
                return(BadRequest(new ErrorResponseModel("missing or invalid merchant header")));
            }

            _logger.LogInformation(requestModel.PaymentId.ToString());

            var payment = await _paymentRepository.GetByPaymentIdAsync(requestModel.PaymentId);

            if (payment == null)
            {
                return(NotFound());
            }

            // Protect against access of payment data from other merchants
            if (payment.MerchantId != merchant.MerchantId)
            {
                return(BadRequest(new ErrorResponseModel("Merchant mismatch")));
            }

            var responseModel = new GetPaymentResponseModel
            {
                Payment = _modelMapper.MapPayment(payment)
            };

            return(Ok(responseModel));
        }
        public async Task <GetPaymentResponseModel> GetPaymentRequestAsync(GetPaymentRequestModel requestModel)
        {
            var url         = string.Format("{0}", requestModel.PaymentId);
            var responseRaw = await _httpClient.GetAsync(url).ConfigureAwait(false);

            // Possible improvement: Optimize resiliency with retry behavior

            if (!responseRaw.IsSuccessStatusCode)
            {
                var errorMessage = await TryGetErrorMessage(responseRaw).ConfigureAwait(false);

                throw new PaymentGatewayRequestException(responseRaw.StatusCode, responseRaw.ReasonPhrase, errorMessage);
            }

            var responseJson = await responseRaw.Content.ReadAsStringAsync().ConfigureAwait(false);

            var response = JsonSerializer.Deserialize <GetPaymentResponseModel>(responseJson);

            return(response);
        }