From a632b5af8bdbc1e370db04c000c7881466ef83f1 Mon Sep 17 00:00:00 2001
From: Ulung32 <13521122@mahasiswa.itb.ac.id>
Date: Fri, 17 Nov 2023 12:20:06 +0700
Subject: [PATCH] add jwt

---
 src/handler/history/history.router.ts |  6 +++-
 src/handler/middleware/middleware.ts  | 41 +++++++++++++++++++++++++++
 src/handler/user/user.router.ts       |  2 +-
 src/handler/user/user.service.ts      | 28 ++++++++++++++++--
 src/index.ts                          |  9 ++++--
 5 files changed, 79 insertions(+), 7 deletions(-)
 create mode 100644 src/handler/middleware/middleware.ts

diff --git a/src/handler/history/history.router.ts b/src/handler/history/history.router.ts
index f0f9a04..087fbfb 100644
--- a/src/handler/history/history.router.ts
+++ b/src/handler/history/history.router.ts
@@ -2,11 +2,15 @@ import express from "express";
 import type { Request, Response } from "express";
 
 import * as HistoryServices from './history.service'
+import { ValidationRequest, accessValidation } from "../middleware/middleware";
 
 export const HistoryRouter = express.Router()
 
-HistoryRouter.get('/:username', async (request: Request, response: Response) => {
+HistoryRouter.get('/', accessValidation, async (request: Request, response: Response) => {
     try {
+        const validationRequest = request as ValidationRequest;
+        const { authorization } = validationRequest.headers;
+        console.log(authorization)
         const history = await HistoryServices.getHistory(request.params.username);
         return response.status(200).json(history);
     } catch (error: any) {
diff --git a/src/handler/middleware/middleware.ts b/src/handler/middleware/middleware.ts
new file mode 100644
index 0000000..75a146f
--- /dev/null
+++ b/src/handler/middleware/middleware.ts
@@ -0,0 +1,41 @@
+import {Express, NextFunction, Request, Response} from "express";
+import jwt, { JwtPayload } from 'jsonwebtoken';
+
+interface UserData {
+    id: number,
+    name: string,
+    username: string,
+}
+
+export interface ValidationRequest extends Request {
+    userData: UserData
+}
+
+export const accessValidation = (req: Request, res: Response, next: NextFunction) => {
+    const validationReq = req as ValidationRequest
+    const {authorization} = validationReq.headers;
+
+    console.log('here: ', authorization)
+
+    if(!authorization){
+        return res.status(401).json({
+            message: 'Token diperlukan'
+        })
+    }
+
+    const token = authorization.split(' ')[1];
+    const secret = process.env.JWT_SECRET!;
+
+    try {
+        const jwtDecode = jwt.verify(token, secret);
+
+        if(typeof jwtDecode !== 'string'){
+            validationReq.userData = jwtDecode as UserData
+        }
+    } catch (error) {
+        return res.status(401).json({
+            message: 'Unauthorized'
+        })
+    }
+    next()
+}
\ No newline at end of file
diff --git a/src/handler/user/user.router.ts b/src/handler/user/user.router.ts
index 6123739..cfbf8bb 100644
--- a/src/handler/user/user.router.ts
+++ b/src/handler/user/user.router.ts
@@ -43,7 +43,7 @@ UserRouter.post('/register', async (request: Request, response: Response) => {
 
 UserRouter.post('/login', async (request: Request, response: Response) => {
     try {
-        const responseString = await UserServices.login(request.body.username, request.body.password);
+        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);
diff --git a/src/handler/user/user.service.ts b/src/handler/user/user.service.ts
index 6931728..ebbf907 100644
--- a/src/handler/user/user.service.ts
+++ b/src/handler/user/user.service.ts
@@ -2,6 +2,8 @@ import { User } from "../../interfaces/User";
 import { UserDetail } from "../../interfaces/UserDetail";
 import {db} from "../../utils/db.server"
 
+import jwt, { Secret, JwtPayload } from 'jsonwebtoken';
+
 type queryResult = User | null;
 
 export async function checkUsername(username : string) {
@@ -61,9 +63,29 @@ export async function login(username : string, password : string) {
         where: {
             username : username
         }
-    });
-    const responseString = (password === result?.password) ? "success" : "failed";
-    return responseString;
+    })
+
+    if(result === null){
+        const responseString = "username tidak ditemukan";
+        return responseString;
+    }
+    if(result.password != password){
+        const responseString = "password salah";
+        return responseString;
+    }
+
+    const payLoad = {
+        id: result.id,
+        name: result.name,
+        username: result.username,
+    }
+
+    const Secret = process.env.JWT_SECRET!;
+
+    const expiresIn = 60*60*24; 
+    const token = jwt.sign(payLoad, Secret, {expiresIn: expiresIn})
+    return token;
+    
 }
 
 export async function getBalance(username : string) {
diff --git a/src/index.ts b/src/index.ts
index a4e198d..1073106 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,4 +1,6 @@
-import express, {Express, Request, Response} from "express";
+import express, {Express, NextFunction, Request, Response} from "express";
+import jwt, { JwtPayload } from 'jsonwebtoken';
+
 import { HistoryRouter } from "./handler/history/history.router";
 import { OrderRouter } from "./handler/order/order.router";
 import { UserRouter } from "./handler/user/user.router";
@@ -9,9 +11,12 @@ const port = 5000;
 
 app.use(express.json());
 app.use(cors());
+
+
+
 // logger
 app.use((req, res, next) => {
-    console.log(`${req.method} ${req.url}`); 
+    
     next(); 
 });
 
-- 
GitLab