From ad4aaa9b2aceae45b4ac52fc3b54194c839dc69e Mon Sep 17 00:00:00 2001
From: DewanaGustavus <76590469+DewanaGustavus@users.noreply.github.com>
Date: Fri, 17 Nov 2023 13:35:32 +0700
Subject: [PATCH] feat: finish order functionality

---
 package-lock.json                      | 127 ++++++++++++++++++++++++-
 src/handler/order/order.router.ts      |  11 +++
 src/handler/order/order.service.ts     |  49 +++++++++-
 src/handler/user/user.router.ts        |   2 +-
 src/interfaces/History.ts              |   2 +-
 src/interfaces/HistoryDetail.ts        |   2 +-
 src/interfaces/OrderDetailString.ts    |   7 ++
 src/interfaces/OrderInterfaceString.ts |  13 +++
 8 files changed, 202 insertions(+), 11 deletions(-)
 create mode 100644 src/interfaces/OrderDetailString.ts
 create mode 100644 src/interfaces/OrderInterfaceString.ts

diff --git a/package-lock.json b/package-lock.json
index dd806c8..7282620 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,9 +11,12 @@
       "dependencies": {
         "@prisma/client": "^5.5.2",
         "@types/express": "^4.17.20",
+        "@types/jsonwebtoken": "^9.0.5",
         "axios": "^1.6.2",
         "cors": "^2.8.5",
         "express": "^4.18.2",
+        "express-jwt": "^8.4.1",
+        "jsonwebtoken": "^9.0.2",
         "xml-js": "^1.6.11"
       },
       "devDependencies": {
@@ -171,6 +174,14 @@
       "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
       "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA=="
     },
+    "node_modules/@types/jsonwebtoken": {
+      "version": "9.0.5",
+      "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.5.tgz",
+      "integrity": "sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==",
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
     "node_modules/@types/mime": {
       "version": "1.3.5",
       "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
@@ -351,6 +362,11 @@
         "node": ">=8"
       }
     },
+    "node_modules/buffer-equal-constant-time": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+      "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
+    },
     "node_modules/bytes": {
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
@@ -521,6 +537,14 @@
         "node": ">=0.3.1"
       }
     },
+    "node_modules/ecdsa-sig-formatter": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+      "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+      "dependencies": {
+        "safe-buffer": "^5.0.1"
+      }
+    },
     "node_modules/ee-first": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -588,6 +612,24 @@
         "node": ">= 0.10.0"
       }
     },
+    "node_modules/express-jwt": {
+      "version": "8.4.1",
+      "resolved": "https://registry.npmjs.org/express-jwt/-/express-jwt-8.4.1.tgz",
+      "integrity": "sha512-IZoZiDv2yZJAb3QrbaSATVtTCYT11OcqgFGoTN4iKVyN6NBkBkhtVIixww5fmakF0Upt5HfOxJuS6ZmJVeOtTQ==",
+      "dependencies": {
+        "@types/jsonwebtoken": "^9",
+        "express-unless": "^2.1.3",
+        "jsonwebtoken": "^9.0.0"
+      },
+      "engines": {
+        "node": ">= 8.0.0"
+      }
+    },
+    "node_modules/express-unless": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/express-unless/-/express-unless-2.1.3.tgz",
+      "integrity": "sha512-wj4tLMyCVYuIIKHGt0FhCtIViBcwzWejX0EjNxveAa6dG+0XBCQhMbx+PnkLkFCxLC69qoFrxds4pIyL88inaQ=="
+    },
     "node_modules/fill-range": {
       "version": "7.0.1",
       "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -864,11 +906,90 @@
         "node": ">=0.12.0"
       }
     },
