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