public HttpResponseMessage Post(CardInformationDTO card) { try { if (ModelState.IsValid) { PaymentProcessService payment = new PaymentProcessService(_repoWrapper, _mapper, _unitOfWork, _cheapPaymentGateway, _expensivePaymentGateway, _preminumServiceGateway); int status = payment.PaymentProcessBusinessLogic(card); if (status == 200) { return(new HttpResponseMessage(HttpStatusCode.OK)); } else if (status == 400) { return(new HttpResponseMessage(HttpStatusCode.BadRequest)); } else { return(new HttpResponseMessage(HttpStatusCode.InternalServerError)); } } else { return(new HttpResponseMessage(HttpStatusCode.BadRequest)); } } catch (Exception ex) { return(new HttpResponseMessage(HttpStatusCode.InternalServerError)); } }
public int PaymentProcessBusinessLogic(CardInformationDTO cardModel) { try { PaymentStatusDTO payment = new PaymentStatusDTO(); var cardTable = _mapper.Map <CardInformation>(cardModel); var paymentTable = _mapper.Map <PaymentStatus>(payment); if (Common.isValid((long.Parse(cardTable.CreditCardNumber)))) { if (cardTable.ExpirationDate.Year >= DateTime.Now.Year && cardTable.ExpirationDate.Month >= DateTime.Now.Month) { Task <int> finishedTask = null; if (cardModel.Amount <= 20) { Task <int> finishedTask1 = Task.Run(() => _cheapPaymentGateway.ProcessPayment(cardTable)); if (!finishedTask1.IsCompleted) { int result = finishedTask1.Result; paymentTable.Status = "Processed"; Save(cardTable, paymentTable); return(200); } } else if (cardModel.Amount >= 21 && cardModel.Amount <= 500) { finishedTask = Task.Run(() => _expensivePaymentGateway.ProcessPayment(cardTable)); if (!finishedTask.IsCompleted) { Task <int> finishedTask2 = Task.Run(() => _cheapPaymentGateway.ProcessPayment(cardTable)); int result = finishedTask2.Result; paymentTable.Status = "Pending"; Save(cardTable, paymentTable); return(400); } else { paymentTable.Status = "Processed"; Save(cardTable, paymentTable); return(200); } } else if (cardModel.Amount > 500) { var attempts = 3; do { try { attempts++; finishedTask = Task.Run(() => _preminumServiceGateway.ProcessPayment(cardTable)); if (finishedTask.IsCompleted) { paymentTable.Status = "Processed"; Save(cardTable, paymentTable); break; } } catch (Exception ex) { paymentTable.Status = "Failed"; Save(cardTable, paymentTable); if (attempts == 3) { throw; } return(500); } } while (true); return(200); } } else { paymentTable.Status = "Pending"; Save(cardTable, paymentTable); return(400); } } else { paymentTable.Status = "Pending"; Save(cardTable, paymentTable); return(400); } return(200); } catch (Exception) { return(500); } }