diff --git a/pom.xml b/pom.xml index 3aed88b..627bc17 100644 --- a/pom.xml +++ b/pom.xml @@ -82,6 +82,16 @@ 42.2.5 + + + + + commons-lang + commons-lang + 2.6 + + + diff --git a/sql/sequence_wallet_script.sql b/sql/sequence_wallet_script.sql index a5f95c8..c549d4f 100644 --- a/sql/sequence_wallet_script.sql +++ b/sql/sequence_wallet_script.sql @@ -2,7 +2,7 @@ -- DROP SEQUENCE public."T_WALLET_wallet_id_seq"; -CREATE SEQUENCE public."T_WALLET_wallet_id_seq"; +CREATE SEQUENCE public."t_wallet_id_seq"; -ALTER SEQUENCE public."T_WALLET_wallet_id_seq" +ALTER SEQUENCE public."t__wallet_id_seq" OWNER TO monnethicadmin; \ No newline at end of file diff --git a/sql/table_wallet_script.sql b/sql/table_wallet_script.sql index f61926f..9e87535 100644 --- a/sql/table_wallet_script.sql +++ b/sql/table_wallet_script.sql @@ -4,7 +4,7 @@ CREATE TABLE public."T_WALLET" ( - wallet_id integer NOT NULL DEFAULT nextval('"T_WALLET_wallet_id_seq"'::regclass), + wallet_id integer NOT NULL DEFAULT nextval('"t_wallet_id_seq"'::regclass), wallet_hash character varying(255) COLLATE pg_catalog."default" NOT NULL, user_hash character varying(255) COLLATE pg_catalog."default" NOT NULL, type character varying(255) COLLATE pg_catalog."default" NOT NULL, diff --git a/src/main/java/blockchain/query/QueryWrapper.java b/src/main/java/blockchain/query/QueryWrapper.java index 9bf456c..cd60fd8 100644 --- a/src/main/java/blockchain/query/QueryWrapper.java +++ b/src/main/java/blockchain/query/QueryWrapper.java @@ -17,12 +17,12 @@ import java.util.Collection; public class QueryWrapper { private static Logger logger = Logger.getLogger(QueryWrapper.class); - public String sendQuery(String functionName,String[] args) { + public String sendQuery(String functionName,String[] args) throws Exception { BasicConfigurator.configure(); UserContext user = Util.readUserContext(Config.ORG1, "admin"); String response = null; - try { + //try { FabricClientWrapper fabricClientWrapper = new FabricClientWrapper(user); ChannelClientWrapper channelClientWrapper = ChannelClientWrapper.setupChannel(fabricClientWrapper); @@ -49,10 +49,12 @@ public class QueryWrapper { logger.info("Query payload : " + response + " from peer : " + proposalResponse.getPeer().getName()); } } + /* } catch (Exception e) { e.printStackTrace(); return null; } + */ return response; } } diff --git a/src/main/java/database/Wallet/Wallet.java b/src/main/java/database/Wallet/Wallet.java index a4dc324..9ddda61 100644 --- a/src/main/java/database/Wallet/Wallet.java +++ b/src/main/java/database/Wallet/Wallet.java @@ -28,6 +28,11 @@ public class Wallet { public Wallet() { } + public Wallet(String type,String user_hash){ + this.type=type; + this.user_hash=user_hash; + } + public Wallet(String wallet_hash, String user_hash, String type, boolean isActive) { this.wallet_hash = wallet_hash; this.user_hash = user_hash; @@ -79,7 +84,7 @@ public class Wallet { this.sold = sold; } - public boolean isIs_active() { + public boolean is_active() { return is_active; } @@ -105,11 +110,6 @@ public class Wallet { @Override public String toString() { - return "Wallet{" + - "wallet_hash='" + wallet_hash + '\'' + - ", user_hash='" + user_hash + '\'' + - ", type='" + type + '\'' + - ", sold=" + sold + - '}'; + return "{wallet_hash:"+wallet_hash+",user_hash:"+user_hash+",type:"+type+",sold:"+sold+"}"; } } diff --git a/src/main/java/database/user/UserDao.java b/src/main/java/database/user/UserDao.java index 00cfc54..c11b6a5 100644 --- a/src/main/java/database/user/UserDao.java +++ b/src/main/java/database/user/UserDao.java @@ -85,7 +85,7 @@ public class UserDao { } public boolean checkUserPassword(String email, String password) throws Exception { - User user = getUser(email); + User user = getUserWithEmail(email); if(password.equals(user.getPassword())){ return true; }else{ @@ -93,7 +93,7 @@ public class UserDao { } } - public User getUser(String email) throws Exception { + public User getUserWithEmail(String email) throws Exception { if(!verifyUserExist(email)){ return null; }else{ @@ -105,6 +105,14 @@ public class UserDao { } } + public User getUserWithHash(String userHash) throws Exception { + userDao = createUserDaoConnection(); + QueryBuilder queryBuilder = userDao.queryBuilder(); + queryBuilder.where().eq("user_hash",userHash); + PreparedQuery preparedQuery = queryBuilder.prepare(); + return userDao.queryForFirst(preparedQuery); + } + public void approveUser (String email) throws Exception { userDao = createUserDaoConnection(); diff --git a/src/main/java/restImplementation/UserImplementation.java b/src/main/java/restImplementation/UserImplementation.java index ded563a..1ac40a3 100644 --- a/src/main/java/restImplementation/UserImplementation.java +++ b/src/main/java/restImplementation/UserImplementation.java @@ -3,9 +3,7 @@ package restImplementation; import blockchain.query.TransactionWrapper; import database.user.User; import database.user.UserDao; -import org.hyperledger.fabric.sdk.BlockEvent; import org.springframework.security.crypto.bcrypt.BCrypt; - import java.time.Instant; import java.util.HashMap; import java.util.Map; @@ -30,7 +28,7 @@ public class UserImplementation { //REGISTER IN REPLICA DB FOR BI Map response = new HashMap<>(); - User dbUser = userDao.getUser(user.getEmail()); // check if user exist + User dbUser = userDao.getUserWithEmail(user.getEmail()); // check if user exist if(dbUser != null){ response.put("response","false"); @@ -69,7 +67,7 @@ public class UserImplementation { public User getUser(String email, String password) throws Exception{ UserDao userDao = new UserDao(); - User user1 = userDao.getUser(email); + User user1 = userDao.getUserWithEmail(email); if(user1 != null){ String hash = user1.getPassword(); if(BCrypt.checkpw(password, hash)){ @@ -87,7 +85,7 @@ public class UserImplementation { UserDao userDao = new UserDao(); Map response = new HashMap<>(); - User userResponse = userDao.getUser(user.getEmail()); + User userResponse = userDao.getUserWithEmail(user.getEmail()); if(userResponse != null){ String hash = userResponse.getPassword(); diff --git a/src/main/java/restImplementation/WalletImplementation.java b/src/main/java/restImplementation/WalletImplementation.java new file mode 100644 index 0000000..2f01109 --- /dev/null +++ b/src/main/java/restImplementation/WalletImplementation.java @@ -0,0 +1,95 @@ +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.setSold(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.getSold().toString()); + 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.setSold(walletJson.getJsonNumber("sold").doubleValue()); + } + return wallet; + } + + //setSold + + + //transfer + + + //delete + + + private String generateWalletHash(String walletBuilderString){ + return BCrypt.hashpw(walletBuilderString,BCrypt.gensalt()); + } + + +} diff --git a/src/main/java/restService/WalletResource.java b/src/main/java/restService/WalletResource.java index ec244d1..0049af3 100644 --- a/src/main/java/restService/WalletResource.java +++ b/src/main/java/restService/WalletResource.java @@ -1,9 +1,75 @@ package restService; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import database.Wallet.Wallet; +import database.transaction.Transaction; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import restImplementation.WalletImplementation; + +import javax.json.JsonArray; +import javax.validation.Valid; +import java.util.Map; @RestController @RequestMapping(value = "/api/rest/wallet") public class WalletResource { + + @RequestMapping(value = "/create", method = RequestMethod.POST,produces = "application/json") + @ResponseStatus(HttpStatus.CREATED) + public ResponseEntity createWallet(@Valid @RequestBody Wallet wallet){ + try{ + WalletImplementation walletImplementation = new WalletImplementation(); + Map walletResponse = walletImplementation.createWallet(wallet); + + Wallet returnWallet = new Wallet(); + returnWallet.setWallet_hash(walletResponse.get("walletHash")); + returnWallet.setSold(Double.parseDouble(walletResponse.get("walletSold"))); + returnWallet.setType(walletResponse.get("walletType")); + + if(Boolean.parseBoolean(walletResponse.get("response"))){ + return ResponseEntity.status(HttpStatus.OK).body(returnWallet); + }else { + StringResponse responseS = new StringResponse("Wallet already exist"); + return ResponseEntity.status(HttpStatus.FOUND).body(responseS); + } + }catch (Exception e){ + StringResponse responseS = new StringResponse(e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(responseS); + } + } + + + @RequestMapping(value = "/getUserWallets", method = RequestMethod.GET, params = {"userHash"}, produces = "application/json") + @ResponseStatus(HttpStatus.OK) + public ResponseEntity getWallets(@RequestParam(value = "userHash") String userHash){ + WalletImplementation walletImplementation = new WalletImplementation(); + try{ + JsonArray wallets = walletImplementation.getAllUserWallets(userHash); + return ResponseEntity.status(HttpStatus.OK).body(wallets); + } catch (Exception e){ + StringResponse responseS = new StringResponse(e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(responseS); + } + } + + + @RequestMapping(value = "/getWallet", method = RequestMethod.GET, params = {"walletHash"}, produces = "application/json") + @ResponseStatus(HttpStatus.OK) + public ResponseEntity getWallet(@RequestParam(value = "walletHash") String walletHash){ + WalletImplementation walletImplementation = new WalletImplementation(); + try{ + Wallet walletResponse = walletImplementation.getWallet(walletHash); + if(walletResponse!=null){ + return ResponseEntity.status(HttpStatus.OK).body(walletResponse); + }else{ + return ResponseEntity.status(HttpStatus.NOT_FOUND).body("{\"response\":null}"); + } + }catch (Exception e){ + StringResponse responseS = new StringResponse(e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(responseS); + } + } + + } diff --git a/src/test/java/blockchain/query/User/ReadUserTest.java b/src/test/java/blockchain/query/User/ReadUserTest.java index 9c331be..5976b0b 100644 --- a/src/test/java/blockchain/query/User/ReadUserTest.java +++ b/src/test/java/blockchain/query/User/ReadUserTest.java @@ -22,7 +22,7 @@ public class ReadUserTest { try{ QueryWrapper queryWrapper = new QueryWrapper(); String functionName = "readUser"; - String[] args = new String[]{"$2a$10$N1C1lPeVMZ6oY4hSyX2cbuKBoGtJ0yWSXIgBaZ1RsI8QfaoTHCYi2"}; + String[] args = new String[]{"$2a$10$tpC8fILKiQqyApJ8/jTPE.YX0grzZsEtmWUyJAidmHOuWGQ4FBdfy"}; String response = queryWrapper.sendQuery(functionName,args); if(response != null){ JsonReader reader = Json.createReader(new StringReader(response)); diff --git a/src/test/java/restImplementation/UserImplementationTest.java b/src/test/java/restImplementation/UserImplementationTest.java index a45520c..b711a0b 100644 --- a/src/test/java/restImplementation/UserImplementationTest.java +++ b/src/test/java/restImplementation/UserImplementationTest.java @@ -12,6 +12,7 @@ import java.util.Map; public class UserImplementationTest { private static Logger logger = Logger.getLogger(UserImplementationTest.class); + /* @Test public void RegisterUserWithoutPhone() { @@ -30,8 +31,9 @@ public class UserImplementationTest { logger.warn("Error: "+e); } } + */ - + /* @Test public void RegisterUserWithPhone() { BasicConfigurator.configure(); @@ -66,14 +68,14 @@ public class UserImplementationTest { logger.warn("Error: "+e); } } + */ - /* @Test public void approveUserTest() { BasicConfigurator.configure(); - User userTest = new User("TotoEmail@gmail.com","$2a$10$Hx5w0c6WM0gJkd0/ZKXZsOyes7UdxYm95TVdG2cBwNjtTk007WKuS"); + User userTest = new User("TotoEmail@gmail.com","$2a$10$tpC8fILKiQqyApJ8/jTPE.YX0grzZsEtmWUyJAidmHOuWGQ4FBdfy"); UserImplementation userImplementation = new UserImplementation(); try { userImplementation.approveUser(userTest); @@ -81,7 +83,9 @@ public class UserImplementationTest { logger.warn("Error: "+e); } } - */ + + /* + @Test public void deleteUserTest(){ @@ -93,11 +97,8 @@ public class UserImplementationTest { } catch (Exception e){ logger.warn("Error: "+e); } - - - - } + */ } diff --git a/src/test/java/restImplementation/WalletImplementationTest.java b/src/test/java/restImplementation/WalletImplementationTest.java new file mode 100644 index 0000000..212a37c --- /dev/null +++ b/src/test/java/restImplementation/WalletImplementationTest.java @@ -0,0 +1,38 @@ +package restImplementation; + +import database.Wallet.Wallet; +import org.apache.log4j.BasicConfigurator; +import org.apache.log4j.Logger; +import org.junit.Ignore; +import org.junit.Test; + +import java.util.Map; + +@Ignore +public class WalletImplementationTest { + private static Logger logger = Logger.getLogger(UserImplementationTest.class); + + @Test + public void CreateWallet() { + BasicConfigurator.configure(); + Wallet wallet = new Wallet("client","$2a$10$tpC8fILKiQqyApJ8/jTPE.YX0grzZsEtmWUyJAidmHOuWGQ4FBdfy"); + + WalletImplementation walletImplementation = new WalletImplementation(); + try{ + Map walletResponse = walletImplementation.createWallet(wallet); + Wallet returnWallet = new Wallet(); + returnWallet.setWallet_hash(walletResponse.get("walletHash")); + returnWallet.setSold(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 type: "+returnWallet.getType()); + } catch (Exception e){ + logger.warn("Error: "+e.getMessage()); + } + + + } + +}