package restImplementation; import blockchain.query.QueryWrapper; import blockchain.query.TransactionWrapper; import database.transaction.Transaction; import database.transaction.TransactionDao; import database.user.User; import database.user.UserDao; import org.hyperledger.fabric.sdk.BlockEvent; import org.springframework.security.crypto.bcrypt.BCrypt; import javax.json.Json; import javax.json.JsonObject; import javax.json.JsonReader; import java.io.StringReader; import java.time.Instant; import java.util.HashMap; import java.util.List; public class TransactionImplementation { public HashMap sendTransaction(String sourceUserHash, String sourceUserPwd, String sourceWalletHash, String destinationWalletHash, double amount, String transactionUnit) throws Exception { TransactionWrapper transactionWrapper = new TransactionWrapper(); QueryWrapper queryWrapper = new QueryWrapper(); HashMap returnResponse = new HashMap(); UserDao userDao = new UserDao(); User user = userDao.getUserWithHash(sourceUserHash); if(user != null){ if(BCrypt.checkpw(sourceUserPwd, user.getPassword())){ String response = queryWrapper.sendQuery("readWallet", new String[]{sourceWalletHash}); if (response != null){ JsonReader reader = Json.createReader(new StringReader(response)); JsonObject walletInfo = reader.readObject(); double balance = walletInfo.getJsonNumber("balance").doubleValue(); if(balance-amount<0){ //CHECK WALLET BALANCE returnResponse.put("success",false); returnResponse.put("message","Not enough money"); } else { //CHECK DEST WALLET String responseDestWallet = queryWrapper.sendQuery("readWallet", new String[]{destinationWalletHash}); if(responseDestWallet!=null){ BlockEvent.TransactionEvent eventResponse = transactionWrapper.sendTransaction("transaction",new String[]{sourceWalletHash,destinationWalletHash,String.valueOf(amount)}); String txID = eventResponse.getTransactionID(); Transaction transaction = new Transaction(); long now = Instant.now().toEpochMilli(); transaction.setTransaction_date(now); transaction.setTransaction_from(sourceWalletHash); transaction.setTransaction_to(destinationWalletHash); transaction.setTransaction_amount(amount); transaction.setTransaction_hash(txID); transaction.setTransaction_unit(transactionUnit); TransactionDao transactionDao = new TransactionDao(); transactionDao.addTransaction(transaction); returnResponse.put("success",true); returnResponse.put("message",txID); WalletImplementation walletImplementation = new WalletImplementation(); walletImplementation.updateWalletBalance(sourceWalletHash,destinationWalletHash,amount); } else { returnResponse.put("success",false); returnResponse.put("message","Destination wallet doesn't exist"); } } } else { returnResponse.put("success",false); returnResponse.put("message","Error in user wallet"); } } else { throw new Exception("NOT ALLOWED"); } } else { throw new Exception("NOT ALLOWED"); } return returnResponse; } public List getSentTransaction(String userHash) throws Exception { TransactionDao transactionDao = new TransactionDao(); return transactionDao.getUserSentTransaction(userHash); } public List getReceivedTransaction(String userHash) throws Exception { TransactionDao transactionDao = new TransactionDao(); return transactionDao.getUserReceivedTransaction(userHash); } public Transaction getTransaction(String userHash, String transactionHash) throws Exception { TransactionDao transactionDao = new TransactionDao(); return transactionDao.getTransaction(userHash,transactionHash); } public List getLatestTransactions(String userHash) throws Exception { TransactionDao transactionDao = new TransactionDao(); return transactionDao.getTenLastUserTransactions(userHash); } public List getUserTransactions(String userHash) throws Exception { TransactionDao transactionDao = new TransactionDao(); return transactionDao.getUserTransactions(userHash); } }