From b5cfd203340c102647e1b6f5e12a2e3a6a3c47ee Mon Sep 17 00:00:00 2001 From: Raditss <raditya.naufal.a@gmail.com> Date: Mon, 13 Nov 2023 20:26:40 +0700 Subject: [PATCH] refactor to interface based --- src/main/java/org/toco/Main.java | 7 +- .../org/toco/publisher/service_publisher.java | 11 ++ .../java/org/toco/service/toco_service.java | 39 ++++++ .../org/toco/service/toco_service_impl.java | 122 ++++++++++++++++++ .../java/org/toco/service/transaction.java | 3 +- 5 files changed, 177 insertions(+), 5 deletions(-) create mode 100644 src/main/java/org/toco/publisher/service_publisher.java create mode 100644 src/main/java/org/toco/service/toco_service.java create mode 100644 src/main/java/org/toco/service/toco_service_impl.java diff --git a/src/main/java/org/toco/Main.java b/src/main/java/org/toco/Main.java index 0ef02db..cdbb1da 100644 --- a/src/main/java/org/toco/Main.java +++ b/src/main/java/org/toco/Main.java @@ -1,12 +1,11 @@ package org.toco; -import org.toco.publisher.gemsPublisher; -import org.toco.publisher.transactionPublisher; + +import org.toco.publisher.service_publisher; public class Main { public static void main(String[] args) { System.out.println("server started"); - gemsPublisher.publish(); - transactionPublisher.publish(); + service_publisher.publish(); System.out.println("all services online"); } } \ No newline at end of file diff --git a/src/main/java/org/toco/publisher/service_publisher.java b/src/main/java/org/toco/publisher/service_publisher.java new file mode 100644 index 0000000..3bb0add --- /dev/null +++ b/src/main/java/org/toco/publisher/service_publisher.java @@ -0,0 +1,11 @@ +package org.toco.publisher; + +import javax.xml.ws.Endpoint; + +public class service_publisher { + public static void publish() { + System.out.println("publishing service"); + Endpoint.publish("http://0.0.0.0:8080/service", new org.toco.service.toco_service_impl()); + System.out.println("service published"); + } +} diff --git a/src/main/java/org/toco/service/toco_service.java b/src/main/java/org/toco/service/toco_service.java new file mode 100644 index 0000000..25a17bc --- /dev/null +++ b/src/main/java/org/toco/service/toco_service.java @@ -0,0 +1,39 @@ +package org.toco.service; + +import org.toco.entity.*; + +import javax.jws.WebService; +import javax.jws.WebMethod; +import javax.jws.WebParam; +import javax.jws.soap.SOAPBinding; +import javax.jws.soap.SOAPBinding.Style; +import javax.jws.soap.SOAPBinding.ParameterStyle; + + +@WebService +@SOAPBinding(style = Style.DOCUMENT, parameterStyle = ParameterStyle.WRAPPED) +public interface toco_service { + @WebMethod + public String addGems( + @WebParam(name = "user_id") Integer user_id, + @WebParam(name = "gem") Integer gem + ); + + @WebMethod + public Integer getGems( + @WebParam(name = "user_id") Integer user_id + ); + + @WebMethod + public String createTransaction( + @WebParam(name = "user_id") Integer user_id, + @WebParam(name = "amount") Integer amount, + @WebParam(name = "type") String type //add gems / buy item + ); + + @WebMethod + public transaction_entity[] getTransactions( + @WebParam(name = "user_id") Integer user_id + ); + +} diff --git a/src/main/java/org/toco/service/toco_service_impl.java b/src/main/java/org/toco/service/toco_service_impl.java new file mode 100644 index 0000000..b4dffc4 --- /dev/null +++ b/src/main/java/org/toco/service/toco_service_impl.java @@ -0,0 +1,122 @@ +package org.toco.service; + +import org.toco.model.*; +import org.toco.entity.*; + + +import javax.jws.WebService; +import javax.jws.WebMethod; +import javax.annotation.Resource; +import javax.xml.ws.WebServiceContext; +import javax.xml.ws.handler.MessageContext; +import com.sun.net.httpserver.HttpExchange; +import com.sun.xml.ws.developer.JAXWSProperties; +import java.net.InetAddress; +import java.net.InetSocketAddress; + +@WebService(endpointInterface = "org.toco.service.toco_service") +public class toco_service_impl implements toco_service { + + @Resource + WebServiceContext wsctx; + + @Override + public String addGems(Integer user_id, Integer gem) { + if (validateApiKey()){ + userGems_Entity userGems = new userGems_Entity(user_id, gem); + userGems_model userGemsModel = new userGems_model(); + if (userGemsModel.checkUser(user_id)) { + Integer currentGems = userGemsModel.getUserGems(user_id); + userGems.setGem(currentGems + gem); + userGemsModel.update(userGems); + addLoggging("User with id " + user_id + " added " + gem + " gems"); + return "success"; + } else { + userGemsModel.insert(userGems); + addLoggging("User with id " + user_id + " added " + gem + " gems"); + return "success"; + } + } + else { + addLoggging("User with id " + user_id + " tried to add " + gem + " gems but failed because of invalid api key"); + return "failed"; + } + } + + @Override + public Integer getGems(Integer user_id) { + if(validateApiKey()){ + userGems_model userGemsModel = new userGems_model(); + Integer gems = userGemsModel.getUserGems(user_id); + addLoggging("User with id " + user_id + " requested his gems"); + return gems; + } + else { + addLoggging("User with id " + user_id + " tried to get his gems but failed because of invalid api key"); + return -1; + } + } + + @Override + public String createTransaction(Integer user_id, Integer amount, String type) { + if (validateApiKey()){ + userGems_model userGemsModel = new userGems_model(); + Integer userGems = userGemsModel.getUserGems(user_id); + if (userGems >= amount) { + userGemsModel.update(new userGems_Entity(user_id, userGems - amount)); + transaction_model transactionModel = new transaction_model(); + transactionModel.insert(new transaction_entity(user_id, amount, type, "accepted")); + addLoggging("User with id " + user_id + " created a transaction with amount " + amount + " and description ACCEPTED"); + return "success"; + } else { + transaction_model transactionModel = new transaction_model(); + transactionModel.insert(new transaction_entity(user_id, amount, type, "rejected")); + addLoggging("User with id " + user_id + " created a transaction with amount " + amount + " and description REJECTED"); + return "insufficient gems"; + } + } + else { + addLoggging("User with id " + user_id + " tried to create a transaction with amount " + amount + " but failed because of invalid api key"); + return "failed"; + } + } + + @Override + public transaction_entity[] getTransactions(Integer user_id) { + if(validateApiKey()){ + transaction_model transactionModel = new transaction_model(); + transaction_entity[] transactions = transactionModel.getTransaction(user_id); + addLoggging("User with id " + user_id + " requested his transactions"); + return transactions; + } + else { + addLoggging("invalid api key for user"+user_id); + return null; + } + } + + public Boolean validateApiKey() { + String[] API_KEYS = { "toco_rest", "Postman", "toco_php"}; + MessageContext mc = wsctx.getMessageContext(); + HttpExchange exchange = (HttpExchange) mc.get("com.sun.xml.ws.http.exchange"); + String apiKey = exchange.getRequestHeaders().getFirst("X-API-KEY"); + if (apiKey == null) { + return false; + } else if (apiKey.equals(API_KEYS[0]) || apiKey.equals(API_KEYS[1]) || apiKey.equals(API_KEYS[2])) { + return true; + } else { + return false; + } + } + + public void addLoggging(String description) { + MessageContext mctx = wsctx.getMessageContext(); + HttpExchange req = (HttpExchange) mctx.get(JAXWSProperties.HTTP_EXCHANGE); + InetSocketAddress remote = req.getRemoteAddress(); + InetAddress address = remote.getAddress(); + String ip = address.getHostAddress(); + String endpoint = req.getRequestURI().toString(); + logging logging_service = new logging(); + logging_service.addLogging(description, ip, endpoint); + } +} diff --git a/src/main/java/org/toco/service/transaction.java b/src/main/java/org/toco/service/transaction.java index 295d3e5..239891d 100644 --- a/src/main/java/org/toco/service/transaction.java +++ b/src/main/java/org/toco/service/transaction.java @@ -50,7 +50,7 @@ public class transaction { return transactions; } else { - addLoggging("User with id " + user_id + " tried to get his transactions but failed because of invalid api key"); + addLoggging("invalid api key for user"+user_id); return null; } } @@ -74,6 +74,7 @@ public class transaction { MessageContext mc = wsctx.getMessageContext(); HttpExchange exchange = (HttpExchange) mc.get("com.sun.xml.ws.http.exchange"); String apiKey = exchange.getRequestHeaders().getFirst("X-API-KEY"); + apiKey = apiKey.hashCode() + ""; if (apiKey == null) { return false; } else if (apiKey.equals(API_KEYS[0]) || apiKey.equals(API_KEYS[1]) || apiKey.equals(API_KEYS[2])) { -- GitLab