public async Task <IActionResult> PostPayment([FromBody] PostPaymentRequest request) { // todo: check if customer exists in database var creditCards = await DbContext.GetCreditCardByCardHolderName(request.CardHolderName).ToListAsync(); var creditCard = default(CreditCard); if (creditCards.Count > 1) { creditCard = creditCards.FirstOrDefault(item => item.CardNumber == request.CardNumber); if (creditCard == null) { return(BadRequest(string.Format("There isn't record for credit card with last 4 digits: {0}.", request.CardNumber))); } } else if (creditCards.Count == 1) { creditCard = creditCards.First(); } else { return(BadRequest(string.Format("There isn't record for credit card with last 4 digits: {0}.", request.CardNumber))); } // todo: check credit card info in database if (!creditCard.IsValid(request)) { return(BadRequest(string.Format("There is invalid data for credit card in this transaction."))); } // todo: check if customer has available credit (limit) if (!creditCard.HasFounds(request)) { return(BadRequest(string.Format("There isn't founds to approve this transaction."))); } var txn = new PaymentTransaction { PaymentTransactionID = Guid.NewGuid(), CreditCardID = creditCard.CreditCardID, ConfirmationID = Guid.NewGuid(), Amount = request.Amount, PaymentDateTime = DateTime.Now }; DbContext.PaymentTransactions.Add(txn); creditCard.AvailableFounds -= request.Amount; await DbContext.SaveChangesAsync(); return(Ok(new { txn.ConfirmationID, creditCard.Last4Digits })); }
public async Task <IActionResult> PostPaymentAsync([FromBody] PostPaymentRequest request) { Logger?.LogDebug("'{0}' has been invoked", nameof(PostPaymentAsync)); var creditCards = await DbContext.GetCreditCardByCardHolderName(request.CardHolderName).ToListAsync(); var creditCard = default(CreditCard); var last4Digits = request.CardNumber.Substring(request.CardNumber.Length - 4); if (creditCards.Count > 1) { creditCard = creditCards.FirstOrDefault(item => item.CardNumber == request.CardNumber); } else if (creditCards.Count == 1) { creditCard = creditCards.First(); } if (creditCard == null) { return(BadRequest(string.Format("There is not record for credit card with last 4 digits: {0}.", last4Digits))); } /* Check credit card information */ if (!creditCard.IsValid(request)) { return(BadRequest(string.Format("Invalid information for card payment."))); } /* Check if customer has available credit (limit) */ if (!creditCard.HasFounds(request)) { return(BadRequest(string.Format("There are no founds to approve the payment."))); } using (var txn = await DbContext.Database.BeginTransactionAsync()) { try { var paymentTxn = new PaymentTransaction { PaymentTransactionID = Guid.NewGuid(), CreditCardID = creditCard.CreditCardID, ConfirmationID = Guid.NewGuid(), Amount = request.Amount, PaymentDateTime = DateTime.Now }; DbContext.PaymentTransactions.Add(paymentTxn); creditCard.AvailableFounds -= request.Amount; await DbContext.SaveChangesAsync(); txn.Commit(); Logger?.LogInformation("The payment for card with last 4 digits: '{0}' was successfully. Confirmation #: {1}", last4Digits, paymentTxn.ConfirmationID); var response = new PaymentResponse { ConfirmationID = paymentTxn.ConfirmationID, PaymentDateTime = paymentTxn.PaymentDateTime, Last4Digits = creditCard.Last4Digits }; return(Ok(response)); } catch (Exception ex) { Logger?.LogCritical("There was an error on '{0}': {1}", nameof(PostPaymentAsync), ex); txn.Rollback(); return(new ObjectResult(ex.Message) { StatusCode = (int)HttpStatusCode.InternalServerError }); } } }