public async Task <IActionResult> ProcessPayment([FromBody] PaymentToCreateDTO model) { model.CreditCardNumber = Regex.Replace(model.CreditCardNumber, @"[^\d]", ""); var validator = new PaymentValidator(); var validate = await validator.ValidateAsync(model); if (!validate.IsValid) { var errors = validator.GetErrorMessage(validate.Errors); return(BadRequest(new { message = "Bad request", errors })); } Payment payment; try { payment = _mapper.Map <Payment>(model); if (model.Amount < 21) { await _cheapPayment.ProcessPayment(payment); } else if (model.Amount < 501) { try { await _expensivePayment.ProcessPayment(payment); } catch (Exception) { await _cheapPayment.ProcessPayment(payment); } } else { try { await _premiumPayment.ProcessPayment(payment); } catch (Exception) { int i = 1; do { var response = await _cheapPayment.ProcessPayment(payment); if (response) { break; } i++; }while (i < 4); } } } catch (Exception e) { _logger.LogError(e.Message); return(StatusCode(500, new { message = "Internal error", errors = "Data access processing error" })); } try { var result = await _transactionRepository.GetByPaymentId(payment.Id); return(Ok(new { message = "Success", data = result })); } catch (Exception e) { _logger.LogError(e.Message); return(StatusCode(500, new { message = "Internal error", errors = "Data access processing error" })); } }