From cccb011da506f1bb90ca38ce7d7c9e6020da5a5d Mon Sep 17 00:00:00 2001 From: Bagasbanuna02 Date: Wed, 8 Jan 2025 10:39:18 +0800 Subject: [PATCH] fix ( middleware ) deskripsi: - fix access api melalui middleware di: home, profile dan portofolio --- src/app/api/get-cookie/route.ts | 15 + src/app/api/image/delete/route.ts | 6 +- src/app/api/new/portofolio/[id]/route.ts | 351 +++++++------ src/app/api/user-validate/route.ts | 33 ++ .../api/user/{get => get-cookies}/route.ts | 2 + src/app/api/user/route.ts | 25 + src/app/api/validation/route.ts | 5 - src/app/dev/katalog/[id]/page.tsx | 14 +- .../daftar-portofolio/[id]/page.tsx | 10 +- src/app/dev/portofolio/main/[id]/page.tsx | 15 +- .../fun/get/fun_get_user_id_by_token.ts | 19 - src/app_modules/_global/lib/api_image.ts | 16 + src/app_modules/_global/lib/api_user.ts | 34 +- src/app_modules/home/component/body_home.tsx | 42 +- .../home/component/footer_home.tsx | 14 +- src/app_modules/home/fun/get/api_home.ts | 21 +- src/app_modules/home/view_home_new.tsx | 9 +- src/app_modules/katalog/main/layout_new.tsx | 2 +- .../component/button_delete_new.tsx | 167 ++++--- .../portofolio/component/button_more_new.tsx | 4 +- .../portofolio/component/skeleton_view.tsx | 8 + .../katalog/portofolio/create/view.tsx | 24 - .../katalog/portofolio/lib/api_portofolio.ts | 62 ++- .../portofolio/ui/ui_detail_data_new.tsx | 2 +- .../portofolio/ui/ui_detail_map_new.tsx | 2 +- .../portofolio/ui/ui_detail_media_new.tsx | 2 +- .../ui/ui_detail_portofolio_new.tsx | 28 +- .../ui/ui_list_detail_portofolio_new.tsx | 113 +++-- .../katalog/ui/list_portolio_new.tsx | 2 +- src/app_modules/katalog/ui/profile_detail.tsx | 2 +- src/app_modules/map/lib/api_map.ts | 23 +- src/app_modules/map/ui/ui_map_new.tsx | 2 +- src/app_modules/user/lib/api_user.ts | 19 +- src/app_modules/waiting_room/view.tsx | 17 +- src/middleware.ts | 75 ++- xserver/index.html | 471 ++++++++++++++++++ 36 files changed, 1206 insertions(+), 450 deletions(-) create mode 100644 src/app/api/get-cookie/route.ts create mode 100644 src/app/api/user-validate/route.ts rename src/app/api/user/{get => get-cookies}/route.ts (94%) create mode 100644 src/app/api/user/route.ts create mode 100644 src/app_modules/_global/lib/api_image.ts create mode 100644 src/app_modules/katalog/portofolio/component/skeleton_view.tsx create mode 100644 xserver/index.html diff --git a/src/app/api/get-cookie/route.ts b/src/app/api/get-cookie/route.ts new file mode 100644 index 00000000..8b4959b8 --- /dev/null +++ b/src/app/api/get-cookie/route.ts @@ -0,0 +1,15 @@ +import { cookies } from 'next/headers' +import { NextResponse } from 'next/server'; + +export const dynamic = "force-dynamic"; +export async function GET(request: Request) { + try { + const cookiesKey = process.env.NEXT_PUBLIC_BASE_SESSION_KEY! + const cookieStore = cookies(); + const hipmiKey = cookieStore.get(cookiesKey)?.value || ''; + return NextResponse.json({ token: hipmiKey }); + } catch (error) { + console.error(error); + return NextResponse.json({ error }, { status: 500 }); + } +} \ No newline at end of file diff --git a/src/app/api/image/delete/route.ts b/src/app/api/image/delete/route.ts index a38d0e37..dcf3f89b 100644 --- a/src/app/api/image/delete/route.ts +++ b/src/app/api/image/delete/route.ts @@ -4,6 +4,8 @@ import { NextResponse } from "next/server"; export async function DELETE(req: Request) { const data = await req.json(); + + console.log("data request =>", data); const id = data.fileId; const dirId = data.dirId; @@ -25,9 +27,7 @@ export async function DELETE(req: Request) { backendLogger.info("Server status code: " + res.status); const data = await res.json(); if (res.ok) { - backendLogger.info( - `Success delete ${keyOfDirectory}` - ); + backendLogger.info(`Success delete ${keyOfDirectory}`); return NextResponse.json({ success: true }); } else { const errorText = await res.json(); diff --git a/src/app/api/new/portofolio/[id]/route.ts b/src/app/api/new/portofolio/[id]/route.ts index 747cabd0..24a7497f 100644 --- a/src/app/api/new/portofolio/[id]/route.ts +++ b/src/app/api/new/portofolio/[id]/route.ts @@ -1,173 +1,234 @@ -import { prisma } from "@/app/lib"; +import { DIRECTORY_ID, prisma } from "@/app/lib"; import { NextResponse } from "next/server"; import fs from "fs"; +import { funGlobal_DeleteFileById } from "@/app_modules/_global/fun"; +import { apiDeleteImageById } from "@/app_modules/_global/lib/api_image"; +import backendLogger from "@/util/backendLogger"; export const dynamic = "force-dynamic"; - - // GET ONE DATA PORTOFOLIO BY ID PORTOFOLIO -export async function GET(request: Request, context: { params: { id: string } }) { - try { - let dataFix - const { id } = context.params; - const { searchParams } = new URL(request.url); - const kategori = searchParams.get('cat'); +export async function GET( + request: Request, + context: { params: { id: string } } +) { + try { + let dataFix; + const { id } = context.params; + const { searchParams } = new URL(request.url); + const kategori = searchParams.get("cat"); - if (kategori == "bisnis") { - const data = await prisma.portofolio.findUnique({ - where: { - id: id, - }, + if (kategori == "bisnis") { + const data = await prisma.portofolio.findUnique({ + where: { + id: id, + }, + select: { + id_Portofolio: true, + namaBisnis: true, + alamatKantor: true, + tlpn: true, + deskripsi: true, + logoId: true, + MasterBidangBisnis: { select: { - id_Portofolio: true, - namaBisnis: true, - alamatKantor: true, - tlpn: true, - deskripsi: true, - logoId: true, - MasterBidangBisnis: { - select: { - name: true - } - }, - Profile: { - select: { - userId: true - } - } - } - }); - - dataFix = { - id_Portofolio: data?.id_Portofolio, - namaBisnis: data?.namaBisnis, - alamatKantor: data?.alamatKantor, - tlpn: data?.tlpn, - deskripsi: data?.deskripsi, - logoId: data?.logoId, - bidangBisnis: data?.MasterBidangBisnis?.name, - authorId: data?.Profile?.userId - } - - } else if (kategori == "lokasi") { - const data = await prisma.portofolio.findUnique({ - where: { - id: id, + name: true, }, + }, + Profile: { select: { - logoId: true, - BusinessMaps: { - select: { - id: true, - namePin: true, - latitude: true, - longitude: true, - imageId: true, - pinId: true - } - } - } - }); - - dataFix = { - mapId: data?.BusinessMaps?.id, - logoId: data?.logoId, - namePin: data?.BusinessMaps?.namePin, - latitude: data?.BusinessMaps?.latitude, - longitude: data?.BusinessMaps?.longitude, - imageId: data?.BusinessMaps?.imageId, - pinId: data?.BusinessMaps?.pinId - } - - } else if (kategori == "sosmed") { - const data = await prisma.portofolio.findUnique({ - where: { - id: id, + userId: true, }, + }, + }, + }); + + dataFix = { + id_Portofolio: data?.id_Portofolio, + namaBisnis: data?.namaBisnis, + alamatKantor: data?.alamatKantor, + tlpn: data?.tlpn, + deskripsi: data?.deskripsi, + logoId: data?.logoId, + bidangBisnis: data?.MasterBidangBisnis?.name, + authorId: data?.Profile?.userId, + }; + } else if (kategori == "lokasi") { + const data = await prisma.portofolio.findUnique({ + where: { + id: id, + }, + select: { + logoId: true, + BusinessMaps: { select: { - Portofolio_MediaSosial: { - select: { - facebook: true, - twitter: true, - instagram: true, - tiktok: true, - youtube: true - } - } - } - }); + id: true, + namePin: true, + latitude: true, + longitude: true, + imageId: true, + pinId: true, + }, + }, + }, + }); - dataFix = { - facebook: data?.Portofolio_MediaSosial?.facebook, - twitter: data?.Portofolio_MediaSosial?.twitter, - instagram: data?.Portofolio_MediaSosial?.instagram, - tiktok: data?.Portofolio_MediaSosial?.tiktok, - youtube: data?.Portofolio_MediaSosial?.youtube - } - } + dataFix = { + mapId: data?.BusinessMaps?.id, + logoId: data?.logoId, + namePin: data?.BusinessMaps?.namePin, + latitude: data?.BusinessMaps?.latitude, + longitude: data?.BusinessMaps?.longitude, + imageId: data?.BusinessMaps?.imageId, + pinId: data?.BusinessMaps?.pinId, + }; + } else if (kategori == "sosmed") { + const data = await prisma.portofolio.findUnique({ + where: { + id: id, + }, + select: { + Portofolio_MediaSosial: { + select: { + facebook: true, + twitter: true, + instagram: true, + tiktok: true, + youtube: true, + }, + }, + }, + }); - return NextResponse.json({ success: true, message: "Berhasil mendapatkan data", data: dataFix }, { status: 200 }); + dataFix = { + facebook: data?.Portofolio_MediaSosial?.facebook, + twitter: data?.Portofolio_MediaSosial?.twitter, + instagram: data?.Portofolio_MediaSosial?.instagram, + tiktok: data?.Portofolio_MediaSosial?.tiktok, + youtube: data?.Portofolio_MediaSosial?.youtube, + }; + } - } catch (error) { - console.error(error); - return NextResponse.json({ success: false, message: "Gagal mendapatkan data, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); - } + return NextResponse.json( + { success: true, message: "Berhasil mendapatkan data", data: dataFix }, + { status: 200 } + ); + } catch (error) { + console.error(error); + return NextResponse.json( + { + success: false, + message: "Gagal mendapatkan data, coba lagi nanti (error: 500)", + reason: (error as Error).message, + }, + { status: 500 } + ); + } } // DELETE ONE DATA PORTOFOLIO -export async function DELETE(request: Request, context: { params: { id: string } }) { - try { - const { id } = context.params +export async function DELETE( + request: Request, + context: { params: { id: string } } +) { + try { + const { id } = context.params; - const data = await prisma.portofolio.findUnique({ - where: { - id: id - } - }) + const data = await prisma.portofolio.findUnique({ + where: { + id: id, + }, + include: { + BusinessMaps: { + select: { + pinId: true, + imageId: true, + }, + }, + }, + }); - const findLogo = await prisma.images.findFirst({ - where: { - id: String(data?.logoId), - }, - select: { - id: true, - url: true, - }, - }); + try { + const id = data?.logoId; + const deleteLogo = await fetch( + `https://wibu-storage.wibudev.com/api/files/${id}/delete`, + { + method: "DELETE", + headers: { + Authorization: `Bearer ${process.env.WS_APIKEY}`, + }, + } + ); - if (findLogo) { - fs.unlinkSync(`./public/portofolio/logo/${findLogo.url}`) - const deleteLogo = await prisma.images.delete({ - where: { - id: String(findLogo?.id), - }, - }); + if (deleteLogo.ok) { + backendLogger.info(`Success delete logo`); } + if (data?.BusinessMaps?.pinId != null) { + const pinId = data?.BusinessMaps?.pinId; + const deletePin = await fetch( + `https://wibu-storage.wibudev.com/api/files/${pinId}/delete`, + { + method: "DELETE", + headers: { + Authorization: `Bearer ${process.env.WS_APIKEY}`, + }, + } + ); + if (deletePin.ok) { + backendLogger.info(`Success delete pin`); + } - const deletePortoMedsos = await prisma.portofolio_MediaSosial.delete({ - where: { - portofolioId: id, - }, - }); + const imageId = data?.BusinessMaps?.imageId; + const deleteImage = await fetch( + `https://wibu-storage.wibudev.com/api/files/${imageId}/delete`, + { + method: "DELETE", + headers: { + Authorization: `Bearer ${process.env.WS_APIKEY}`, + }, + } + ); - const deleteMap = await prisma.businessMaps.delete({ - where: { - portofolioId: id - } - }) + if (deleteImage.ok) { + backendLogger.info(`Success delete image`); + } + } + } catch (error) { + backendLogger.error("Error delete logo", error); + } - const deletePortofolio = await prisma.portofolio.delete({ - where: { - id: id, - }, - }); + const deletePortoMedsos = await prisma.portofolio_MediaSosial.delete({ + where: { + portofolioId: id, + }, + }); - return NextResponse.json({ success: true, message: "Berhasil menghapus data" }, { status: 200 }); + const deleteMap = await prisma.businessMaps.delete({ + where: { + portofolioId: id, + }, + }); - } catch (error) { - console.error(error); - return NextResponse.json({ success: false, message: "Gagal menghapus data, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); - } -} \ No newline at end of file + const deletePortofolio = await prisma.portofolio.delete({ + where: { + id: id, + }, + }); + + return NextResponse.json( + { success: true, message: "Berhasil menghapus data" }, + { status: 200 } + ); + } catch (error) { + console.error(error); + return NextResponse.json( + { + success: false, + message: "Gagal menghapus data, coba lagi nanti (error: 500)", + reason: (error as Error).message, + }, + { status: 500 } + ); + } +} diff --git a/src/app/api/user-validate/route.ts b/src/app/api/user-validate/route.ts new file mode 100644 index 00000000..8842f6f1 --- /dev/null +++ b/src/app/api/user-validate/route.ts @@ -0,0 +1,33 @@ +import { decrypt } from "@/app/auth/_lib/decrypt"; +import { prisma } from "@/app/lib"; +import { cookies } from 'next/headers' +import { NextRequest, NextResponse } from "next/server"; + +export const dynamic = "force-dynamic"; + +export async function GET(req: NextRequest) { + const token = req.headers.get('Authorization')?.split(' ')[1]; + + const decripted = await decrypt({ + token: token!, + encodedKey: process.env.NEXT_PUBLIC_BASE_TOKEN_KEY! + }) + + if (!decripted) { + return NextResponse.json({ + success: false, + message: "Unauthorized" + }, { status: 401 }) + } + + const user = await prisma.user.findUnique({ + where: { + id: decripted.id + } + }) + return NextResponse.json({ + success: true, + message: "Berhasil mendapatkan data", + data: user + }) +} \ No newline at end of file diff --git a/src/app/api/user/get/route.ts b/src/app/api/user/get-cookies/route.ts similarity index 94% rename from src/app/api/user/get/route.ts rename to src/app/api/user/get-cookies/route.ts index 258227c5..f59b5fe8 100644 --- a/src/app/api/user/get/route.ts +++ b/src/app/api/user/get-cookies/route.ts @@ -3,6 +3,8 @@ import _ from "lodash"; import { cookies } from "next/headers"; import { NextResponse } from "next/server"; +export const dynamic = "force-dynamic"; + export async function GET() { // const data = await req.text(); // console.log(data); diff --git a/src/app/api/user/route.ts b/src/app/api/user/route.ts new file mode 100644 index 00000000..1ae5f208 --- /dev/null +++ b/src/app/api/user/route.ts @@ -0,0 +1,25 @@ + +import { decrypt } from "@/app/auth/_lib/decrypt"; +import _ from "lodash"; +import { cookies } from "next/headers"; +import { NextResponse } from "next/server"; + +export const dynamic = "force-dynamic"; + +export async function GET() { + const c = cookies().get(process.env.NEXT_PUBLIC_BASE_SESSION_KEY!); + + if (!c || !c?.value || _.isEmpty(c?.value) || _.isUndefined(c?.value)) { + return NextResponse.json({ status: 401, message: "Unauthorized" }); + } + + const token = c.value; + const dataUser = await decrypt({ + token: token, + encodedKey: process.env.NEXT_PUBLIC_BASE_TOKEN_KEY!, + }); + + const id = dataUser?.id + + return NextResponse.json({ status: 200, message: "OK", data: id }); +} diff --git a/src/app/api/validation/route.ts b/src/app/api/validation/route.ts index 6b420a9e..ba9c6587 100644 --- a/src/app/api/validation/route.ts +++ b/src/app/api/validation/route.ts @@ -5,12 +5,7 @@ import { NextResponse } from "next/server"; export async function GET(req: Request) { const auth = req.headers.get("Authorization"); const token = auth?.split(" ")[1]; - - console.log("validasi atas", token); - if (!token) return NextResponse.json({ success: false }, { status: 401 }); - console.log("validasi bawah", token); - return NextResponse.json({ success: true }); } diff --git a/src/app/dev/katalog/[id]/page.tsx b/src/app/dev/katalog/[id]/page.tsx index 98ab33e3..997d4b80 100644 --- a/src/app/dev/katalog/[id]/page.tsx +++ b/src/app/dev/katalog/[id]/page.tsx @@ -1,20 +1,8 @@ import { ViewKatalogNew } from "@/app_modules/katalog"; -export default async function Page({ params }: { params: { id: string } }) { - // let profileId = params.id; - // const userLoginId = await funGetUserIdByToken(); - - // const listPorto = await funGetListPortofolio(profileId); - // const dataProfile = await Profile_getOneProfileAndUserById(profileId); - +export default async function Page() { return ( <> - {/* */} - ); diff --git a/src/app/dev/portofolio/daftar-portofolio/[id]/page.tsx b/src/app/dev/portofolio/daftar-portofolio/[id]/page.tsx index 2252757b..5b2146ad 100644 --- a/src/app/dev/portofolio/daftar-portofolio/[id]/page.tsx +++ b/src/app/dev/portofolio/daftar-portofolio/[id]/page.tsx @@ -1,16 +1,8 @@ import { ListDetailPortofolioNew } from "@/app_modules/katalog/portofolio"; -export default async function Page({ params }: { params: { id: string } }) { - // const profileId = params.id; - // const dataPortofolio = await portofolio_funGetAllDaftarByid({ - // profileId, - // page: 1, - // }); - - +export default async function Page() { return ( <> - {/* */} ); diff --git a/src/app/dev/portofolio/main/[id]/page.tsx b/src/app/dev/portofolio/main/[id]/page.tsx index ab45a811..741c8aff 100644 --- a/src/app/dev/portofolio/main/[id]/page.tsx +++ b/src/app/dev/portofolio/main/[id]/page.tsx @@ -1,19 +1,16 @@ +import { funGetUserIdByToken } from "@/app_modules/_global/fun/get"; import { Portofolio_UiDetailNew } from "@/app_modules/katalog/portofolio"; const mapboxToken = process.env.MAPBOX_TOKEN!; -export default async function Page({ params }: { params: { id: string } }) { - // const portofolioId = params.id; - // const dataPortofolio = await portofolio_getOneById(portofolioId); - // const userLoginId = await funGetUserIdByToken(); +export default async function Page() { + const userLoginId = await funGetUserIdByToken() return ( <> - {/* */} - + userLoginId={userLoginId} + /> ); } diff --git a/src/app_modules/_global/fun/get/fun_get_user_id_by_token.ts b/src/app_modules/_global/fun/get/fun_get_user_id_by_token.ts index 799c46c4..cfbdb1e2 100644 --- a/src/app_modules/_global/fun/get/fun_get_user_id_by_token.ts +++ b/src/app_modules/_global/fun/get/fun_get_user_id_by_token.ts @@ -1,6 +1,5 @@ "use server"; -import { jwtVerify } from "jose"; import { cookies } from "next/headers"; import { decrypt } from "../../../../app/auth/_lib/decrypt"; @@ -16,21 +15,3 @@ export async function funGetUserIdByToken() { return cekUser?.id; } -// 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; -// } -// } diff --git a/src/app_modules/_global/lib/api_image.ts b/src/app_modules/_global/lib/api_image.ts new file mode 100644 index 00000000..23e35b78 --- /dev/null +++ b/src/app_modules/_global/lib/api_image.ts @@ -0,0 +1,16 @@ +export const apiDeleteImageById = async ({ + fileId, + dirId, +}: { + fileId: string; + dirId?: string; +}) => { + const response = await fetch(`/api/image/delete`, { + method: "DELETE", + body: JSON.stringify({ fileId, dirId }), + }); + + console.log("delete api =>", await response.json()); + + return await response.json().catch(() => null); +}; diff --git a/src/app_modules/_global/lib/api_user.ts b/src/app_modules/_global/lib/api_user.ts index 7c868120..b21ad919 100644 --- a/src/app_modules/_global/lib/api_user.ts +++ b/src/app_modules/_global/lib/api_user.ts @@ -1,9 +1,39 @@ +export const apiGetUserId = async () => { + const { token } = await fetch("/api/get-cookie").then((res) => res.json()); + if (!token) return await token.json().catch(() => null); + + const response = await fetch(`/api/user`, { + headers: { + "Content-Type": "application/json", + Accept: "application/json", + "Access-Control-Allow-Origin": "*", + Authorization: `Bearer ${token}`, + }, + }); + + console.log("Ini di pemanggilan API",await response.json()); + + if (!response.ok) return null; + const data: Record = await response.json(); + return data; +}; + export const apiGetCookiesUser = async () => { const response = await fetch(`/api/user/get`); return await response.json().catch(() => null); }; export const apiGetACtivationUser = async () => { - const response = await fetch(`/api/user/activation`); + const { token } = await fetch("/api/get-cookie").then((res) => res.json()); + if (!token) return await token.json().catch(() => null); + + const response = await fetch(`/api/user/activation`, { + headers: { + "Content-Type": "application/json", + Accept: "application/json", + "Access-Control-Allow-Origin": "*", + Authorization: `Bearer ${token}`, + }, + }); return await response.json().catch(() => null); -}; \ No newline at end of file +}; diff --git a/src/app_modules/home/component/body_home.tsx b/src/app_modules/home/component/body_home.tsx index 456ee0b4..ebd7a75a 100644 --- a/src/app_modules/home/component/body_home.tsx +++ b/src/app_modules/home/component/body_home.tsx @@ -13,7 +13,7 @@ import { Paper, SimpleGrid, Stack, - Text + Text, } from "@mantine/core"; import { useShallowEffect } from "@mantine/hooks"; import { IconUserSearch } from "@tabler/icons-react"; @@ -22,6 +22,7 @@ import { useRouter } from "next/navigation"; import { useState } from "react"; import { apiGetDataHome } from "../fun/get/api_home"; import { listMenuHomeBody, menuHomeJob } from "./list_menu_home"; +import { clientLogger } from "@/util/clientLogger"; export default function BodyHome() { const router = useRouter(); @@ -37,24 +38,31 @@ export default function BodyHome() { async function cekUserLogin() { try { - const response = await apiGetDataHome("?cat=cek_profile"); - if (response.success) { + const response = await apiGetDataHome({ + path: "?cat=cek_profile", + }); + + if (response) { setDataUser(response.data); } } catch (error) { - console.error(error); + clientLogger.error("Error get data user", error); } } async function getHomeJob() { try { setLoadingJob(true); - const response = await apiGetDataHome("?cat=job"); - if (response.success) { + + const response = await apiGetDataHome({ + path: "?cat=job", + }); + + if (response) { setDataJob(response.data); } } catch (error) { - console.error(error); + clientLogger.error("Error get data job", error); } finally { setLoadingJob(false); } @@ -197,12 +205,22 @@ export default function BodyHome() { - - - + + + - - + + diff --git a/src/app_modules/home/component/footer_home.tsx b/src/app_modules/home/component/footer_home.tsx index 7699a86e..de65b7db 100644 --- a/src/app_modules/home/component/footer_home.tsx +++ b/src/app_modules/home/component/footer_home.tsx @@ -17,6 +17,7 @@ import { apiGetDataHome } from "../fun/get/api_home"; import { Home_ComponentAvatarProfile } from "./comp_avatar_profile"; import { listMenuHomeFooter } from "./list_menu_home"; import { MainColor } from "@/app_modules/_global/color"; +import { clientLogger } from "@/util/clientLogger"; export default function FooterHome() { const router = useRouter(); @@ -28,12 +29,14 @@ export default function FooterHome() { async function cekUserLogin() { try { - const response = await apiGetDataHome("?cat=cek_profile"); - if (response.success) { + const response = await apiGetDataHome({ + path: "?cat=cek_profile", + }); + if (response) { setDataUser(response.data); } } catch (error) { - console.error(error); + clientLogger.error("Error get data profile",error); } } @@ -104,7 +107,10 @@ export default function FooterHome() { } }} > - + {dataUser.profile === undefined || dataUser?.profile === null ? ( ) : ( diff --git a/src/app_modules/home/fun/get/api_home.ts b/src/app_modules/home/fun/get/api_home.ts index e55ec5eb..8600b3aa 100644 --- a/src/app_modules/home/fun/get/api_home.ts +++ b/src/app_modules/home/fun/get/api_home.ts @@ -1,4 +1,17 @@ -export const apiGetDataHome = async (path?: string) => { - const response = await fetch(`/api/new/home${(path) ? path : ''}`) - return await response.json().catch(() => null) -} \ No newline at end of file +export const apiGetDataHome = async ({ path }: { path?: string }) => { + const { token } = await fetch("/api/get-cookie").then((res) => res.json()); + if (!token) return await token.json().catch(() => null); + + const response = await fetch(`/api/new/home${path ? path : ""}`, { + headers: { + "Content-Type": "application/json", + Accept: "application/json", + "Access-Control-Allow-Origin": "*", + Authorization: `Bearer ${token}`, + }, + }); + + if (!response.ok) return null; + const data: Record = await response.json(); + return data; +}; diff --git a/src/app_modules/home/view_home_new.tsx b/src/app_modules/home/view_home_new.tsx index 67980668..b2dd7fda 100644 --- a/src/app_modules/home/view_home_new.tsx +++ b/src/app_modules/home/view_home_new.tsx @@ -17,6 +17,7 @@ import { gs_notifikasi_kategori_app } from "../notifikasi/lib"; import BodyHome from "./component/body_home"; import FooterHome from "./component/footer_home"; import { apiGetDataHome } from "./fun/get/api_home"; +import { clientLogger } from "@/util/clientLogger"; export default function HomeViewNew() { const [countNtf, setCountNtf] = useAtom(gs_count_ntf); @@ -48,12 +49,14 @@ export default function HomeViewNew() { async function cekUserLogin() { try { - const response = await apiGetDataHome("?cat=cek_profile"); - if (response.success) { + const response = await apiGetDataHome({ + path: "?cat=cek_profile", + }); + if (response) { setDataUser(response.data); } } catch (error) { - console.error(error); + clientLogger.error("Error get data home", error); } } diff --git a/src/app_modules/katalog/main/layout_new.tsx b/src/app_modules/katalog/main/layout_new.tsx index 56e24577..e96ae293 100644 --- a/src/app_modules/katalog/main/layout_new.tsx +++ b/src/app_modules/katalog/main/layout_new.tsx @@ -22,7 +22,7 @@ export default function LayoutKatalogNew({ children }: { children: any }) { setLoading(true) const response = await apiGetUserProfile(`?profile=${param.id}`) const response2 = await funGetUserIdByToken() - if (response.success) { + if (response) { setAuthorId(response.data.id) setUserRoleId(response.data.masterUserRoleId) setUserLoginId(response2) diff --git a/src/app_modules/katalog/portofolio/component/button_delete_new.tsx b/src/app_modules/katalog/portofolio/component/button_delete_new.tsx index a1d5f399..384678dc 100644 --- a/src/app_modules/katalog/portofolio/component/button_delete_new.tsx +++ b/src/app_modules/katalog/portofolio/component/button_delete_new.tsx @@ -1,98 +1,103 @@ import { funGetUserIdByToken } from "@/app_modules/_global/fun/get"; -import { ComponentGlobal_NotifikasiBerhasil, ComponentGlobal_NotifikasiGagal } from "@/app_modules/_global/notif_global"; +import { + ComponentGlobal_NotifikasiBerhasil, + ComponentGlobal_NotifikasiGagal, +} from "@/app_modules/_global/notif_global"; import { UIGlobal_Modal } from "@/app_modules/_global/ui"; import { Button } from "@mantine/core"; import { useShallowEffect } from "@mantine/hooks"; import { IconTrash } from "@tabler/icons-react"; import { useParams, useRouter } from "next/navigation"; import { useState } from "react"; -import { apiDeletePortofolio, apiGetOnePortofolioById } from "../lib/api_portofolio"; +import { + apiDeletePortofolio, + apiGetOnePortofolioById, +} from "../lib/api_portofolio"; import { IDetailPortofolioBisnis } from "../lib/type_portofolio"; import { MainColor } from "@/app_modules/_global/color"; +import { apiGetUserId } from "@/app_modules/_global/lib/api_user"; +import { clientLogger } from "@/util/clientLogger"; -export default function ComponentPortofolio_ButtonDeleteNew() { - const param = useParams<{ id: string }>() - const [openModal, setModal] = useState(false) - const [loadingDel, setLoadingDel] = useState(false) - const [userLoginId, setUserLoginId] = useState("") - const [dataPorto, setDataPorto] = useState() - const router = useRouter() +export default function ComponentPortofolio_ButtonDeleteNew({ + userLoginId, +}: { + userLoginId: string; +}) { + const param = useParams<{ id: string }>(); + const [openModal, setModal] = useState(false); + const [loadingDel, setLoadingDel] = useState(false); + const [dataPorto, setDataPorto] = useState(); + const router = useRouter(); - - async function onDelete() { - try { - setLoadingDel(true) - const response = await apiDeletePortofolio(param.id) - if (response.success) { - ComponentGlobal_NotifikasiBerhasil(response.message) - router.back() - } else { - ComponentGlobal_NotifikasiGagal(response.message); - } - } catch (error) { - console.error(error) - ComponentGlobal_NotifikasiGagal("Gagal menghapus portofolio"); - } finally { - setLoadingDel(false) + async function onDelete() { + try { + setLoadingDel(true); + const response = await apiDeletePortofolio(param.id); + if (response) { + ComponentGlobal_NotifikasiBerhasil(response.message); + router.back(); + } else { + ComponentGlobal_NotifikasiGagal(response?.message); } - } + } catch (error) { + clientLogger.error("Error delete portofolio", error); + ComponentGlobal_NotifikasiGagal("Gagal menghapus portofolio"); + } finally { + setLoadingDel(false); + } + } - async function funGetPortofolio() { - try { - const response = await apiGetOnePortofolioById(param.id, "bisnis") - const response2 = await funGetUserIdByToken() - if (response.success) { - setDataPorto(response.data) - setUserLoginId(response2) - } - } catch (error) { - console.error(error); + async function funGetPortofolio() { + try { + const response = await apiGetOnePortofolioById(param.id, "bisnis"); + if (response) { + setDataPorto(response.data); } - } + } catch (error) { + console.error("Error get data button delete:", error); + } + } - useShallowEffect(() => { - funGetPortofolio() - }, []); + useShallowEffect(() => { + funGetPortofolio(); + }, []); + return ( + <> + {userLoginId === dataPorto?.authorId && ( + + )} - return ( - <> - {userLoginId === dataPorto?.authorId ? ( - - ) : ( - "" - )} - - setModal(false)} - buttonKiri={ - - } - buttonKanan={ - - } - /> - - ) -} \ No newline at end of file + setModal(false)} + buttonKiri={ + + } + buttonKanan={ + + } + /> + + ); +} diff --git a/src/app_modules/katalog/portofolio/component/button_more_new.tsx b/src/app_modules/katalog/portofolio/component/button_more_new.tsx index e9a92b5c..96655db3 100644 --- a/src/app_modules/katalog/portofolio/component/button_more_new.tsx +++ b/src/app_modules/katalog/portofolio/component/button_more_new.tsx @@ -89,9 +89,9 @@ export default function ComponentPortofolio_ButtonMoreNew() { const response = await apiGetOnePortofolioById(param.id, "bisnis") const response3 = await apiGetOnePortofolioById(param.id, "lokasi") const response2 = await funGetUserIdByToken() - if (response.success) { + if (response) { setAuthorId(response.data.authorId) - setMapId((response3.data?.mapId !== null && response3.data?.mapId !== undefined) ? true : false) + setMapId((response3 !== null && response3.data?.mapId !== undefined) ? true : false) setUserLoginId(response2) } } catch (error) { diff --git a/src/app_modules/katalog/portofolio/component/skeleton_view.tsx b/src/app_modules/katalog/portofolio/component/skeleton_view.tsx new file mode 100644 index 00000000..293075fa --- /dev/null +++ b/src/app_modules/katalog/portofolio/component/skeleton_view.tsx @@ -0,0 +1,8 @@ +export { + +} + +function Portofolio_SkeletonListPorto() { + + +} \ No newline at end of file diff --git a/src/app_modules/katalog/portofolio/create/view.tsx b/src/app_modules/katalog/portofolio/create/view.tsx index 1bfcaf71..262d989c 100644 --- a/src/app_modules/katalog/portofolio/create/view.tsx +++ b/src/app_modules/katalog/portofolio/create/view.tsx @@ -162,30 +162,6 @@ export default function CreatePortofolio({ /> - {/* { - setDataPortofolio({ - ...dataPortofolio, - tlpn: val.target.value, - }); - }} - /> */} -