From 5be8d03dd3b993b49d42377240919b9ae4adf803 Mon Sep 17 00:00:00 2001 From: GME Date: Tue, 2 Apr 2019 20:25:03 +0200 Subject: [PATCH] Setup transaction api base --- .../java/blockchain/query/QueryWrapper.java | 49 +++++----- .../TransactionImplementation.java | 94 +++++++++++++++++++ .../java/restService/TransactionResource.java | 31 +++++- src/main/java/restService/UserResource.java | 2 +- .../query/Wallet/ReadWalletTest.java | 45 ++++++++- .../GetUserAssociationTest.java | 2 + .../GetUserWalletsTest.java | 2 + .../restImplementation/GetWalletSoldTest.java | 2 + .../WalletImplementationTest.java | 4 +- 9 files changed, 196 insertions(+), 35 deletions(-) create mode 100644 src/main/java/restImplementation/TransactionImplementation.java diff --git a/src/main/java/blockchain/query/QueryWrapper.java b/src/main/java/blockchain/query/QueryWrapper.java index cd60fd8..720e752 100644 --- a/src/main/java/blockchain/query/QueryWrapper.java +++ b/src/main/java/blockchain/query/QueryWrapper.java @@ -22,39 +22,32 @@ public class QueryWrapper { UserContext user = Util.readUserContext(Config.ORG1, "admin"); String response = null; - //try { - FabricClientWrapper fabricClientWrapper = new FabricClientWrapper(user); - ChannelClientWrapper channelClientWrapper = ChannelClientWrapper.setupChannel(fabricClientWrapper); + FabricClientWrapper fabricClientWrapper = new FabricClientWrapper(user); + ChannelClientWrapper channelClientWrapper = ChannelClientWrapper.setupChannel(fabricClientWrapper); - ChaincodeID chaincodeID = ChaincodeID.newBuilder().setName(Config.CHAINCODE_NAME).build(); - QueryByChaincodeRequest queryByChaincodeRequest = fabricClientWrapper.getClient().newQueryProposalRequest(); - queryByChaincodeRequest.setArgs(args); - queryByChaincodeRequest.setFcn(functionName); - queryByChaincodeRequest.setChaincodeID(chaincodeID); + ChaincodeID chaincodeID = ChaincodeID.newBuilder().setName(Config.CHAINCODE_NAME).build(); + QueryByChaincodeRequest queryByChaincodeRequest = fabricClientWrapper.getClient().newQueryProposalRequest(); + queryByChaincodeRequest.setArgs(args); + queryByChaincodeRequest.setFcn(functionName); + queryByChaincodeRequest.setChaincodeID(chaincodeID); - Collection queryProposals; + Collection queryProposals; - try { - queryProposals = channelClientWrapper.queryByChainCode(queryByChaincodeRequest); - } catch (Exception e) { - throw new Exception(e); - } - - for (ProposalResponse proposalResponse : queryProposals) { - if (!proposalResponse.isVerified() || proposalResponse.getStatus() != ChaincodeResponse.Status.SUCCESS) { - logger.error("Failed query proposal from peer " + proposalResponse.getPeer().getName() + " status : " + proposalResponse.getStatus() + - ". Message : " + proposalResponse.getMessage() + ". Was verified : " + proposalResponse.isVerified()); - } else { - response = new String(proposalResponse.getChaincodeActionResponsePayload()); - logger.info("Query payload : " + response + " from peer : " + proposalResponse.getPeer().getName()); - } - } - /* + try { + queryProposals = channelClientWrapper.queryByChainCode(queryByChaincodeRequest); } catch (Exception e) { - e.printStackTrace(); - return null; + throw new Exception(e); + } + + for (ProposalResponse proposalResponse : queryProposals) { + if (!proposalResponse.isVerified() || proposalResponse.getStatus() != ChaincodeResponse.Status.SUCCESS) { + logger.error("Failed query proposal from peer " + proposalResponse.getPeer().getName() + " status : " + proposalResponse.getStatus() + + ". Message : " + proposalResponse.getMessage() + ". Was verified : " + proposalResponse.isVerified()); + } else { + response = new String(proposalResponse.getChaincodeActionResponsePayload()); + logger.info("Query payload : " + response + " from peer : " + proposalResponse.getPeer().getName()); + } } - */ return response; } } diff --git a/src/main/java/restImplementation/TransactionImplementation.java b/src/main/java/restImplementation/TransactionImplementation.java new file mode 100644 index 0000000..a97e3d3 --- /dev/null +++ b/src/main/java/restImplementation/TransactionImplementation.java @@ -0,0 +1,94 @@ +package restImplementation; + +import blockchain.query.QueryWrapper; +import blockchain.query.TransactionWrapper; +import database.transaction.Transaction; +import database.transaction.TransactionDao; +import org.hyperledger.fabric.sdk.BlockEvent; + +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 sourceWalletHash, String destinationWalletHash, double amount, String transactionUnit) throws Exception { + TransactionWrapper transactionWrapper = new TransactionWrapper(); + HashMap returnResponse = new HashMap(); + + QueryWrapper queryWrapper = new QueryWrapper(); + 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("sold").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.setTransactionDate(now); + transaction.setTransactionFrom(sourceWalletHash); + transaction.setTransactionTo(destinationWalletHash); + transaction.setTransactionAmount(amount); + transaction.setTransactionHash(txID); + transaction.setTransactionUnit(transactionUnit); + + + TransactionDao transactionDao = new TransactionDao(); + transactionDao.addTransaction(transaction); + + returnResponse.put("success",true); + returnResponse.put("message",txID); + } 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"); + } + 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); + } + +} diff --git a/src/main/java/restService/TransactionResource.java b/src/main/java/restService/TransactionResource.java index 74a68d9..2571298 100644 --- a/src/main/java/restService/TransactionResource.java +++ b/src/main/java/restService/TransactionResource.java @@ -1,10 +1,37 @@ package restService; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import database.transaction.Transaction; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import restImplementation.TransactionImplementation; + +import javax.validation.Valid; +import java.util.HashMap; @RestController @RequestMapping(value = "/api/rest/transaction") public class TransactionResource { + @RequestMapping(value = "/send", method = RequestMethod.POST, produces = "application/json") + @ResponseStatus(HttpStatus.CREATED) + public ResponseEntity saveTransaction(@Valid @RequestBody Transaction transaction){ + TransactionImplementation transactionImplementation = new TransactionImplementation(); + try{ + HashMap mapResponse = transactionImplementation.sendTransaction(transaction.getTransactionFrom(),transaction.getTransactionTo(),transaction.getTransactionAmount(),transaction.getTransactionUnit()); + + if(Boolean.parseBoolean(mapResponse.get("success").toString())){ + return ResponseEntity.status(HttpStatus.OK).body("{\"response\":\""+mapResponse.get("message")+"\"}"); + }else { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("{\"response\":\""+mapResponse.get("message")+"\"}"); + } + }catch (Exception e){ + StringResponse responseS = new StringResponse(e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(responseS); + } + } + + + + } diff --git a/src/main/java/restService/UserResource.java b/src/main/java/restService/UserResource.java index fcd8d19..db19ef3 100644 --- a/src/main/java/restService/UserResource.java +++ b/src/main/java/restService/UserResource.java @@ -130,6 +130,6 @@ public class UserResource { @PostMapping(value = "/update") @ResponseStatus(HttpStatus.OK) public ResponseEntity updateUser(@RequestBody User user){ - return new ResponseEntity(null, HttpStatus.OK); + return new ResponseEntity(null, HttpStatus.SERVICE_UNAVAILABLE); } } diff --git a/src/test/java/blockchain/query/Wallet/ReadWalletTest.java b/src/test/java/blockchain/query/Wallet/ReadWalletTest.java index f91a73b..fbc1907 100644 --- a/src/test/java/blockchain/query/Wallet/ReadWalletTest.java +++ b/src/test/java/blockchain/query/Wallet/ReadWalletTest.java @@ -7,20 +7,61 @@ import org.apache.log4j.Logger; import org.junit.Ignore; import org.junit.Test; +import javax.json.Json; +import javax.json.JsonObject; +import javax.json.JsonReader; +import java.io.StringReader; + @Ignore public class ReadWalletTest { private static Logger logger = Logger.getLogger(ReadWalletTest.class); + /* @Test - public void TestReadWalletTest() { + public void SuccessTestReadWalletTest() { BasicConfigurator.configure(); try{ QueryWrapper queryWrapper = new QueryWrapper(); String functionName = "readWallet"; String[] args = new String[]{"qerh654d5f5h46q4fdh6h65fh00"}; String response = queryWrapper.sendQuery(functionName,args); - logger.info("response : "+response); + + if(response!=null){ + JsonReader reader = Json.createReader(new StringReader(response)); + JsonObject walletInfo = reader.readObject(); + double balance = walletInfo.getJsonNumber("sold").doubleValue(); + + logger.info("response : "+response); + logger.info("balance : "+balance); + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + */ + + @Test + public void FailTestReadWalletTest() { + BasicConfigurator.configure(); + try{ + QueryWrapper queryWrapper = new QueryWrapper(); + String functionName = "readWallet"; + String[] args = new String[]{"tttt"}; + String response = queryWrapper.sendQuery(functionName,args); + + if(response!=null){ + JsonReader reader = Json.createReader(new StringReader(response)); + JsonObject walletInfo = reader.readObject(); + double balance = walletInfo.getJsonNumber("sold").doubleValue(); + + logger.info("response : "+response); + logger.info("balance : "+balance); + } else { + logger.warn("ERROR"); + } + }catch (Exception e){ e.printStackTrace(); } diff --git a/src/test/java/restImplementation/GetUserAssociationTest.java b/src/test/java/restImplementation/GetUserAssociationTest.java index 82d253c..abb9fb3 100644 --- a/src/test/java/restImplementation/GetUserAssociationTest.java +++ b/src/test/java/restImplementation/GetUserAssociationTest.java @@ -11,10 +11,12 @@ import java.util.List; public class GetUserAssociationTest { private static Logger logger = Logger.getLogger(GetUserAssociationTest.class); + /* @Test public void GetUserAssociationTest() { BlockchainQueryImplementation queryImplementation = new BlockchainQueryImplementation(); String association = queryImplementation.getUserAssociation("bitman"); logger.info("association : "+association); } + */ } diff --git a/src/test/java/restImplementation/GetUserWalletsTest.java b/src/test/java/restImplementation/GetUserWalletsTest.java index 9f750f7..cf9c544 100644 --- a/src/test/java/restImplementation/GetUserWalletsTest.java +++ b/src/test/java/restImplementation/GetUserWalletsTest.java @@ -11,6 +11,7 @@ import java.util.List; public class GetUserWalletsTest { private static Logger logger = Logger.getLogger(GetWalletSoldTest.class); + /* @Test public void GetUserWalletsTest() { BlockchainQueryImplementation queryImplementation = new BlockchainQueryImplementation(); @@ -19,4 +20,5 @@ public class GetUserWalletsTest { logger.info("walletHash : "+w.get("walletHash")+". walletType : "+w.get("walletType")+". sold : "+w.get("sold")); } } + */ } diff --git a/src/test/java/restImplementation/GetWalletSoldTest.java b/src/test/java/restImplementation/GetWalletSoldTest.java index 8914a07..0a2ee44 100644 --- a/src/test/java/restImplementation/GetWalletSoldTest.java +++ b/src/test/java/restImplementation/GetWalletSoldTest.java @@ -10,11 +10,13 @@ import org.junit.Test; public class GetWalletSoldTest { private static Logger logger = Logger.getLogger(GetWalletSoldTest.class); + /* @Test public void GetWalletSold() { BlockchainQueryImplementation queryImplementation = new BlockchainQueryImplementation(); Double sold = queryImplementation.getWalletSold("qerh654d5f5h46q4fdh6h65fh00"); logger.info("result sold : "+sold); } + */ } diff --git a/src/test/java/restImplementation/WalletImplementationTest.java b/src/test/java/restImplementation/WalletImplementationTest.java index 212a37c..d2f8667 100644 --- a/src/test/java/restImplementation/WalletImplementationTest.java +++ b/src/test/java/restImplementation/WalletImplementationTest.java @@ -22,11 +22,11 @@ public class WalletImplementationTest { Map walletResponse = walletImplementation.createWallet(wallet); Wallet returnWallet = new Wallet(); returnWallet.setWallet_hash(walletResponse.get("walletHash")); - returnWallet.setSold(Double.parseDouble(walletResponse.get("walletSold"))); + returnWallet.setBalance(Double.parseDouble(walletResponse.get("walletSold"))); returnWallet.setType(walletResponse.get("walletType")); logger.info("wallet hash: "+returnWallet.getWallet_hash()); - logger.info("wallet sold: "+returnWallet.getSold()); + logger.info("wallet sold: "+returnWallet.getBalance()); logger.info("wallet type: "+returnWallet.getType()); } catch (Exception e){ logger.warn("Error: "+e.getMessage());