java-api/src/main/java/restImplementation/WalletImplementation.java
2019-04-03 21:42:09 +02:00

155 lines
5.8 KiB
Java

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<String,String> createWallet(Wallet wallet) throws Exception {
Map<String,String> 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());
}
}