+    "node_modules/jsonwebtoken": {
+      "version": "9.0.2",
+      "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
+      "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
+      "dependencies": {
+        "jws": "^3.2.2",
+        "lodash.includes": "^4.3.0",
+        "lodash.isboolean": "^3.0.3",
+        "lodash.isinteger": "^4.0.4",
+        "lodash.isnumber": "^3.0.3",
+        "lodash.isplainobject": "^4.0.6",
+        "lodash.isstring": "^4.0.1",
+        "lodash.once": "^4.0.0",
+        "ms": "^2.1.1",
+        "semver": "^7.5.4"
+      },
+      "engines": {
+        "node": ">=12",
+        "npm": ">=6"
+      }
+    },
+    "node_modules/jsonwebtoken/node_modules/ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+    },
+    "node_modules/jwa": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+      "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+      "dependencies": {
+        "buffer-equal-constant-time": "1.0.1",
+        "ecdsa-sig-formatter": "1.0.11",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "node_modules/jws": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+      "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+      "dependencies": {
+        "jwa": "^1.4.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "node_modules/lodash.includes": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+      "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="
+    },
+    "node_modules/lodash.isboolean": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+      "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
+    },
+    "node_modules/lodash.isinteger": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+      "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="
+    },
+    "node_modules/lodash.isnumber": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+      "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="
+    },
+    "node_modules/lodash.isplainobject": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+      "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
+    },
+    "node_modules/lodash.isstring": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+      "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="
+    },
+    "node_modules/lodash.once": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+      "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
+    },
     "node_modules/lru-cache": {
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
       "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dev": true,
       "dependencies": {
         "yallist": "^4.0.0"
       },
@@ -1197,7 +1318,6 @@
       "version": "7.5.4",
       "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
       "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
-      "dev": true,
       "dependencies": {
         "lru-cache": "^6.0.0"
       },
@@ -1469,8 +1589,7 @@
     "node_modules/yallist": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
     },
     "node_modules/yn": {
       "version": "3.1.1",
diff --git a/src/handler/order/order.router.ts b/src/handler/order/order.router.ts
index 030ebdf..0423cff 100644
--- a/src/handler/order/order.router.ts
+++ b/src/handler/order/order.router.ts
@@ -63,4 +63,15 @@ OrderRouter.put('/pick-order', async (request: Request, response: Response) => {
     } catch (error: any) {
         return response.status(500).json(error.message);
     }
+})
+
+OrderRouter.put('/finish-order', async (request: Request, response: Response) => {
+    try {
+        const orderId : number = request.body.orderId;
+        const username : string = request.body.username;
+        const res = await OrderServices.finishOrder(orderId, username);
+        return response.status(200).json(res);
+    } catch (error: any) {
+        return response.status(500).json(error.message);
+    }
 })
\ No newline at end of file
diff --git a/src/handler/order/order.service.ts b/src/handler/order/order.service.ts
index 4e01654..01669f5 100644
--- a/src/handler/order/order.service.ts
+++ b/src/handler/order/order.service.ts
@@ -4,28 +4,33 @@ import { getDetailPesanan } from "../soap-caller/DetailPesananSoapCaller";
 import OrderDetail from "../../interfaces/OrderDetail";
 import { ConvertArray, ConvertSingle } from "../../utils/JSONConverter";
 import { getUserId } from "../../utils/getUserId";
+import { db } from "../../utils/db.server";
+import { HistoryDetail } from "../../interfaces/HistoryDetail";
+import OrderInterfaceString from "../../interfaces/OrderInterfaceString";
+import { History } from "../../interfaces/History";
+import OrderDetailString from "../../interfaces/OrderDetailString";
 
 export async function getAvailableOrder() {
     const response = await getPesananNoKurir();
-    const availableOrder = ConvertArray<OrderInterface>(response);
+    const availableOrder = ConvertArray<OrderInterfaceString>(response);
     return availableOrder;
 }
 
 export async function getOrderById(orderId : number) {
     const response = await getPesananByIdPesanan(orderId);
-    const order = ConvertSingle(response);
+    const order = ConvertSingle<OrderInterfaceString>(response);
     return order;
 }
 
 export async function getOrderDetails(orderId : number) {
     const response = await getDetailPesanan(orderId);
-    const orderDetails = ConvertArray<OrderDetail>(response);
+    const orderDetails = ConvertArray<OrderDetailString>(response);
     return orderDetails;
 }
 
 export async function getOrderByCourier(courierId : number) {
     const response = await getPesananByKurir(courierId);
-    const orderDetails = ConvertArray<OrderDetail>(response);
+    const orderDetails = ConvertArray<OrderDetailString>(response);
     return orderDetails;
 }
 
