From 075d4809697348172abfccc08993a9817e291b33 Mon Sep 17 00:00:00 2001 From: Bagasbanuna02 Date: Mon, 10 Feb 2025 12:15:43 +0800 Subject: [PATCH] fix error server --- .env.build | 9 +++ build.wibu | 3 + src/app/(auth)/_lib/decrypt.back.txt | 22 +++++ src/app/(auth)/_lib/decrypt.ts | 35 +++++++- .../admin/voting/dashboard/riwayat/route.ts | 80 ++++++++++--------- src/app/api/auth/logout/route.ts | 49 ++++++++---- src/app/api/auth/validasi/route.ts | 19 ++++- src/app/api/master/bank/route.ts | 4 +- src/app/dev/check-cookies/page.tsx | 21 ----- src/app_modules/check_cookies/index.ts | 5 -- .../check_cookies/layout_cek_cookies.tsx | 48 ----------- .../check_cookies/ui_check_cookies.tsx | 22 ----- src/middleware.ts | 20 ++++- 13 files changed, 177 insertions(+), 160 deletions(-) create mode 100644 .env.build create mode 100644 build.wibu create mode 100644 src/app/(auth)/_lib/decrypt.back.txt delete mode 100644 src/app/dev/check-cookies/page.tsx delete mode 100644 src/app_modules/check_cookies/index.ts delete mode 100644 src/app_modules/check_cookies/layout_cek_cookies.tsx delete mode 100644 src/app_modules/check_cookies/ui_check_cookies.tsx diff --git a/.env.build b/.env.build new file mode 100644 index 00000000..4529a401 --- /dev/null +++ b/.env.build @@ -0,0 +1,9 @@ +DATABASE_URL="postgresql://bip:Production_123@localhost:5433/hipmi_build?schema=public" +WIBU_PWD="QWERTYUIOPLKJHGFDSAZXCVBNMQAZWSXEDCRFVTGBYHNUJMIKOLPPOIUYTREWQLKJHGFDSAMNBVCXZlghvftyguhijknhbgvcfytguu8okjnhbgvfty7u8oilkjnhgvtygu7u8ojilnkhbgvhujnkhghvjhukjnhb" +Client_KEY="SB-Mid-client-9NDTxltqdZrEB9m-" +Server_KEY="SB-Mid-server-NyltU-U7fLVQd1nv1LWBKylr" +MAPBOX_TOKEN="pk.eyJ1IjoibWFsaWtrdXJvc2FraSIsImEiOiJjbHppZHh2enYwZnQ3MmlyMWc2Y2RlMzZoIn0.XssvJvq_iniclf8UhvXaIg" +WS_APIKEY="eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjp7ImlkIjoiY20wdXIxeXh3MDAwMDU2bnNqbHI2MTg3cCIsIm5hbWUiOiJiYWdhcyIsImVtYWlsIjoiYmFnYXNAZ21haWwuY29tIiwiQXBpS2V5IjpbeyJpZCI6ImNtMHVyMXl5MzAwMDI1Nm5zazNia2xyc28iLCJuYW1lIjoiZGVmYXVsdCJ9XX0sImlhdCI6MTcyNTk1NjMyMSwiZXhwIjo0ODgxNzE2MzIxfQ.9D3YszZA_ljrkTKMcgo03u7PL5mo9OaoM41rbUrOsz8" +NEXT_PUBLIC_WIBU_REALTIME_TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Inp5aml4c2J1c2diYnR2am9namhvIiwicm9sZSI6ImFub24iLCJpYXQiOjE3MjY3Mzk1NDUsImV4cCI6MjA0MjMxNTU0NX0.jHNW5Pwhj-KXUQOMqzILaAz62k3xlKEL5XKE4xoR7Xc" +NEXT_PUBLIC_BASE_TOKEN_KEY="QWERTYUIOPLKJHGFDSAZXCVBNMQAZWSXEDCRFVTGBYHNUJMIKOLPPOIUYTREWQLKJHGFDSAMNBVCXZlghvftyguhijknhbgvcfytguu8okjnhbgvfty7u8oilkjnhgvtygu7u8ojilnkhbgvhujnkhghvjhukjnhb" +NEXT_PUBLIC_BASE_SESSION_KEY="hipmi-key" \ No newline at end of file diff --git a/build.wibu b/build.wibu new file mode 100644 index 00000000..62d352e1 --- /dev/null +++ b/build.wibu @@ -0,0 +1,3 @@ +bun --env-file=.env.build prisma db push +bun --env-file=.env.build prisma db seed +bun --env-file=.env.build run build \ No newline at end of file diff --git a/src/app/(auth)/_lib/decrypt.back.txt b/src/app/(auth)/_lib/decrypt.back.txt new file mode 100644 index 00000000..410a7369 --- /dev/null +++ b/src/app/(auth)/_lib/decrypt.back.txt @@ -0,0 +1,22 @@ +import { jwtVerify } from "jose"; + +export async function decrypt({ + token, + encodedKey, +}: { + token: string; + encodedKey: string; +}): Promise | null> { + try { + const enc = new TextEncoder().encode(encodedKey); + const { payload } = await jwtVerify(token, enc, { + algorithms: ["HS256"], + }); + return (payload.user as Record) || null; + } catch (error) { + console.error("Gagal verifikasi session", error); + return null; + } +} + +// wibu:0.2.82 diff --git a/src/app/(auth)/_lib/decrypt.ts b/src/app/(auth)/_lib/decrypt.ts index 410a7369..0883f2b3 100644 --- a/src/app/(auth)/_lib/decrypt.ts +++ b/src/app/(auth)/_lib/decrypt.ts @@ -7,16 +7,43 @@ export async function decrypt({ token: string; encodedKey: string; }): Promise | null> { + if (!token || !encodedKey) { + console.error("Missing required parameters:", { + hasToken: !!token, + hasEncodedKey: !!encodedKey, + }); + return null; + } + try { const enc = new TextEncoder().encode(encodedKey); const { payload } = await jwtVerify(token, enc, { algorithms: ["HS256"], }); - return (payload.user as Record) || null; + + if (!payload || !payload.user) { + console.error("Invalid payload structure:", { + hasPayload: !!payload, + hasUser: payload ? !!payload.user : false, + }); + return null; + } + + // Logging untuk debug + // console.log("Decrypt successful:", { + // payloadExists: !!payload, + // userExists: !!payload.user, + // tokenPreview: token.substring(0, 10) + "...", + // }); + + return payload.user as Record; } catch (error) { - console.error("Gagal verifikasi session", error); + console.error("Token verification failed:", { + error, + tokenLength: token?.length, + errorName: error instanceof Error ? error.name : "Unknown error", + errorMessage: error instanceof Error ? error.message : String(error), + }); return null; } } - -// wibu:0.2.82 diff --git a/src/app/api/admin/voting/dashboard/riwayat/route.ts b/src/app/api/admin/voting/dashboard/riwayat/route.ts index 3857af0e..c377c3de 100644 --- a/src/app/api/admin/voting/dashboard/riwayat/route.ts +++ b/src/app/api/admin/voting/dashboard/riwayat/route.ts @@ -3,42 +3,46 @@ import backendLogger from "@/util/backendLogger"; import { NextResponse } from "next/server"; export async function GET(request: Request) { - const method = request.method; - if (method !== "GET") { - return NextResponse.json({ - success: false, - message: "Method not allowed", + if (request.method !== "GET") { + return NextResponse.json( + { + success: false, + message: "Method not allowed", + }, + { status: 405 } + ); + } + + try { + let fixData; + fixData = await prisma.voting.count({ + where: { + Voting_Status: { + name: "Publish", }, - { status: 405 } - ) - } - try { - let fixData; - fixData = await prisma.voting.count({ - where: { - Voting_Status: { - name: "Publish", - }, - isArsip: true, - } - }) - return NextResponse.json({ - success: true, - message: 'Success get data voting dashboard', - data: fixData - }, - { status: 200 } - ) - } catch (error) { - backendLogger.error('Error get data voting dashboard >>', error); - NextResponse.json({ - success: false, - message: 'Error get data voting dashboard', - reason: (error as Error).message - }, - { status: 500 } - ) - } finally { - await prisma.$disconnect(); - } -} \ No newline at end of file + isArsip: true, + }, + }); + + return NextResponse.json( + { + success: true, + message: "Success get data voting dashboard", + data: fixData, + }, + { status: 200 } + ); + } catch (error) { + backendLogger.error("Error get data voting dashboard >>", error); + return NextResponse.json( + { + success: false, + message: "Error get data voting dashboard", + reason: (error as Error).message, + }, + { status: 500 } + ); + } finally { + await prisma.$disconnect(); + } +} diff --git a/src/app/api/auth/logout/route.ts b/src/app/api/auth/logout/route.ts index 44a4a2ab..a3e0304a 100644 --- a/src/app/api/auth/logout/route.ts +++ b/src/app/api/auth/logout/route.ts @@ -1,20 +1,39 @@ +import { decrypt } from "@/app/(auth)/_lib/decrypt"; import { cookies } from "next/headers"; -import { NextRequest, NextResponse } from "next/server"; +import { NextResponse } from "next/server"; + export const dynamic = "force-dynamic"; -export async function GET(request: NextRequest) { - const id = request.nextUrl.searchParams.get("id"); - // const { searchParams } = new URL(request.url); - // const id = searchParams.get("id"); - // const delToken = await prisma.userSession.delete({ - // where: { - // userId: id as string, - // }, - // }); +export async function GET() { + const sessionKey = process.env.NEXT_PUBLIC_BASE_SESSION_KEY!; // Gunakan environment variable yang tidak diekspos ke client-side + if (!sessionKey) { + return NextResponse.json( + { success: false, message: "Session key tidak ditemukan" }, + { status: 500 } + ); + } - const del = cookies().delete(process.env.NEXT_PUBLIC_BASE_SESSION_KEY!); - return NextResponse.json( - { success: true, message: "Logout Berhasil" }, - { status: 200 } - ); + const cookieStore = cookies(); + const sessionCookie = cookieStore.get(sessionKey); + + if (!sessionCookie) { + return NextResponse.json( + { success: false, message: "Session tidak ditemukan" }, + { status: 400 } + ); + } + + try { + cookieStore.delete(sessionKey); + return NextResponse.json( + { success: true, message: "Logout berhasil" }, + { status: 200 } + ); + } catch (error) { + console.error("Gagal menghapus cookie:", error); + return NextResponse.json( + { success: false, message: "Gagal melakukan logout" }, + { status: 500 } + ); + } } diff --git a/src/app/api/auth/validasi/route.ts b/src/app/api/auth/validasi/route.ts index c9f9814e..6df13d37 100644 --- a/src/app/api/auth/validasi/route.ts +++ b/src/app/api/auth/validasi/route.ts @@ -38,7 +38,14 @@ export async function POST(req: Request) { user: dataUser as any, }); - return NextResponse.json( + if (!token) { + return NextResponse.json( + { success: false, message: "Gagal membuat session" }, + { status: 500 } + ); + } + // Buat response dengan token dalam cookie + const response = NextResponse.json( { success: true, message: "Berhasil Login", @@ -47,6 +54,16 @@ export async function POST(req: Request) { }, { status: 200 } ); + + // Set cookie dengan token yang sudah dipastikan tidak null + response.cookies.set(process.env.NEXT_PUBLIC_BASE_SESSION_KEY!, token, { + path: "/", + sameSite: "lax", + secure: process.env.NODE_ENV === "production", + maxAge: 30 * 24 * 60 * 60, // 30 hari dalam detik (1 bulan) + }); + + return response; } catch (error) { backendLogger.log("API Error or Server Error", error); return NextResponse.json( diff --git a/src/app/api/master/bank/route.ts b/src/app/api/master/bank/route.ts index 2ce3228b..146ac8d9 100644 --- a/src/app/api/master/bank/route.ts +++ b/src/app/api/master/bank/route.ts @@ -21,13 +21,11 @@ export async function GET(request: Request) { }, }); - await prisma.$disconnect(); return NextResponse.json( { success: true, message: "Berhasil mendapatkan data", data: res }, { status: 200 } ); } catch (error) { - await prisma.$disconnect(); backendLogger.error("Error Get Master Bank >>", error); return NextResponse.json( { @@ -37,5 +35,7 @@ export async function GET(request: Request) { }, { status: 500 } ); + } finally { + await prisma.$disconnect(); } } diff --git a/src/app/dev/check-cookies/page.tsx b/src/app/dev/check-cookies/page.tsx deleted file mode 100644 index b56d1956..00000000 --- a/src/app/dev/check-cookies/page.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { RouterAdminDashboard } from "@/app/lib/router_hipmi/router_admin"; -import { RouterHome } from "@/app/lib/router_hipmi/router_home"; -import { funGetUserIdByToken } from "@/app_modules/_global/fun/get"; -import { funGlobal_getUserById } from "@/app_modules/_global/fun/get/fun_get_user_by_id"; -import { CheckCookies_UiView } from "@/app_modules/check_cookies"; -import { redirect } from "next/navigation"; - -export default async function Page() { - // const userLoginId = await funGetUserIdByToken(); - // const dataUser = await funGlobal_getUserById({ userId: userLoginId }); - - // if (dataUser?.masterUserRoleId === "1") { - // return redirect(RouterHome.main_home); - // } - - // if (dataUser?.masterUserRoleId !== "1") { - // return redirect(RouterAdminDashboard.splash_admin); - // } - - // return ; -} diff --git a/src/app_modules/check_cookies/index.ts b/src/app_modules/check_cookies/index.ts deleted file mode 100644 index c5fdd44c..00000000 --- a/src/app_modules/check_cookies/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { CheckCookies_UiLayout } from "./layout_cek_cookies"; -import { CheckCookies_UiView } from "./ui_check_cookies"; - -export { CheckCookies_UiView }; -export { CheckCookies_UiLayout }; diff --git a/src/app_modules/check_cookies/layout_cek_cookies.tsx b/src/app_modules/check_cookies/layout_cek_cookies.tsx deleted file mode 100644 index b328354d..00000000 --- a/src/app_modules/check_cookies/layout_cek_cookies.tsx +++ /dev/null @@ -1,48 +0,0 @@ -"use client"; - -import { RouterAuth } from "@/app/lib/router_hipmi/router_auth"; -import { useShallowEffect } from "@mantine/hooks"; -import { redirect, useRouter } from "next/navigation"; -import { MODEL_USER } from "../home/model/interface"; -import { RouterHome } from "@/app/lib/router_hipmi/router_home"; -import { RouterAdminDashboard } from "@/app/lib/router_hipmi/router_admin"; - -export function CheckCookies_UiLayout({ - children, - dataUser, -}: { - children: React.ReactNode; - dataUser: MODEL_USER; -}) { - const router = useRouter(); - - // if (dataUser.active == false){ - // router.push(RouterHome.home_user_non_active, { scroll: false }); - // return children - // } - - - // useShallowEffect(() => { - // onCheckCookies(); - // }, []); - - // async function onCheckCookies() { - // const cek = await fetch("/api/check-cookies"); - - // const result = await cek.json(); - - // if (result.success === false) { - // router.push(RouterAuth.login, { scroll: false }); - // } - // } - - // if (dataUser.masterUserRoleId === "1") { - // router.push(RouterHome.main_home, { scroll: false }); - // } - - // if (dataUser.masterUserRoleId !== "1") { - // router.push(RouterAdminDashboard.splash_admin, { scroll: false }); - // } - - return <>{children}; -} diff --git a/src/app_modules/check_cookies/ui_check_cookies.tsx b/src/app_modules/check_cookies/ui_check_cookies.tsx deleted file mode 100644 index f7a18b31..00000000 --- a/src/app_modules/check_cookies/ui_check_cookies.tsx +++ /dev/null @@ -1,22 +0,0 @@ -"use client"; - -import { RouterAuth } from "@/app/lib/router_hipmi/router_auth"; -import { Button, Center } from "@mantine/core"; -import { useRouter } from "next/navigation"; -import { UIGlobal_LayoutDefault } from "../_global/ui"; - -export function CheckCookies_UiView() { - const router = useRouter(); - - return ( - <> - -
- -
-
- - ); -} diff --git a/src/middleware.ts b/src/middleware.ts index 83574b35..d0d05c35 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -1,6 +1,5 @@ -import { NextRequest, NextResponse } from "next/server"; import { jwtVerify } from "jose"; -import { apies, pages } from "./lib/routes"; +import { NextRequest, NextResponse } from "next/server"; type MiddlewareConfig = { apiPath: string; @@ -110,7 +109,7 @@ export const middleware = async (req: NextRequest) => { // Preserve token in cookie when redirecting if (token) { response.cookies.set(sessionKey, token, { - httpOnly: true, + // httpOnly: true, secure: process.env.NODE_ENV === "production", sameSite: "lax", path: "/", @@ -145,6 +144,19 @@ export const middleware = async (req: NextRequest) => { const userValidateJson = await userValidate.json(); + if (userValidateJson.success == true && userValidateJson.data == null) { + const logout = await fetch(new URL("/api/auth/logout", req.url), { + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, + }); + + if (!logout.ok) { + throw new Error("Failed to logout user"); + } + } + if (!userValidateJson.data.active) { return setCorsHeaders( NextResponse.redirect(new URL("/waiting-room", req.url)) @@ -186,7 +198,7 @@ export const middleware = async (req: NextRequest) => { // Ensure token is preserved in cookie if (token) { response.cookies.set(sessionKey, token, { - httpOnly: true, + // httpOnly: true, secure: process.env.NODE_ENV === "production", sameSite: "lax", path: "/",