public async Task <PaymentStateDto> ProcessPayment(PaymentRequestDto paymentRequestDto) { var paymentEntity = _mapper.Map <PaymentRequestDto, Payment>(paymentRequestDto); paymentEntity = await _paymentRepository.Create(paymentEntity); var paymentStateEntity = new PaymentState() { Payment = paymentEntity, PaymentId = paymentEntity.PaymentId, CreatedDate = DateTime.Now, State = PaymentStateEnum.Pending.ToString() }; paymentStateEntity = await _paymentStateRepository.Create(paymentStateEntity); //save to db here //send request to various gateway here if (paymentRequestDto.Amount <= 20) { var paymentStateDto = await ProcessPaymentStateDto(_cheapPaymentGateway, paymentRequestDto, paymentEntity); return(paymentStateDto); } else if (paymentRequestDto.Amount > 20 && paymentRequestDto.Amount <= 500) { PaymentStateDto paymentStateDto = new PaymentStateDto() { PaymentState = PaymentStateEnum.Failed, PaymentStateDate = DateTime.Now }; int tryCount = 0; try { paymentStateDto = await ProcessPaymentStateDto(_expensivePaymentGateway, paymentRequestDto, paymentEntity); if (paymentStateDto != null && paymentStateDto.PaymentState == PaymentStateEnum.Processed) { return(paymentStateDto); } else { tryCount++; paymentStateDto = await ProcessPaymentStateDto(_cheapPaymentGateway, paymentRequestDto, paymentEntity); return(paymentStateDto); } } catch (Exception ex) { //log exception if (tryCount == 0) { paymentStateDto = await ProcessPaymentStateDto(_cheapPaymentGateway, paymentRequestDto, paymentEntity); return(paymentStateDto); } } return(paymentStateDto); } else { int tryCount = 0; PaymentStateDto paymentStateDto = new PaymentStateDto() { PaymentState = PaymentStateEnum.Failed, PaymentStateDate = DateTime.Now };; while (tryCount < 3) { try { paymentStateDto = await ProcessPaymentStateDto(_expensivePaymentGateway, paymentRequestDto, paymentEntity); if (paymentStateDto != null && paymentStateDto.PaymentState == PaymentStateEnum.Processed) { return(paymentStateDto); } } catch (Exception ex) { //log error } finally { tryCount++; } } return(paymentStateDto); } throw new Exception("Payment could not be processed"); }
public async Task Test_PaymentRequestService_Pay(PaymentRequestDto paymentRequestDto, PaymentStateDto cheapGatewayResponseDto, int timesCheapGatewayCalled, PaymentStateDto expensiveGatewayResponseDto, int timesExpensiveGatewayCalled, PaymentStateEnum expectedPaymentStateEnum) { //arrange _cheapPaymentGateway.Setup(s => s.ProcessPayment(paymentRequestDto)).Returns(cheapGatewayResponseDto); _expensivePaymentGateway.Setup(s => s.ProcessPayment(paymentRequestDto)).Returns(expensiveGatewayResponseDto); //act var paymentStateDto = await _paymentRequestService.Pay(paymentRequestDto); //assert Assert.IsNotNull(paymentStateDto); Assert.AreEqual(paymentStateDto.PaymentState, expectedPaymentStateEnum); _cheapPaymentGateway.Verify(s => s.ProcessPayment(paymentRequestDto), Times.Exactly(timesCheapGatewayCalled)); _expensivePaymentGateway.Verify(s => s.ProcessPayment(paymentRequestDto), Times.Exactly(timesExpensiveGatewayCalled)); }
public async Task <dynamic> ProcessPayment(RequestDto request) { if (request == null) { return(BadRequest(ModelState)); } if (!ValidateCreditCard(request.CreditCardNumber)) { ModelState.AddModelError("", "Credit Card Number is invalid!"); return(StatusCode(404, ModelState)); } if (!ValidateExpirationDate(request.ExpirationDate)) { ModelState.AddModelError("", "Card expired!"); return(StatusCode(404, ModelState)); } if (request.SecurityCode.Length > 0 && !ValidateSecurityCode(request.SecurityCode)) { ModelState.AddModelError("", "Security code is invalid!"); return(StatusCode(404, ModelState)); } if (!ValidateAmount(request.Amount)) { ModelState.AddModelError("", "Amount can't be negative!"); return(StatusCode(404, ModelState)); } var requestObj = _mapper.Map <Request>(request); var addRequest = _expensivePaymentGateway.AddRequest(requestObj); dynamic process; if (request.Amount <= 20) { process = await _cheapPaymentGateway.ProcessPayment(requestObj); } else if (request.Amount > 20 && request.Amount <= 500) { process = await _expensivePaymentGateway.ProcessPayment(requestObj); } else { process = await _premiumPaymentService.ProcessPayment(requestObj); } var state = new PaymentStateDto { RequestId = addRequest.Id, Status = process }; var stateObj = _mapper.Map <PaymentState>(state); _expensivePaymentGateway.AddPaymentState(stateObj); return(process); }
public async Task <PaymentStateDto> MakePayment(PaymentCreateDto paymentCreateDto) { var paymentEntity = _mapper.Map <PaymentCreateDto, Payment>(paymentCreateDto); paymentEntity = await _paymentRepository.CreatePaymentRecord(paymentEntity); var paymentStateEntity = new PaymentState() { Payment = paymentEntity, PaymentId = paymentEntity.PaymentId, DateCreated = DateTime.Now, State = PaymentStateEnum.Pending.ToString() }; paymentStateEntity = await _paymentStateRepository.CreatePaymentRecord(paymentStateEntity); //implement payment gateway processing and make records persistent on DB if (paymentCreateDto.Amount <= 20) { var paymentStateDto = await ProcessPaymentStateDto(_cheapPaymentGateway, paymentCreateDto, paymentEntity); return(paymentStateDto); } else if (paymentCreateDto.Amount > 20 && paymentCreateDto.Amount <= 500) { PaymentStateDto paymentStateDto = new PaymentStateDto() { PaymentState = PaymentStateEnum.Failed, PaymentStateDate = DateTime.Now }; int tryCount = 0; try { paymentStateDto = await ProcessPaymentStateDto(_expensivePaymentGateway, paymentCreateDto, paymentEntity); if (paymentStateDto != null && paymentStateDto.PaymentState == PaymentStateEnum.Processed) { return(paymentStateDto); } else { tryCount++; paymentStateDto = await ProcessPaymentStateDto(_cheapPaymentGateway, paymentCreateDto, paymentEntity); return(paymentStateDto); } } catch (Exception ex) { if (tryCount == 0) { paymentStateDto = await ProcessPaymentStateDto(_cheapPaymentGateway, paymentCreateDto, paymentEntity); return(paymentStateDto); } } return(paymentStateDto); } else { int tryCount = 0; PaymentStateDto paymentStateDto = new PaymentStateDto() { PaymentState = PaymentStateEnum.Failed, PaymentStateDate = DateTime.Now };; while (tryCount < 3) { try { paymentStateDto = await ProcessPaymentStateDto(_expensivePaymentGateway, paymentCreateDto, paymentEntity); if (paymentStateDto != null && paymentStateDto.PaymentState == PaymentStateEnum.Processed) { return(paymentStateDto); } } catch (Exception ex) { //_logger.LogError(ex, ex.Message); } finally { tryCount++; } } return(paymentStateDto); } throw new Exception("Payment could not be processed"); }