From 5a2561567deccc37ae1f9ad4f0d612e5012f8671 Mon Sep 17 00:00:00 2001 From: AlphaThrone <haikalardzi@gmail.com> Date: Wed, 15 Nov 2023 15:27:07 +0700 Subject: [PATCH] feat: createTransaction using soap from php --- Dockerfile | 3 + client/js/cart.js | 12 +- client/js/catalog.js | 52 +++++---- client/pages/login-page.php | 3 +- docker-compose.yml | 2 +- server/controllers/connect_database.php | 2 +- server/controllers/transaction.php | 37 ++++++- server/controllers/update_profile.php | 10 +- server/{models => data}/csv/Item (1).csv | 0 server/{models => data}/csv/Item (10).csv | 0 server/{models => data}/csv/Item (2).csv | 0 server/{models => data}/csv/Item (3).csv | 0 server/{models => data}/csv/Item (4).csv | 0 server/{models => data}/csv/Item (5).csv | 0 server/{models => data}/csv/Item (6).csv | 0 server/{models => data}/csv/Item (7).csv | 0 server/{models => data}/csv/Item (8).csv | 0 server/{models => data}/csv/Item (9).csv | 0 server/{models => data}/csv/Item.csv | 0 server/{models => data}/csv/User.csv | 0 server/{models => data}/db+mock.sql | 0 server/{models => data}/db.sql | 0 server/{models => data}/mock_datas.sql | 0 .../{models => data}/mock_datas_for_demo.sql | 0 server/model/transaction.php | 103 ++++++++++++++++++ 25 files changed, 181 insertions(+), 43 deletions(-) rename server/{models => data}/csv/Item (1).csv (100%) rename server/{models => data}/csv/Item (10).csv (100%) rename server/{models => data}/csv/Item (2).csv (100%) rename server/{models => data}/csv/Item (3).csv (100%) rename server/{models => data}/csv/Item (4).csv (100%) rename server/{models => data}/csv/Item (5).csv (100%) rename server/{models => data}/csv/Item (6).csv (100%) rename server/{models => data}/csv/Item (7).csv (100%) rename server/{models => data}/csv/Item (8).csv (100%) rename server/{models => data}/csv/Item (9).csv (100%) rename server/{models => data}/csv/Item.csv (100%) rename server/{models => data}/csv/User.csv (100%) rename server/{models => data}/db+mock.sql (100%) rename server/{models => data}/db.sql (100%) rename server/{models => data}/mock_datas.sql (100%) rename server/{models => data}/mock_datas_for_demo.sql (100%) create mode 100644 server/model/transaction.php diff --git a/Dockerfile b/Dockerfile index 6a46a0d..8739ce6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,5 +9,8 @@ COPY . /var/www/html # Expose port 80 for the web server EXPOSE 80 +# Install mysqli dependency +RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli + # Start Apache in the foreground CMD ["apache2-foreground"] diff --git a/client/js/cart.js b/client/js/cart.js index 30454e6..75f32df 100644 --- a/client/js/cart.js +++ b/client/js/cart.js @@ -42,24 +42,22 @@ cartList = () => { submitCheckout = () => { // send cartDataArray back as post method - const cartData = new FormData(); - cartData.append("data", cartDataArray); const xhr = new XMLHttpRequest(); xhr.open('POST', '../../server/controllers/transaction.php', true); - xhr.send(cartData); + xhr.send(); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) { try { // Process the response data here var responseData = JSON.parse(xhr.responseText); if (responseData.success) { - alert("Check out success") - location.reload(); + alert("transaction success"); + location.href = "catalog.php"; } else { - alert("error: " + responseData.message) + } } catch (error) { - alert(error) + } } else if (xhr.status === 404) { var responseData = JSON.parse(xhr.responseText); diff --git a/client/js/catalog.js b/client/js/catalog.js index 6ae7e23..1044e5c 100644 --- a/client/js/catalog.js +++ b/client/js/catalog.js @@ -1,37 +1,35 @@ var activePage; //Promise is to syncronize asyncronous process -const input = document.getElementById("Searchinput"); -var myPromises = new Promise(function(resolve, reject){ - const formdata = new FormData(); - try { +try{ + const input = document.getElementById("Searchinput"); + var myPromises = new Promise(function(resolve, reject){ + const formdata = new FormData(); formdata.append('search', document.getElementById("Searchinput").value); - } catch (error) { - - } - // console.log(input.value); - - const xhr = new XMLHttpRequest(); - xhr.open('GET', '../../server/controllers/catalog.php', true); - xhr.send(formdata); - xhr.onreadystatechange = function(){ - if (xhr.readyState === 4 && xhr.status === 200){ - var responseData = JSON.parse(xhr.responseText); - if (responseData.success){ - //if expected process occur during promise get the expected value - resolve(Math.ceil(responseData.total[0]/10)); - } else { - alert("error: " + responseData.message); - //unexpected process occur during promise + const xhr = new XMLHttpRequest(); + xhr.open('GET', '../../server/controllers/catalog.php', true); + xhr.send(formdata); + xhr.onreadystatechange = function(){ + if (xhr.readyState === 4 && xhr.status === 200){ + var responseData = JSON.parse(xhr.responseText); + if (responseData.success){ + //if expected process occur during promise get the expected value + resolve(Math.ceil(responseData.total[0]/10)); + } else { + alert("error: " + responseData.message); + //unexpected process occur during promise + reject("error"); + } + } else if (xhr.status === 404){ + var response = JSON.parse(xhr.responseText); + console.log(response.message); reject("error"); } - } else if (xhr.status === 404){ - var response = JSON.parse(xhr.responseText); - console.log(response.message); - reject("error"); } - } -}); + }); +} catch (error){ + +} var numPages; //get the value of promise diff --git a/client/pages/login-page.php b/client/pages/login-page.php index 01640a2..ff9d199 100644 --- a/client/pages/login-page.php +++ b/client/pages/login-page.php @@ -19,10 +19,9 @@ <link rel="stylesheet" href="../css/navbar.css"> <script src="https://kit.fontawesome.com/8505941c5b.js" crossorigin="anonymous"></script> <script src="../js/navbar.js"></script> - </head> <body> -<div class="container"> + <div class="container"> <img class="icon" src="../image/logoregis.svg" width="58%" height="26%"> <div class="form-box"> <h1 id="title">SIGN UP</h1> diff --git a/docker-compose.yml b/docker-compose.yml index b7827be..8a7bb0c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,5 +7,5 @@ services: ports: - 8008:80 environment: - DB_URL: mysql://db-php-app/saranghaengbok_php + DB_HOST: db-php-app diff --git a/server/controllers/connect_database.php b/server/controllers/connect_database.php index 7a7f49b..d64c7ea 100644 --- a/server/controllers/connect_database.php +++ b/server/controllers/connect_database.php @@ -1,7 +1,7 @@ <?php function connect_database(){ // Create a connection - $conn = new mysqli('db-php-app', 'saranghaengbok_db_admin', 'BOOMbitchgetouttheway', 'saranghaengbok_php'); + $conn = new mysqli('db-php-app', 'root', 'admin', 'saranghaengbok_php'); // Check connection if ($conn->connect_error) { diff --git a/server/controllers/transaction.php b/server/controllers/transaction.php index 69007d5..c7b12e6 100644 --- a/server/controllers/transaction.php +++ b/server/controllers/transaction.php @@ -1,3 +1,38 @@ <?php - + session_start(); + require_once "connect_database.php"; + require_once "../model/transaction.php"; + + if ($_SERVER["REQUEST_METHOD"] == "POST"){ + $username = $_SESSION["username"]; + $conn = connect_database(); + + $query = "SELECT `c`.`cart_username`, `i`.`seller_username`, + `c`.`item_id`, `c`.`item_quantity` + FROM `cart` AS `c` JOIN `item` AS `i` + ON `c`.`item_id`=`i`.`item_id` + WHERE `c`.`cart_username` = (?)"; + $stmt = $conn->prepare($query); + if (!$stmt) { + die("Error in query preparation". $conn->error); + } + + $stmt->bind_param("s", $username); + $result = $stmt->execute(); + $resultSet = $stmt->get_result(); + $data_request = $resultSet->fetch_all(MYSQLI_ASSOC); + + $transaction = new Transaction($data_request); + + $data_response = $transaction->createTransaction(); + + if (!$result) { + $response = array("success" => "false", "message" => $stmt->error); + die ("Error in query execution: " . $stmt->error); + } else { + $response = array("success" => "true", "message" => $data_response); + } + echo json_encode($response); + mysqli_close($conn); + } ?> \ No newline at end of file diff --git a/server/controllers/update_profile.php b/server/controllers/update_profile.php index e2ebe56..6c8c7ba 100644 --- a/server/controllers/update_profile.php +++ b/server/controllers/update_profile.php @@ -1,9 +1,9 @@ <?php session_start(); require_once "connect_database.php"; - global $username_current; $username_current = $_SESSION["username"]; - global $email_current; $email_current = $_SESSION["email"]; - global $conn; $conn = connect_database(); + $username_current = $_SESSION["username"]; + $email_current = $_SESSION["email"]; + $conn = connect_database(); function username_query($param){ global $conn; $query = "SELECT * FROM user WHERE username = ?"; @@ -24,7 +24,9 @@ } function update_profile($target_username, $target_email, $target_password){ - global $conn; global $username_current; + global $conn; + global $username_current; + global $email_current; $query = "UPDATE user SET username = ?, email = ?, `password` = ? WHERE `username` = ?"; //handling if user doesnt want to change some of the column if ($target_username == '%') { diff --git a/server/models/csv/Item (1).csv b/server/data/csv/Item (1).csv similarity index 100% rename from server/models/csv/Item (1).csv rename to server/data/csv/Item (1).csv diff --git a/server/models/csv/Item (10).csv b/server/data/csv/Item (10).csv similarity index 100% rename from server/models/csv/Item (10).csv rename to server/data/csv/Item (10).csv diff --git a/server/models/csv/Item (2).csv b/server/data/csv/Item (2).csv similarity index 100% rename from server/models/csv/Item (2).csv rename to server/data/csv/Item (2).csv diff --git a/server/models/csv/Item (3).csv b/server/data/csv/Item (3).csv similarity index 100% rename from server/models/csv/Item (3).csv rename to server/data/csv/Item (3).csv diff --git a/server/models/csv/Item (4).csv b/server/data/csv/Item (4).csv similarity index 100% rename from server/models/csv/Item (4).csv rename to server/data/csv/Item (4).csv diff --git a/server/models/csv/Item (5).csv b/server/data/csv/Item (5).csv similarity index 100% rename from server/models/csv/Item (5).csv rename to server/data/csv/Item (5).csv diff --git a/server/models/csv/Item (6).csv b/server/data/csv/Item (6).csv similarity index 100% rename from server/models/csv/Item (6).csv rename to server/data/csv/Item (6).csv diff --git a/server/models/csv/Item (7).csv b/server/data/csv/Item (7).csv similarity index 100% rename from server/models/csv/Item (7).csv rename to server/data/csv/Item (7).csv diff --git a/server/models/csv/Item (8).csv b/server/data/csv/Item (8).csv similarity index 100% rename from server/models/csv/Item (8).csv rename to server/data/csv/Item (8).csv diff --git a/server/models/csv/Item (9).csv b/server/data/csv/Item (9).csv similarity index 100% rename from server/models/csv/Item (9).csv rename to server/data/csv/Item (9).csv diff --git a/server/models/csv/Item.csv b/server/data/csv/Item.csv similarity index 100% rename from server/models/csv/Item.csv rename to server/data/csv/Item.csv diff --git a/server/models/csv/User.csv b/server/data/csv/User.csv similarity index 100% rename from server/models/csv/User.csv rename to server/data/csv/User.csv diff --git a/server/models/db+mock.sql b/server/data/db+mock.sql similarity index 100% rename from server/models/db+mock.sql rename to server/data/db+mock.sql diff --git a/server/models/db.sql b/server/data/db.sql similarity index 100% rename from server/models/db.sql rename to server/data/db.sql diff --git a/server/models/mock_datas.sql b/server/data/mock_datas.sql similarity index 100% rename from server/models/mock_datas.sql rename to server/data/mock_datas.sql diff --git a/server/models/mock_datas_for_demo.sql b/server/data/mock_datas_for_demo.sql similarity index 100% rename from server/models/mock_datas_for_demo.sql rename to server/data/mock_datas_for_demo.sql diff --git a/server/model/transaction.php b/server/model/transaction.php new file mode 100644 index 0000000..0d8029f --- /dev/null +++ b/server/model/transaction.php @@ -0,0 +1,103 @@ +<?php + require_once '../controllers/connect_database.php'; + class Transaction{ + private $buyer; + private $seller; + private $list_item_id; + private $list_quantity; + private $conn; + + public function __construct($data){ + $this->buyer = $data[0]["cart_username"]; + $this->seller = ""; + $this->list_item_id = ""; + $this->list_quantity = ""; + for ($i=0; $i < count($data); $i++) { + $this->seller .= $data[$i]["seller_username"]; + $this->list_item_id .= $data[$i]["item_id"]; + $this->list_quantity .= $data[$i]["item_quantity"]; + if ($i < count($data)-1){ + $this->seller .= ","; + $this->list_item_id .= ","; + $this->list_quantity .= ","; + } + } + } + + public function createTransaction(){ + $this->conn = connect_database(); + $query1 = "DELETE FROM `cart` WHERE `cart_username` = (?)"; + $stmt1 = $this->conn->prepare($query1); + if (!$stmt1) { + die("Error in query preparation". $this->conn->error); + } + $stmt1->bind_param("s", $this->buyer); + $stmt1->execute(); + + $headers = array( + "Content-Type: text/xml;charset=\"utf-8\"", + "X-API-Key: php", + "Host". $_SERVER['REMOTE_ADDR'] + ); + + $request_param = '<?xml version="1.0" encoding="utf-8"?> + <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> + <soap:Body> + <createTransaction xmlns="http://service.saranghaengbok.org/"> + <buyer_username xmlns="http://service.saranghaengbok.org/">'. $this->getBuyer(). '</buyer_username> + <seller_username xmlns="http://service.saranghaengbok.org/">'. $this->getSeller(). '</seller_username> + <item_id xmlns="http://service.saranghaengbok.org/">'. $this->getlistItem(). '</item_id> + <quantity xmlns="http://service.saranghaengbok.org/">'. $this->getlistQuantity(). '</quantity> + </createTransaction> + </soap:Body> + </soap:Envelope> + '; + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + curl_setopt($ch, CURLOPT_POSTFIELDS, $request_param); + curl_setopt($ch, CURLOPT_URL, "http://host.docker.internal:8081/ws/transaction"); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + + $response = curl_exec($ch); + curl_close($ch); + if ($response === FALSE) { + printf("CURL error (#%d): %s<br>\n", curl_errno($ch), + htmlspecialchars(curl_error($ch))); + } + + $response1 = str_replace('<?xml version="1.0" ?> + <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> + <S:Body> + <ns2:createTransactionResponse xmlns:ns2="http://service.saranghaengbok.org/"> + <return>',"",$response); + $response2 = str_replace("</return> + </ns2:createTransactionResponse> + </S:Body> + </S:Envelope>","",$response1); + + $stmt1->close(); + return $$response2; + //init webservice with wsdl + } + + public function getBuyer(){ + return $this->buyer; + } + + + public function getSeller(){ + return $this->seller; + } + + + public function getlistItem(){ + return $this->list_item_id; + } + + public function getlistQuantity(){ + return $this->list_quantity; + } + } +?> \ No newline at end of file -- GitLab