@@ -41,3 +46,39 @@ export async function updateOrder(orderId : number, username : string, status :
     return response;
 }
 
+export async function finishOrder(orderId : number, username : string) {
+    const courierId = await getUserId(username);
+    const order = await getOrderById(orderId);
+    const orderDetail = await getOrderDetails(orderId);
+    const response = await updatePesanan(orderId, courierId, "delivered", "");
+
+    const historyData : History = {
+        user_id : courierId,
+        alamat_tujuan : order.alamat,
+        id_penerima : parseInt(order.id_pemesan),
+        nama_penerima : order.nama_penerima,
+        biaya_pengiriman : parseInt(order.biaya_pengiriman),
+        rating : 0,
+    };
+
+    const historyResult = await db.history.create({
+        data : historyData
+    })
+
+    let historyDetailData : HistoryDetail[] = []
+    orderDetail.map((detail) => {
+        historyDetailData.push({
+            history_id : historyResult.id,
+            product_name : detail.nama_product,
+            quantity : parseInt(detail.quantity),
+            price : parseInt(detail.harga),
+        })
+    })
+
+    const historyDetailResult = await db.historyDetail.createMany({
+        data : historyDetailData
+    })
+
+    return response;
+}
+
diff --git a/src/handler/user/user.router.ts b/src/handler/user/user.router.ts
index cfbf8bb..136cb93 100644
--- a/src/handler/user/user.router.ts
+++ b/src/handler/user/user.router.ts
@@ -46,7 +46,7 @@ UserRouter.post('/login', async (request: Request, response: Response) => {
         const responseString= await UserServices.login(request.body.username, request.body.password);
         return response.status(200).json(responseString);
     } catch (error: any) {
-        return response.status(500).json(error.message);
+        return response.status(500).json("gagal");
     }
 })
 
diff --git a/src/interfaces/History.ts b/src/interfaces/History.ts
index 9b5ada7..b9ec3c3 100644
--- a/src/interfaces/History.ts
+++ b/src/interfaces/History.ts
@@ -1,6 +1,6 @@
 
 export interface History {
-    id: number
+    id?: number
     user_id : number
     alamat_tujuan : string
     id_penerima : number
diff --git a/src/interfaces/HistoryDetail.ts b/src/interfaces/HistoryDetail.ts
index 0c5d4fa..c47e78e 100644
--- a/src/interfaces/HistoryDetail.ts
+++ b/src/interfaces/HistoryDetail.ts
@@ -1,6 +1,6 @@
 
 export interface HistoryDetail {
-    id: number
+    id ?: number
     history_id : number
     product_name: string
     quantity: number
diff --git a/src/interfaces/OrderDetailString.ts b/src/interfaces/OrderDetailString.ts
new file mode 100644
index 0000000..bee48a9
--- /dev/null
+++ b/src/interfaces/OrderDetailString.ts
@@ -0,0 +1,7 @@
+
+export default interface OrderDetailString {    
+    id_pesanan : string
+    nama_product : string
+    quantity : string
+    harga : string
+}
\ No newline at end of file
diff --git a/src/interfaces/OrderInterfaceString.ts b/src/interfaces/OrderInterfaceString.ts
new file mode 100644
index 0000000..ce80dd5
--- /dev/null
+++ b/src/interfaces/OrderInterfaceString.ts
@@ -0,0 +1,13 @@
+
+export default interface OrderInterfaceString {
+    alamat : string
+    biaya_pengiriman : string
+    harga : string
+    id : string
+    id_kurir : string
+    id_pemesan : string
+    keterangan : string
+    nama_kurir : string
+    nama_penerima : string
+    status : string
+}
\ No newline at end of file
-- 
GitLab