public async Task <String> MakePayment(PaymentDetails paymentDetails) { String response = String.Empty; try { //Using Custom Credit Card Validation Instead of CreditCardAttribute if (!String.IsNullOrEmpty(paymentDetails?.CreditCardNumber) && Validation.IsCardNumberValid(paymentDetails.CreditCardNumber)) { if (paymentDetails.Amount > 0 && Validation.IsExpirationDateValid(paymentDetails.ExpirationDate)) { //String encryptedCardNumber = _Encryption.EncryptAndSave(paymentDetails.CreditCardNumber); String encryptedCardNumber = paymentDetails.CreditCardNumber; //Checking for existing user. var existing_user = _PaymentContext.People.Include(x => x.CardInformation) .Where(x => x.FullName == paymentDetails.CardHolderName) .FirstOrDefault(); if (existing_user is null) { // if the user doesn't exist , insert into the database existing_user = AddNewUser(paymentDetails, encryptedCardNumber); } else { // checking whether the card exists or not var card = existing_user.CardInformation.Where(x => x.CreditCardNumber == encryptedCardNumber).FirstOrDefault(); if (card is null) { CardInformation cardInformation = new CardInformation() { CreditCardNumber = encryptedCardNumber, SecurityCode = paymentDetails.SecurityCode }; existing_user.CardInformation.Add(cardInformation); existing_user = _PeopleRepo.UpdateAndGet(existing_user); } } //Creating a new transaction Transactions NewTransaction = new Transactions(); _TransactionRepo.Insert(NewTransaction); _TransactionRepo.Save(); existing_user.CardInformation.Where(x => x.CreditCardNumber == encryptedCardNumber).FirstOrDefault().Transactions.Add(NewTransaction); existing_user = _PeopleRepo.UpdateAndGet(existing_user); //Payment Gateway Call _PaymentGateway = _PaymentGatewayFactory.GetPaymentGateway(paymentDetails.Amount); response = await _PaymentGateway.GetPaymentStatus(paymentDetails); //Updating the response NewTransaction.PaymentState = response; _TransactionRepo.Update(NewTransaction); _TransactionRepo.Save(); } } else { response = "Invalid Card Number"; } } catch (Exception ex) { response = ex.Message; } return(response); }