package restImplementation; import blockchain.query.QueryWrapper; import blockchain.query.TransactionWrapper; import database.Wallet.Wallet; import database.Wallet.WalletDao; import database.user.User; import database.user.UserDao; import org.apache.commons.lang.RandomStringUtils; import org.springframework.security.crypto.bcrypt.BCrypt; import javax.json.Json; import javax.json.JsonArray; import javax.json.JsonObject; import javax.json.JsonReader; import java.io.StringReader; import java.time.Instant; import java.util.HashMap; import java.util.List; import java.util.Map; public class WalletImplementation { public Map createWallet(Wallet wallet) throws Exception { Map response = new HashMap<>(); TransactionWrapper transactionWrapper = new TransactionWrapper(); WalletDao walletDao = new WalletDao(); UserDao userDao = new UserDao(); User user = userDao.getUserWithHash(wallet.getUser_hash()); wallet.setWallet_hash(generateWalletHash(user.getName()+wallet.getType()+user.getFirstname()+ RandomStringUtils.randomAlphabetic(10))); transactionWrapper.sendTransaction("initWallet",new String[]{wallet.getWallet_hash(),wallet.getType(),wallet.getUser_hash()}); //Create Wallet in Blockchain wallet.setBalance(0.0); wallet.setIs_active(true); long now = Instant.now().toEpochMilli(); wallet.setCreation_date(now); wallet.setModification_date(now); walletDao.addWallet(wallet); // add wallet to replica DB response.put("walletHash",wallet.getWallet_hash()); response.put("walletType",wallet.getType()); response.put("walletSold",wallet.getBalance().toString()); response.put("ownerHash",wallet.getUser_hash()); response.put("response","true"); return response; } //getAllUserWallets public JsonArray getAllUserWallets(String userHash) throws Exception { QueryWrapper queryWrapper = new QueryWrapper(); JsonArray walletList = null; String response = queryWrapper.sendQuery("queryWalletsByOwner",new String[]{userHash}); if(response != null) { JsonReader reader = Json.createReader(new StringReader(response)); walletList = reader.readArray(); } return walletList; } //getWallet public Wallet getWallet(String walletHash) throws Exception { QueryWrapper queryWrapper = new QueryWrapper(); String response = queryWrapper.sendQuery("readWallet",new String[]{walletHash}); Wallet wallet = new Wallet(); if(response != null) { JsonReader reader = Json.createReader(new StringReader(response)); JsonObject walletJson = reader.readObject(); wallet.setWallet_hash(walletJson.getString("id")); wallet.setUser_hash(walletJson.getString("owner")); wallet.setType(walletJson.getString("walletType")); wallet.setBalance(walletJson.getJsonNumber("sold").doubleValue()); } return wallet; } //setBalance public void setBalanceToWallet(String walletHash, double amount) throws Exception { double newBalance = 0.0; TransactionWrapper transactionWrapper = new TransactionWrapper(); System.out.println("String.valueOf(amount) : "+String.valueOf(amount)); System.out.println("walletHash : "+walletHash); transactionWrapper.sendTransaction("setSoldOnWallet",new String[]{walletHash,String.valueOf(amount)}); Wallet wallet = getWallet(walletHash); if(wallet!=null){ newBalance=wallet.getBalance(); WalletDao walletDao = new WalletDao(); walletDao.updateWalletBalance(walletHash,newBalance); } else { throw new Exception("ERROR QUERY WALLET"); } } //update DB balance after transaction public void updateWalletBalance(String sourceWalletHash, String destinationWalletHash, double amount) throws Exception { WalletDao walletDao = new WalletDao(); double balanceWalletSource = walletDao.getWallet(sourceWalletHash).getBalance(); double balanceWalletDestination = walletDao.getWallet(destinationWalletHash).getBalance(); double newBalanceWalletSource = balanceWalletSource-amount; double newBalanceWalletDestination = balanceWalletDestination+amount; walletDao.updateWalletBalance(sourceWalletHash,newBalanceWalletSource); walletDao.updateWalletBalance(destinationWalletHash,newBalanceWalletDestination); } //transfer public void transferWallet(String walletHash, String newUserHash) throws Exception { TransactionWrapper transactionWrapper = new TransactionWrapper(); transactionWrapper.sendTransaction("transferWallet",new String[]{walletHash,newUserHash}); WalletDao walletDao = new WalletDao(); walletDao.transferWallet(walletHash,newUserHash); } //delete public void deleteWallet(String walletHash, String userHash) throws Exception { TransactionWrapper transactionWrapper = new TransactionWrapper(); transactionWrapper.sendTransaction("deleteWallet",new String[]{walletHash}); WalletDao walletDao = new WalletDao(); walletDao.deleteWallet(walletHash,userHash); } //getAll public JsonArray getAllWallets() throws Exception { QueryWrapper queryWrapper = new QueryWrapper(); JsonArray walletList = null; String response = queryWrapper.sendQuery("query_all_wallets",new String[]{}); if(response != null) { JsonReader reader = Json.createReader(new StringReader(response)); walletList = reader.readArray(); } return walletList; } private String generateWalletHash(String walletBuilderString){ return BCrypt.hashpw(walletBuilderString,BCrypt.gensalt()); } }