public async Task <PaymentResult> SendPayment(Contract.Payment payment) { var content = new StringContent( JsonConvert.SerializeObject(payment), Encoding.UTF8, "application/json"); using var client = _httpClientFactory.CreateClient(); HttpResponseMessage response; try { _logger.Log(LogLevel.Debug, $"Sending POST to {_uri}"); response = await client.PostAsync(_uri, content); } catch (Exception e) { _logger.Log(LogLevel.Error, "Failed to communicate with acquiring bank", e); throw; } if (response.StatusCode != HttpStatusCode.OK) { _logger.Log(LogLevel.Error, "Acquiring bank responded with unexpected status code", response); return(null); } var jsonContent = await response.Content.ReadAsStringAsync(); var result = JsonConvert.DeserializeObject <PaymentResult>(jsonContent); return(result); }
private Database.PaymentDetails CreatePaymentDetails(Contract.Payment payment, PaymentResult result) { var paymentDetails = _mapper.Map <Database.PaymentDetails>(payment); paymentDetails.PaymentId = result?.PaymentId; paymentDetails.PaymentStatus = result?.PaymentStatus; paymentDetails.MaskedCardNumber = _cardNumberMaskingService.MaskCardNumber(payment.CardNumber); paymentDetails.TimeStamp = DateTime.UtcNow; return(paymentDetails); }
public async Task <PaymentResult> ProcessNewPayment(Contract.Payment payment) { var result = await _paymentApiClient.SendPayment(payment); var paymentDetails = CreatePaymentDetails(payment, result); await _paymentRepository.SavePayment(paymentDetails); return(result); }
public async Task <ActionResult <PaymentResult> > ProcessPayment(Contract.Payment payment) { _logger.Log(LogLevel.Debug, "Incoming POST request"); var result = await _paymentProcessor.ProcessNewPayment(payment); if (result == null) { return(StatusCode(StatusCodes.Status500InternalServerError)); } return(result); }
public void Setup() { _apiClient = new Mock <IPaymentApiClient>(); _repository = new Mock <IPaymentRepository>(); _cardNumberMaskingService = new Mock <ICardNumberMaskingService>(); _mapper = new Mock <IMapper>(); _paymentProcessor = new PaymentProcessor(_apiClient.Object, _repository.Object, _mapper.Object, _cardNumberMaskingService.Object, new Mock <ILogger <PaymentProcessor> >().Object); _newPayment = new Contract.Payment(); _paymentResult = new PaymentResult(); _apiClient.Setup(c => c.SendPayment(_newPayment)).ReturnsAsync(_paymentResult); _mappedPayment = new PaymentDetails(); _mapper.Setup(m => m.Map <PaymentDetails>(_newPayment)).Returns(_mappedPayment); _maskedCardNumber = "1234********1234"; _cardNumberMaskingService.Setup(s => s.MaskCardNumber(_newPayment.CardNumber)).Returns(_maskedCardNumber); }