From abe92e4ad2120e0f951a841b876317a38877bf3e Mon Sep 17 00:00:00 2001 From: Bagasbanuna02 Date: Fri, 10 Jan 2025 08:49:30 +0800 Subject: [PATCH] fix ( user access ) deskripsi: - membatasi akses user yang hanya bisa di berikan oleh admin --- bun.lockb | Bin 716668 -> 716700 bytes package.json | 1 + .../20250108154615_new_database/migration.sql | 198 ++++++++++++ src/app/api/auth/register/route.ts | 2 +- src/app/api/image/upload/route.ts | 24 +- src/app/api/new/home/route.ts | 2 +- src/app/lib/global_state.ts | 17 +- src/app/lib/realtime_provider.tsx | 281 ++++++++++-------- src/app/zCoba/upload/fun_upload.ts | 52 ++++ src/app/zCoba/upload/page.tsx | 137 +++++++++ src/app_modules/admin/developer/index.tsx | 4 + .../user-access/fun/edit/fun_edit_access.ts | 30 +- .../admin/user-access/view/index.tsx | 22 +- src/app_modules/auth/login/view.tsx | 2 +- src/app_modules/auth/register/view.tsx | 10 +- src/app_modules/auth/validasi/view.tsx | 13 +- src/app_modules/home/component/body_home.tsx | 47 +-- .../home/component/footer_home.tsx | 12 +- .../home/{state => component}/global_state.ts | 1 + src/app_modules/home/view_home_new.tsx | 4 +- src/app_modules/waiting_room/view.tsx | 63 ++-- src/middleware.ts | 40 ++- 22 files changed, 744 insertions(+), 218 deletions(-) create mode 100644 prisma/migrations/20250108154615_new_database/migration.sql create mode 100644 src/app/zCoba/upload/fun_upload.ts create mode 100644 src/app/zCoba/upload/page.tsx rename src/app_modules/home/{state => component}/global_state.ts (79%) diff --git a/bun.lockb b/bun.lockb index d9e86731f88f79a2fd315943001a845fb026577a..6ecc0fa08c2a033c3e569ae708ad7dd24b6c44f8 100755 GIT binary patch delta 37442 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 F_a9G*D!>2$ delta 37452 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 diff --git a/package.json b/package.json index d0cba3cf..e68364b8 100644 --- a/package.json +++ b/package.json @@ -87,6 +87,7 @@ "react-quill": "^2.0.0", "react-responsive-carousel": "^3.2.23", "react-toastify": "^9.1.3", + "sharp": "^0.33.5", "socket.io-client": "^4.7.2", "tailwindcss": "3.3.3", "ts-node": "^10.9.2", diff --git a/prisma/migrations/20250108154615_new_database/migration.sql b/prisma/migrations/20250108154615_new_database/migration.sql new file mode 100644 index 00000000..3476e5af --- /dev/null +++ b/prisma/migrations/20250108154615_new_database/migration.sql @@ -0,0 +1,198 @@ +/* + Warnings: + + - You are about to drop the column `imagesId` on the `Job` table. All the data in the column will be lost. + - You are about to drop the column `active` on the `MasterBank` table. All the data in the column will be lost. + - You are about to drop the column `name` on the `MasterBank` table. All the data in the column will be lost. + - You are about to drop the column `imagesBackgroundId` on the `Profile` table. All the data in the column will be lost. + - You are about to drop the column `imagesId` on the `Profile` table. All the data in the column will be lost. + - You are about to drop the `ImagesBackground` table. If the table is not empty, all the data it contains will be lost. + - Added the required column `namaAkun` to the `MasterBank` table without a default value. This is not possible if the table is not empty. + - Added the required column `namaBank` to the `MasterBank` table without a default value. This is not possible if the table is not empty. + +*/ +-- DropForeignKey +ALTER TABLE "Job" DROP CONSTRAINT "Job_imagesId_fkey"; + +-- DropForeignKey +ALTER TABLE "Notifikasi" DROP CONSTRAINT "NotifikasiAdmin"; + +-- DropForeignKey +ALTER TABLE "Notifikasi" DROP CONSTRAINT "NotifikasiUser"; + +-- DropForeignKey +ALTER TABLE "Portofolio" DROP CONSTRAINT "Portofolio_logoId_fkey"; + +-- DropForeignKey +ALTER TABLE "Profile" DROP CONSTRAINT "Profile_imagesBackgroundId_fkey"; + +-- DropForeignKey +ALTER TABLE "Profile" DROP CONSTRAINT "Profile_imagesId_fkey"; + +-- DropIndex +DROP INDEX "Profile_imagesBackgroundId_key"; + +-- DropIndex +DROP INDEX "Profile_imagesId_key"; + +-- AlterTable +ALTER TABLE "BeritaInvestasi" ADD COLUMN "imageId" TEXT; + +-- AlterTable +ALTER TABLE "DokumenInvestasi" ADD COLUMN "fileId" TEXT, +ALTER COLUMN "url" DROP NOT NULL; + +-- AlterTable +ALTER TABLE "Donasi" ADD COLUMN "imageId" TEXT; + +-- AlterTable +ALTER TABLE "Donasi_Cerita" ADD COLUMN "imageId" TEXT; + +-- AlterTable +ALTER TABLE "Donasi_Invoice" ADD COLUMN "imageId" TEXT; + +-- AlterTable +ALTER TABLE "Donasi_Kabar" ADD COLUMN "imageId" TEXT; + +-- AlterTable +ALTER TABLE "Donasi_PencairanDana" ADD COLUMN "imageId" TEXT; + +-- AlterTable +ALTER TABLE "Donasi_TemporaryCreate" ADD COLUMN "imageId" TEXT; + +-- AlterTable +ALTER TABLE "Event" ADD COLUMN "isArsip" BOOLEAN DEFAULT false, +ADD COLUMN "tanggalSelesai" TIMESTAMP(3), +ALTER COLUMN "tanggal" DROP NOT NULL; + +-- AlterTable +ALTER TABLE "Event_Peserta" ADD COLUMN "isPresent" BOOLEAN NOT NULL DEFAULT false; + +-- AlterTable +ALTER TABLE "Investasi" ADD COLUMN "imageId" TEXT, +ADD COLUMN "prospektusFileId" TEXT; + +-- AlterTable +ALTER TABLE "Job" DROP COLUMN "imagesId", +ADD COLUMN "imageId" TEXT; + +-- AlterTable +ALTER TABLE "MasterBank" DROP COLUMN "active", +DROP COLUMN "name", +ADD COLUMN "isActive" BOOLEAN NOT NULL DEFAULT true, +ADD COLUMN "namaAkun" TEXT NOT NULL, +ADD COLUMN "namaBank" TEXT NOT NULL; + +-- AlterTable +ALTER TABLE "Notifikasi" ALTER COLUMN "userId" DROP NOT NULL, +ALTER COLUMN "adminId" DROP NOT NULL; + +-- AlterTable +ALTER TABLE "Profile" DROP COLUMN "imagesBackgroundId", +DROP COLUMN "imagesId", +ADD COLUMN "imageBackgroundId" TEXT, +ADD COLUMN "imageId" TEXT; + +-- AlterTable +ALTER TABLE "ProspektusInvestasi" ADD COLUMN "fileId" TEXT, +ADD COLUMN "title" TEXT; + +-- AlterTable +ALTER TABLE "User" ALTER COLUMN "active" SET DEFAULT false; + +-- AlterTable +ALTER TABLE "UserSession" ALTER COLUMN "expires" DROP NOT NULL; + +-- AlterTable +ALTER TABLE "Voting" ADD COLUMN "isArsip" BOOLEAN NOT NULL DEFAULT false; + +-- DropTable +DROP TABLE "ImagesBackground"; + +-- CreateTable +CREATE TABLE "Investasi_Invoice" ( + "id" TEXT NOT NULL, + "isActive" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "nominal" TEXT NOT NULL, + "lembarTerbeli" TEXT NOT NULL, + "investasiId" TEXT, + "masterBankId" TEXT, + "statusInvoiceId" TEXT, + "authorId" TEXT, + "imagesId" TEXT, + "imageId" TEXT, + + CONSTRAINT "Investasi_Invoice_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "InvestasiMaster_StatusInvoice" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "isActive" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "InvestasiMaster_StatusInvoice_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "BusinessMaps" ( + "id" TEXT NOT NULL, + "isActive" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "namePin" TEXT NOT NULL, + "latitude" DOUBLE PRECISION NOT NULL, + "longitude" DOUBLE PRECISION NOT NULL, + "authorId" TEXT, + "portofolioId" TEXT, + "imageId" TEXT, + "pinId" TEXT, + + CONSTRAINT "BusinessMaps_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "MasterKategoriApp" ( + "id" TEXT NOT NULL, + "isActive" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "name" TEXT NOT NULL, + "value" TEXT, + + CONSTRAINT "MasterKategoriApp_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "BusinessMaps_portofolioId_key" ON "BusinessMaps"("portofolioId"); + +-- AddForeignKey +ALTER TABLE "Investasi_Invoice" ADD CONSTRAINT "Investasi_Invoice_investasiId_fkey" FOREIGN KEY ("investasiId") REFERENCES "Investasi"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Investasi_Invoice" ADD CONSTRAINT "Investasi_Invoice_masterBankId_fkey" FOREIGN KEY ("masterBankId") REFERENCES "MasterBank"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Investasi_Invoice" ADD CONSTRAINT "Investasi_Invoice_statusInvoiceId_fkey" FOREIGN KEY ("statusInvoiceId") REFERENCES "InvestasiMaster_StatusInvoice"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Investasi_Invoice" ADD CONSTRAINT "Investasi_Invoice_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Investasi_Invoice" ADD CONSTRAINT "Investasi_Invoice_imagesId_fkey" FOREIGN KEY ("imagesId") REFERENCES "Images"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Notifikasi" ADD CONSTRAINT "NotifikasiUser" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Notifikasi" ADD CONSTRAINT "NotifikasiAdmin" FOREIGN KEY ("adminId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "BusinessMaps" ADD CONSTRAINT "BusinessMaps_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "BusinessMaps" ADD CONSTRAINT "BusinessMaps_portofolioId_fkey" FOREIGN KEY ("portofolioId") REFERENCES "Portofolio"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/src/app/api/auth/register/route.ts b/src/app/api/auth/register/route.ts index af61f470..53f83014 100644 --- a/src/app/api/auth/register/route.ts +++ b/src/app/api/auth/register/route.ts @@ -24,7 +24,7 @@ export async function POST(req: Request) { data: { username: data.username, nomor: data.nomor, - active: true, + active: false, }, }); diff --git a/src/app/api/image/upload/route.ts b/src/app/api/image/upload/route.ts index a1004088..d0aef5e2 100644 --- a/src/app/api/image/upload/route.ts +++ b/src/app/api/image/upload/route.ts @@ -1,6 +1,7 @@ import { funGetDirectoryNameByValue } from "@/app_modules/_global/fun/get"; import backendLogger from "@/util/backendLogger"; import { NextResponse } from "next/server"; +import sharp from "sharp"; export async function POST(request: Request) { const formData = await request.formData(); @@ -11,9 +12,30 @@ export async function POST(request: Request) { if (request.method === "POST") { try { + const file: any = formData.get("file"); + console.log("ini file baru>", file); + + // Resize ukuran + const imageBuffer = await file.arrayBuffer(); + const resize = await sharp(imageBuffer).resize(2000).toBuffer(); + + // Convert buffer ke Blob + const blob = new Blob([resize], { type: file.type }); + + // Convert Blob ke File + const resizedFile = new File([blob], file.name, { + type: file.type, + lastModified: new Date().getTime(), + }); + + // Buat FormData baru + const newFormData = new FormData(); + newFormData.append("file", resizedFile); + newFormData.append("dirId", formData.get("dirId") as string); + const res = await fetch("https://wibu-storage.wibudev.com/api/upload", { method: "POST", - body: formData, + body: newFormData, headers: { Authorization: `Bearer ${process.env.WS_APIKEY}`, }, diff --git a/src/app/api/new/home/route.ts b/src/app/api/new/home/route.ts index bdb110d8..7ef3a890 100644 --- a/src/app/api/new/home/route.ts +++ b/src/app/api/new/home/route.ts @@ -43,7 +43,7 @@ export async function GET(request: Request) { where: { id: userLoginId, }, - select: { + include: { Profile: { select: { id: true, diff --git a/src/app/lib/global_state.ts b/src/app/lib/global_state.ts index d8792fc0..4efaf286 100644 --- a/src/app/lib/global_state.ts +++ b/src/app/lib/global_state.ts @@ -19,27 +19,30 @@ export type ITypeStatusNotifikasi = | "Menunggu" | "Gagal"; - /** * @param kategoriApp | "JOB", "VOTING", "EVENT", "DONASI", "INVESTASI", "COLLABORATION", "FORUM" * @type string */ export type IRealtimeData = { status?: ITypeStatusNotifikasi; - appId: string; + appId?: string; userId: string; - pesan: string; - title: string; - kategoriApp: + pesan?: string; + title?: string; + kategoriApp?: | "JOB" | "VOTING" | "EVENT" | "DONASI" | "INVESTASI" | "COLLABORATION" - | "FORUM"; + | "FORUM" + | "ACCESS"; // Untuk trigger akses user }; +// Access User +export const gs_access_user = atom(false); + export const gs_realtimeData = atom(null); export const gs_admin_ntf = atom(0); export const gs_user_ntf = atom(0); @@ -63,4 +66,4 @@ export const gs_donasiTriggerBeranda = atom(false); // investasi export const gs_adminInvestasi_triggerReview = atom(false); -export const gs_investasiTriggerBeranda = atom(false); \ No newline at end of file +export const gs_investasiTriggerBeranda = atom(false); diff --git a/src/app/lib/realtime_provider.tsx b/src/app/lib/realtime_provider.tsx index 6ae944d7..d85d0186 100644 --- a/src/app/lib/realtime_provider.tsx +++ b/src/app/lib/realtime_provider.tsx @@ -4,6 +4,7 @@ import { useShallowEffect } from "@mantine/hooks"; import { useAtom } from "jotai"; import { WibuRealtime } from "wibu-pkg"; import { + gs_access_user, gs_admin_ntf, gs_adminDonasi_triggerReview, gs_adminEvent_triggerReview, @@ -31,6 +32,9 @@ export type TypeNotification = { userId?: string; }; +// Tambahkan flag global untuk mencegah inisialisasi ulang +let isWibuRealtimeInitialized = false; + export default function RealtimeProvider({ userId, WIBU_REALTIME_TOKEN, @@ -42,6 +46,9 @@ export default function RealtimeProvider({ const [newAdminNtf, setNewAdminNtf] = useAtom(gs_admin_ntf); const [newUserNtf, setNewUserNtf] = useAtom(gs_user_ntf); + // ACCESS USER + const [isAccessUser, setIsAccessUser] = useAtom(gs_access_user); + // JOB const [isTriggerJobBeranda, setIsTriggerJobBeranda] = useAtom(gs_jobTiggerBeranda); @@ -83,152 +90,168 @@ export default function RealtimeProvider({ useShallowEffect(() => { try { - WibuRealtime.init({ - project: "hipmi", - WIBU_REALTIME_TOKEN: WIBU_REALTIME_TOKEN, - onData(data: TypeNotification) { - if ( - data.type == "notification" && - data.pushNotificationTo == "ADMIN" - ) { - setNewAdminNtf((e) => e + 1); - } + if (!isWibuRealtimeInitialized) { + WibuRealtime.init({ + project: "hipmi", + WIBU_REALTIME_TOKEN: WIBU_REALTIME_TOKEN, + onData(data: TypeNotification) { + // Notifikasi ke admin + if ( + data.type == "notification" && + data.pushNotificationTo == "ADMIN" + ) { + setNewAdminNtf((e) => e + 1); + } - // Notifikasi ke semua user , yang datanya di acc admin - if ( - data.type == "notification" && - data.pushNotificationTo == "USER" && - data.dataMessage?.userId == userId - ) { - setNewUserNtf((e) => e + 1); - setDataRealtime(data.dataMessage as any); - } + // trigger access + if ( + data.type == "trigger" && + data.pushNotificationTo == "USER" && + data.dataMessage?.kategoriApp == "ACCESS" && + data.dataMessage?.userId == userId + ) { + setIsAccessUser(data.dataMessage.status as any); + } - // ---------------------- JOB ------------------------- // - if ( - data.type == "trigger" && - data.pushNotificationTo == "ADMIN" && - data.dataMessage?.kategoriApp == "JOB" - ) { - setIsAdminJob_TriggerReview(true); - } + // Notifikasi ke semua user , yang datanya di acc admin + if ( + data.type == "notification" && + data.pushNotificationTo == "USER" && + data.dataMessage?.userId == userId + ) { + setNewUserNtf((e) => e + 1); + setDataRealtime(data.dataMessage as any); + } - if ( - data.type == "trigger" && - data.pushNotificationTo == "USER" && - data.dataMessage?.kategoriApp == "JOB" && - data.dataMessage.status == "Publish" - ) { - setIsTriggerJobBeranda(true); - } - // ---------------------- JOB ------------------------- // + // ---------------------- JOB ------------------------- // + if ( + data.type == "trigger" && + data.pushNotificationTo == "ADMIN" && + data.dataMessage?.kategoriApp == "JOB" + ) { + setIsAdminJob_TriggerReview(true); + } - // ---------------------- EVENT ------------------------- // - if ( - data.type == "trigger" && - data.pushNotificationTo == "ADMIN" && - data.dataMessage?.kategoriApp == "EVENT" - ) { - setIsAdminEvent_TriggerReview(true); - } + if ( + data.type == "trigger" && + data.pushNotificationTo == "USER" && + data.dataMessage?.kategoriApp == "JOB" && + data.dataMessage.status == "Publish" + ) { + setIsTriggerJobBeranda(true); + } + // ---------------------- JOB ------------------------- // - if ( - data.type == "trigger" && - data.pushNotificationTo == "USER" && - data.dataMessage?.kategoriApp == "EVENT" && - data.dataMessage.status == "Publish" - ) { - setIsTriggerEventBeranda(true); - } + // ---------------------- EVENT ------------------------- // + if ( + data.type == "trigger" && + data.pushNotificationTo == "ADMIN" && + data.dataMessage?.kategoriApp == "EVENT" + ) { + setIsAdminEvent_TriggerReview(true); + } - if ( - data.type == "notification" && - data.pushNotificationTo == "USER" && - data.dataMessage?.status == "Peserta Event" && - userId !== data.dataMessage?.userId - ) { - setNewUserNtf((e) => e + 1); - } - // ---------------------- EVENT ------------------------- // + if ( + data.type == "trigger" && + data.pushNotificationTo == "USER" && + data.dataMessage?.kategoriApp == "EVENT" && + data.dataMessage.status == "Publish" + ) { + setIsTriggerEventBeranda(true); + } - // ---------------------- VOTING ------------------------- // - if ( - data.type == "trigger" && - data.pushNotificationTo == "ADMIN" && - data.dataMessage?.kategoriApp == "VOTING" - ) { - setIsAdminVoting_TriggerReview(true); - } + if ( + data.type == "notification" && + data.pushNotificationTo == "USER" && + data.dataMessage?.status == "Peserta Event" && + userId !== data.dataMessage?.userId + ) { + setNewUserNtf((e) => e + 1); + } + // ---------------------- EVENT ------------------------- // - if ( - data.type == "trigger" && - data.pushNotificationTo == "USER" && - data.dataMessage?.kategoriApp == "VOTING" && - data.dataMessage.status == "Publish" - ) { - setIsTriggerVotingBeranda(true); - } + // ---------------------- VOTING ------------------------- // + if ( + data.type == "trigger" && + data.pushNotificationTo == "ADMIN" && + data.dataMessage?.kategoriApp == "VOTING" + ) { + setIsAdminVoting_TriggerReview(true); + } - if ( - data.type == "notification" && - data.pushNotificationTo == "USER" && - data.dataMessage?.status == "Voting Masuk" && - userId !== data.dataMessage?.userId - ) { - setNewUserNtf((e) => e + 1); - } - // ---------------------- VOTING ------------------------- // + if ( + data.type == "trigger" && + data.pushNotificationTo == "USER" && + data.dataMessage?.kategoriApp == "VOTING" && + data.dataMessage.status == "Publish" + ) { + setIsTriggerVotingBeranda(true); + } - // ---------------------- DONASI ------------------------- // - if ( - data.type == "trigger" && - data.pushNotificationTo == "ADMIN" && - data.dataMessage?.kategoriApp == "DONASI" - ) { - setIsAdminDonasi_TriggerReview(true); - } + if ( + data.type == "notification" && + data.pushNotificationTo == "USER" && + data.dataMessage?.status == "Voting Masuk" && + userId !== data.dataMessage?.userId + ) { + setNewUserNtf((e) => e + 1); + } + // ---------------------- VOTING ------------------------- // - if ( - data.type == "trigger" && - data.pushNotificationTo == "USER" && - data.dataMessage?.kategoriApp == "DONASI" && - data.dataMessage.status == "Publish" - ) { - setIsTriggerDonasiBeranda(true); - } + // ---------------------- DONASI ------------------------- // + if ( + data.type == "trigger" && + data.pushNotificationTo == "ADMIN" && + data.dataMessage?.kategoriApp == "DONASI" + ) { + setIsAdminDonasi_TriggerReview(true); + } - // if ( - // data.type == "notification" && - // data.pushNotificationTo == "ADMIN" && - // data.dataMessage?.status == "Menunggu" && - // userId !== data.dataMessage?.userId - // ) { + if ( + data.type == "trigger" && + data.pushNotificationTo == "USER" && + data.dataMessage?.kategoriApp == "DONASI" && + data.dataMessage.status == "Publish" + ) { + setIsTriggerDonasiBeranda(true); + } - // } - // ---------------------- DONASI ------------------------- // + // if ( + // data.type == "notification" && + // data.pushNotificationTo == "ADMIN" && + // data.dataMessage?.status == "Menunggu" && + // userId !== data.dataMessage?.userId + // ) { - // ---------------------- INVESTASI ------------------------- // + // } + // ---------------------- DONASI ------------------------- // - if ( - data.type == "trigger" && - data.pushNotificationTo == "ADMIN" && - data.dataMessage?.kategoriApp == "INVESTASI" - ) { - setIsAdminInvestasi_TriggerReview(true); - } + // ---------------------- INVESTASI ------------------------- // - if ( - data.type == "trigger" && - data.pushNotificationTo == "USER" && - data.dataMessage?.kategoriApp == "INVESTASI" && - data.dataMessage.status == "Publish" - ) { - setIsTriggerInvestasiBeranda(true); - } + if ( + data.type == "trigger" && + data.pushNotificationTo == "ADMIN" && + data.dataMessage?.kategoriApp == "INVESTASI" + ) { + setIsAdminInvestasi_TriggerReview(true); + } - // ---------------------- INVESTASI ------------------------- // - }, - }); + if ( + data.type == "trigger" && + data.pushNotificationTo == "USER" && + data.dataMessage?.kategoriApp == "INVESTASI" && + data.dataMessage.status == "Publish" + ) { + setIsTriggerInvestasiBeranda(true); + } + + // ---------------------- INVESTASI ------------------------- // + }, + }); + + // Tandai bahwa WibuRealtime telah diinisialisasi + isWibuRealtimeInitialized = true; + } } catch (error) { console.log("Error Realtime:", error); } diff --git a/src/app/zCoba/upload/fun_upload.ts b/src/app/zCoba/upload/fun_upload.ts new file mode 100644 index 00000000..baa3e4e2 --- /dev/null +++ b/src/app/zCoba/upload/fun_upload.ts @@ -0,0 +1,52 @@ +"use server"; + +import _ from "lodash"; +// import { v4 } from "uuid"; +import fs from "fs"; +import sharp from "sharp"; + +export default async function fun_upload({ + file, + dirId, +}: { + file: File; + dirId: string; +}) { + // const file: any = formData.get("file"); + // const fName = file.name; + // const fileSize = file.size; + + // // Convert ke KB + // const fileSizeInKB = fileSize / 1024; + + // // Convert ke MB + // const fileSizeInMB = fileSize / (1024 * 1024); + + // console.log(`Ukuran file dalam bytes: ${fileSize}`); + // console.log(`Ukuran file dalam KB: ${fileSizeInKB.toFixed(2)} KB`); + // console.log(`Ukuran file dalam MB: ${fileSizeInMB.toFixed(2)} MB`); + + const imageBuffer = await file.arrayBuffer(); + const resize = await sharp(imageBuffer).resize(2000).toBuffer(); + + const newFile = Buffer.from(resize); + console.log("file new",newFile); + // fs.writeFileSync(`./public/upload/${fName}`, upFolder as any); + + const formData = new FormData(); + formData.append("file", file); + formData.append("dirId", dirId); + + // const upload = await fetch("/api/image/upload", { + // method: "POST", + // body: formData, + // }); + + // const res = await upload.json(); + + // if (upload.ok) { + // return { success: true, data: res.data, message: res.message }; + // } else { + // return { success: false, data: {}, message: res.message }; + // } +} diff --git a/src/app/zCoba/upload/page.tsx b/src/app/zCoba/upload/page.tsx new file mode 100644 index 00000000..26b6bfdc --- /dev/null +++ b/src/app/zCoba/upload/page.tsx @@ -0,0 +1,137 @@ +"use client"; + +import { MainColor } from "@/app_modules/_global/color"; +import { ComponentGlobal_BoxUploadImage } from "@/app_modules/_global/component"; +import { MAX_SIZE } from "@/app_modules/_global/lib"; +import { PemberitahuanMaksimalFile } from "@/app_modules/_global/lib/max_size"; +import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/_global/notif_global"; +import { + UIGlobal_LayoutHeaderTamplate, + UIGlobal_LayoutTamplate, +} from "@/app_modules/_global/ui"; +import { clientLogger } from "@/util/clientLogger"; +import { + AspectRatio, + Button, + Center, + FileButton, + Image, + Stack, +} from "@mantine/core"; +import { IconImageInPicture, IconUpload } from "@tabler/icons-react"; +import { useState } from "react"; +import fun_upload from "./fun_upload"; +import { funGlobal_UploadToStorage } from "@/app_modules/_global/fun"; + +export default function Page() { + return ( + <> + } + > + + + + ); +} + +function Upload() { + const [file, setFile] = useState(null); + const [image, setImage] = useState(null); + const [isLoading, setLoading] = useState(false); + + async function onUpload() { + if (!file) return alert("File Kosong"); + try { + setLoading(true); + const formData = new FormData(); + formData.append("file", file as File); + + const uploadPhoto = await funGlobal_UploadToStorage({ + file: file, + dirId: "cm5ohsepe002bq4nlxeejhg7q", + }); + + if (uploadPhoto.success) { + setLoading(false); + alert("berhasil upload"); + console.log("uploadPhoto", uploadPhoto); + } else { + setLoading(false); + console.log("gagal upload", uploadPhoto); + } + } catch (error) { + console.error("Error upload img:", error); + } + } + + return ( + <> + + + {image ? ( + + Avatar + + ) : ( +
+ +
+ )} +
+ +
+ { + try { + const buffer = URL.createObjectURL( + new Blob([new Uint8Array(await files.arrayBuffer())]) + ); + + // if (files.size > MAX_SIZE) { + // ComponentGlobal_NotifikasiPeringatan( + // PemberitahuanMaksimalFile + // ); + // return; + // } else { + + // } + + console.log("ini buffer", buffer); + + setFile(files); + setImage(buffer); + } catch (error) { + clientLogger.error("Upload error:", error); + } + }} + accept="image/png,image/jpeg" + > + {(props) => ( + + )} + +
+ + +
+ + ); +} diff --git a/src/app_modules/admin/developer/index.tsx b/src/app_modules/admin/developer/index.tsx index a04161b1..481e636f 100644 --- a/src/app_modules/admin/developer/index.tsx +++ b/src/app_modules/admin/developer/index.tsx @@ -256,6 +256,10 @@ function NewTableAdmin({ search: isSearch, page: isChoosePage, }); + + + + setDataAdmin(loadData.data); setNPage(loadData.nPage); const loadDataUser = await adminDeveloper_funGetListAllUser({ page: 1 }); diff --git a/src/app_modules/admin/user-access/fun/edit/fun_edit_access.ts b/src/app_modules/admin/user-access/fun/edit/fun_edit_access.ts index a8a9dc15..46e4703d 100644 --- a/src/app_modules/admin/user-access/fun/edit/fun_edit_access.ts +++ b/src/app_modules/admin/user-access/fun/edit/fun_edit_access.ts @@ -1,11 +1,14 @@ "use server"; import prisma from "@/app/lib/prisma"; +import backendLogger from "@/util/backendLogger"; import { revalidatePath } from "next/cache"; +import { headers } from "next/headers"; export default async function adminUserAccess_funEditAccess( userId: string, - value: boolean + value: boolean, + nomor?: string ) { const updt = await prisma.user.update({ where: { @@ -16,6 +19,31 @@ export default async function adminUserAccess_funEditAccess( }, }); + const headersList = headers(); + const host = headersList.get("host"); + const protocol = headersList.get("x-forwarded-proto") || "http"; + const path = headersList.get("x-invoke-path"); + const baseUrl = `${protocol}://${host}`; + // const fullUrl = `${protocol}://${host}${path}`; + + if (value === true) { + const message = `Hallo rekan HIPMI, Anda telah diberikan akses ke HIPMI Apps. Silakan mulai jelajahi fitur-fitur yang tersedia melalui link berikut: ${baseUrl}`; + const encodedMessage = encodeURIComponent(message); + + const res = await fetch( + `https://wa.wibudev.com/code?nom=${nomor}&text=${encodedMessage} + ` + ); + + if (!res.ok) { + backendLogger.error("Error send message", res); + } + + const result = await res.json(); + + backendLogger.info("Success send message", result); + } + if (!updt) return { status: 400, message: "Update gagal" }; revalidatePath("/dev/admin/user-access"); return { status: 200, message: "Update berhasil" }; diff --git a/src/app_modules/admin/user-access/view/index.tsx b/src/app_modules/admin/user-access/view/index.tsx index 6180b6b5..9a23c1e4 100644 --- a/src/app_modules/admin/user-access/view/index.tsx +++ b/src/app_modules/admin/user-access/view/index.tsx @@ -20,6 +20,9 @@ import { IconSearch } from "@tabler/icons-react"; import { useState } from "react"; import adminUserAccess_funEditAccess from "../fun/edit/fun_edit_access"; import adminUserAccess_getListUser from "../fun/get/get_list_all_user"; +import { WibuRealtime } from "wibu-pkg"; +import { gs_access_user, IRealtimeData } from "@/app/lib/global_state"; +import { useAtom } from "jotai"; export default function AdminUserAccess_View({ listUser }: { listUser: any }) { const [data, setData] = useState(listUser.data); @@ -30,11 +33,11 @@ export default function AdminUserAccess_View({ listUser }: { listUser: any }) { const [isLoadingDelete, setIsLoadingDelete] = useState(false); const [userId, setUserId] = useState(""); - async function onAccess(id: string) { + async function onAccess(id: string, nomor: string) { try { setUserId(id); setIsLoadingAccess(true); - await adminUserAccess_funEditAccess(id, true).then(async (res) => { + await adminUserAccess_funEditAccess(id, true, nomor).then(async (res) => { if (res.status === 200) { const value = await adminUserAccess_getListUser({ page: 1, @@ -42,6 +45,19 @@ export default function AdminUserAccess_View({ listUser }: { listUser: any }) { }); setData(value.data as any); setNPage(value.nPage); + + const dataNotifikasi: IRealtimeData = { + status: true as any, + userId: id, + kategoriApp: "ACCESS", + }; + + WibuRealtime.setData({ + type: "trigger", + pushNotificationTo: "USER", + dataMessage: dataNotifikasi, + }); + ComponentGlobal_NotifikasiBerhasil(res.message); } else { ComponentGlobal_NotifikasiGagal(res.message); @@ -118,7 +134,7 @@ export default function AdminUserAccess_View({ listUser }: { listUser: any }) { radius={"xl"} color="Green" onClick={() => { - onAccess(e.id); + onAccess(e.id, e.nomor); }} > Grand Access diff --git a/src/app_modules/auth/login/view.tsx b/src/app_modules/auth/login/view.tsx index 1e32fb9e..e6452f7d 100644 --- a/src/app_modules/auth/login/view.tsx +++ b/src/app_modules/auth/login/view.tsx @@ -69,7 +69,7 @@ export default function Login({ version }: { version: string }) { WELCOME TO - HIPMI APPS + HIPMI BADUNG APPS diff --git a/src/app_modules/auth/register/view.tsx b/src/app_modules/auth/register/view.tsx index 6d39af6c..37276b59 100644 --- a/src/app_modules/auth/register/view.tsx +++ b/src/app_modules/auth/register/view.tsx @@ -13,6 +13,7 @@ import { useRouter } from "next/navigation"; import { useState } from "react"; import { auth_funDeleteAktivasiKodeOtpByNomor } from "../fun/fun_edit_aktivasi_kode_otp_by_id"; import Register_SkeletonView from "./skeleton"; +import { clientLogger } from "@/util/clientLogger"; export default function Register() { const router = useRouter(); @@ -70,28 +71,31 @@ export default function Register() { await auth_funDeleteAktivasiKodeOtpByNomor({ nomor: data.nomor, }); - router.push("/dev/home", { scroll: false }); + + router.push("/waiting-room", { scroll: false }); return; } if (res.status === 400) { + setLoading(false); ComponentGlobal_NotifikasiPeringatan(result.message); return; } if (res.status === 405) { + setLoading(false); ComponentGlobal_NotifikasiPeringatan(result.message); return; } if (res.status === 500) { + setLoading(false); ComponentGlobal_NotifikasiPeringatan(result.message); return; } } catch (error) { - console.log(error); - } finally { setLoading(false); + clientLogger.error("Error registrasi", error); } } diff --git a/src/app_modules/auth/validasi/view.tsx b/src/app_modules/auth/validasi/view.tsx index dc20747a..65b603b9 100644 --- a/src/app_modules/auth/validasi/view.tsx +++ b/src/app_modules/auth/validasi/view.tsx @@ -87,9 +87,6 @@ export default function Validasi() { body: JSON.stringify({ nomor: data.nomor, }), - headers: { - "Content-Type": "application/json", - }, }); const result = await res.json(); @@ -100,6 +97,7 @@ export default function Validasi() { await auth_funDeleteAktivasiKodeOtpByNomor({ nomor: data.nomor, }); + router.push(RouterHome.main_home, { scroll: false }); return; } @@ -110,30 +108,33 @@ export default function Validasi() { await auth_funDeleteAktivasiKodeOtpByNomor({ nomor: data.nomor, }); + router.push(RouterAdminDashboard.splash_admin, { scroll: false }); return; } if (res.status === 404) { + setLoading(false); router.push("/register", { scroll: false }); ComponentGlobal_NotifikasiBerhasil(result.message); return; } if (res.status === 400) { + setLoading(false); ComponentGlobal_NotifikasiPeringatan(result.message); return; } if (res.status == 500) { + setLoading(false); ComponentGlobal_NotifikasiGagal(result.message); return; } } catch (error) { - clientLogger.error("Error validasi:", error); - } finally { setLoading(false); - } + clientLogger.error("Error validasi:", error); + } } async function onBack() { diff --git a/src/app_modules/home/component/body_home.tsx b/src/app_modules/home/component/body_home.tsx index ebd7a75a..9ecff402 100644 --- a/src/app_modules/home/component/body_home.tsx +++ b/src/app_modules/home/component/body_home.tsx @@ -26,8 +26,8 @@ import { clientLogger } from "@/util/clientLogger"; export default function BodyHome() { const router = useRouter(); - const [dataUser, setDataUser] = useState({}); - const [dataJob, setDataJob] = useState([]); + const [dataUser, setDataUser] = useState(null); + const [dataJob, setDataJob] = useState(null); const [loadingJob, setLoadingJob] = useState(true); const [loading, setLoading] = useState(true); @@ -46,10 +46,12 @@ export default function BodyHome() { setDataUser(response.data); } } catch (error) { - clientLogger.error("Error get data user", error); - } + clientLogger.error("Error get data profile", error); + } } + + async function getHomeJob() { try { setLoadingJob(true); @@ -70,19 +72,6 @@ export default function BodyHome() { return ( - {/* - - */} - { - if ( - dataUser.profile == undefined || - dataUser?.profile == null || - dataJob.length == undefined || - dataJob.length == null - ) { + if (dataUser == null) { return null; } else if ( - dataUser.profile == undefined || - dataUser?.profile == null + Object.keys(dataUser).length == 0 || + dataJob?.length == null ) { router.push(RouterProfile.create, { scroll: false }); } else { @@ -163,16 +147,11 @@ export default function BodyHome() { > { - if ( - dataUser.profile == undefined || - dataUser?.profile == null || - dataJob.length == undefined || - dataJob.length == null - ) { + if (dataUser == null) { return null; } else if ( - dataUser.profile == undefined || - dataUser?.profile == null + Object.keys(dataUser).length == 0 || + dataJob?.length == null ) { router.push(RouterProfile.create, { scroll: false }); } else { @@ -229,7 +208,7 @@ export default function BodyHome() { ) : ( - {dataJob.map((e, i) => ( + {dataJob?.map((e, i) => ( diff --git a/src/app_modules/home/component/footer_home.tsx b/src/app_modules/home/component/footer_home.tsx index 696acbd4..87a6a4f2 100644 --- a/src/app_modules/home/component/footer_home.tsx +++ b/src/app_modules/home/component/footer_home.tsx @@ -51,7 +51,7 @@ export default function FooterHome() { bottom={0} h={"9vh"} > - {dataUser?.profile === undefined || dataUser?.profile === null ? ( + {dataUser == null ? ( {Array.from(new Array(4)).map((_, i) => (
@@ -69,15 +69,9 @@ export default function FooterHome() { align="center" spacing={0} onClick={() => { - if ( - dataUser.profile === undefined || - dataUser?.profile === null - ) { + if (dataUser == null) { return null; - } else if ( - dataUser.profile === undefined || - dataUser?.profile === null - ) { + } else if (Object.keys(dataUser).length === 0) { router.push(RouterProfile.create, { scroll: false }); } else { if (e.link == "") { diff --git a/src/app_modules/home/state/global_state.ts b/src/app_modules/home/component/global_state.ts similarity index 79% rename from src/app_modules/home/state/global_state.ts rename to src/app_modules/home/component/global_state.ts index 638d7246..5b97c4ef 100644 --- a/src/app_modules/home/state/global_state.ts +++ b/src/app_modules/home/component/global_state.ts @@ -1,3 +1,4 @@ import { atomWithStorage } from "jotai/utils"; +import { atom } from "jotai"; export const gs_token = atomWithStorage("gs_token", null); diff --git a/src/app_modules/home/view_home_new.tsx b/src/app_modules/home/view_home_new.tsx index c632663a..7673e2f2 100644 --- a/src/app_modules/home/view_home_new.tsx +++ b/src/app_modules/home/view_home_new.tsx @@ -68,7 +68,7 @@ export default function HomeViewNew() { ) : ( ) : ( (null); + const [isAccess, setIsAccess] = useState(null); + const [isAccessUser, setIsAccessUser] = useAtom(gs_access_user); + + useShallowEffect(() => { + if (isAccessUser) { + setIsAccess(true); + setIsAccessUser(false); + } + }, [isAccessUser]); useShallowEffect(() => { onLoadData(); @@ -41,7 +55,7 @@ export default function WaitingRoom_View({ try { const respone = await apiGetACtivationUser(); if (respone) { - setData(respone.data); + setIsAccess(respone.data); } } catch (error) { clientLogger.error("Error get cookies user", error); @@ -53,11 +67,12 @@ export default function WaitingRoom_View({ - {_.isNull(data) ? ( - - {Array.from(new Array(4)).map((e, i) => ( - - ))} + {_.isNull(isAccess) ? ( + + + + + ) : ( @@ -71,16 +86,28 @@ export default function WaitingRoom_View({ Whatsapp setelah disetujui. - - {/* */} + {isAccess && ( + + )} )} diff --git a/src/middleware.ts b/src/middleware.ts index 24571420..817e8bde 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -5,6 +5,8 @@ import { apies, pages } from "./lib/routes"; type MiddlewareConfig = { apiPath: string; loginPath: string; + // validasiPath: string; + // registarasiPath: string; userPath: string; publicRoutes: string[]; encodedKey: string; @@ -16,6 +18,8 @@ type MiddlewareConfig = { const middlewareConfig: MiddlewareConfig = { apiPath: "/api", loginPath: "/login", + // validasiPath: "/validasi", + // registarasiPath: "/register", userPath: "/dev/home", publicRoutes: [ // API @@ -45,6 +49,7 @@ const middlewareConfig: MiddlewareConfig = { "/auth/login", "/auth/api/login", "/waiting-room", + "/zCoba/*", // ASSETS "/aset/global/main_background.png", @@ -61,6 +66,8 @@ export const middleware = async (req: NextRequest) => { apiPath, encodedKey, loginPath, + // validasiPath, + // registarasiPath, publicRoutes, sessionKey, validationApiRoute, @@ -75,7 +82,12 @@ export const middleware = async (req: NextRequest) => { } // Skip authentication for public routes - const isPublicRoute = [...publicRoutes, loginPath].some((route) => { + const isPublicRoute = [ + ...publicRoutes, + loginPath, + // validasiPath, + // registarasiPath, + ].some((route) => { const pattern = route.replace(/\*/g, ".*"); return new RegExp(`^${pattern}$`).test(pathname); }); @@ -88,7 +100,13 @@ export const middleware = async (req: NextRequest) => { } } - if (isPublicRoute && pathname !== loginPath) { + if ( + isPublicRoute && + pathname !== loginPath + // && + // pathname !== validasiPath && + // pathname !== registarasiPath + ) { return setCorsHeaders(NextResponse.next()); } @@ -96,6 +114,7 @@ export const middleware = async (req: NextRequest) => { req.cookies.get(sessionKey)?.value || req.headers.get("Authorization")?.split(" ")[1]; + // ==================== Authentication: Login, Validasi, Registrasi ==================== // // Token verification const user = await verifyToken({ token, encodedKey }); @@ -107,10 +126,27 @@ export const middleware = async (req: NextRequest) => { return setCorsHeaders(NextResponse.next()); } + // // Handle validation page access + // if (pathname === validasiPath) { + // if (user) { + // return setCorsHeaders(NextResponse.redirect(new URL(userPath, req.url))); + // } + // return setCorsHeaders(NextResponse.next()); + // } + + // // Handle register page access + // if (pathname === registarasiPath) { + // if (user) { + // return setCorsHeaders(NextResponse.redirect(new URL(userPath, req.url))); + // } + // return setCorsHeaders(NextResponse.next()); + // } + // Handle protected routes if (!user) { return setCorsHeaders(NextResponse.redirect(new URL(loginPath, req.url))); } + // ==================== Authentication: Login, Validasi, Registrasi ==================== // if (pathname.startsWith("/dev")) { const userValidate = await fetch(new URL("/api/user-validate", req.url), {