diff --git a/package-lock.json b/package-lock.json index dd806c8e2b7b1a4d99d33a404c246c8f86bb21a9..7282620971f85589e2b6fc0b6b2c801476ce1238 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 030ebdfff6601a963827b42f489eb4c7885a60a6..0423cff47bda4696332de5b27e3649f822396b31 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 4e01654b649b62c054904a666e69bf591b4b0173..01669f52687c24c506fee949e0afb22effa05ff8 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 cfbf8bb87afb10759efb73813589c9dc015beee2..136cb93171b4a0c40e95115dd29faed03d6b71a1 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 9b5ada7b6be11c9876745161a3c6f9751fe95e7e..b9ec3c3cf1b7705cf8c3d1acd8614e25f4c09624 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 0c5d4fa36e8b9647ad78b1ae2df7358fb199025c..c47e78e591137cfc4e1edd43b243d4e3a4d92896 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 0000000000000000000000000000000000000000..bee48a96857b1e2b2af12fde3f74458d0994147b --- /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 0000000000000000000000000000000000000000..ce80dd5f14208a743fc97f8614ba8dcebb2a9952 --- /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