diff --git a/Dockerfile b/Dockerfile index 6a46a0d8bcb62b0b418a2da0fa8eab95fda381c9..8739ce67d61cb068f53df2813adcca7e66020cd2 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 30454e6413c7872dabd19f00d72d0ff8b606ce54..75f32df1b7a2fd2525fc99752d2699c9fcdfc41b 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 6ae7e2325be0cdca0b829f5c6dd9ded1e1389dea..1044e5c8a85c3849a8e7d44f70f0aff7b56cd32f 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 01640a232edc94ac7c02420f6a5178d98a9d0a71..ff9d1999c5f52db458da8c7e0e3b6a3e51f06751 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 b7827be1723cd92bacf31c2ec5aeaa5aab8db987..8a7bb0ce1f8a8b834bcf8bc6f93b37799eb79fcd 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 7a7f49b2ddfff508b3823c52951bcff4f98afb20..d64c7ea6c180986dedf7b5daa74dab664dd9a96c 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 69007d508c2f05fcc64662cfad92748a7b8bc7bc..c7b12e6a851689f69aedd6cef0c0e5bede9fbef7 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 e2ebe564206327e2fddb8c035fa9ef2e0e71f638..6c8c7ba04b3d069ba795fe3c4f947349f95d8ebb 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 0000000000000000000000000000000000000000..0d8029ff8e2d623cc787c7d5f75c2dcd11095b74 --- /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