From 42c9b98c86626e652ed3e39c41baa5a2d1a15d54 Mon Sep 17 00:00:00 2001 From: nico Date: Mon, 17 Feb 2025 22:19:02 +0800 Subject: [PATCH] API Voting & Belum di Integrasikan ke UInya --- .../dashboard/[name]/route.ts | 0 .../dashboard/riwayat/route.ts | 0 src/app/api/admin/vote/status/[name]/route.ts | 155 ++++++++++++++++++ .../api/admin/voting/status/[name]/route.ts | 109 ------------ .../donasi/detail/publish/detail_publish.tsx | 80 ++++----- .../admin/vote/child/table_review/index.tsx | 2 +- .../admin/vote/lib/api_fetch_admin_voting.ts | 40 ++++- src/app_modules/admin/vote/main/index.tsx | 11 +- src/middleware.ts | 4 +- 9 files changed, 238 insertions(+), 163 deletions(-) rename src/app/api/admin/{voting => vote}/dashboard/[name]/route.ts (100%) rename src/app/api/admin/{voting => vote}/dashboard/riwayat/route.ts (100%) create mode 100644 src/app/api/admin/vote/status/[name]/route.ts delete mode 100644 src/app/api/admin/voting/status/[name]/route.ts diff --git a/src/app/api/admin/voting/dashboard/[name]/route.ts b/src/app/api/admin/vote/dashboard/[name]/route.ts similarity index 100% rename from src/app/api/admin/voting/dashboard/[name]/route.ts rename to src/app/api/admin/vote/dashboard/[name]/route.ts diff --git a/src/app/api/admin/voting/dashboard/riwayat/route.ts b/src/app/api/admin/vote/dashboard/riwayat/route.ts similarity index 100% rename from src/app/api/admin/voting/dashboard/riwayat/route.ts rename to src/app/api/admin/vote/dashboard/riwayat/route.ts diff --git a/src/app/api/admin/vote/status/[name]/route.ts b/src/app/api/admin/vote/status/[name]/route.ts new file mode 100644 index 00000000..19c4871b --- /dev/null +++ b/src/app/api/admin/vote/status/[name]/route.ts @@ -0,0 +1,155 @@ +import { prisma } from "@/lib"; +import backendLogger from "@/util/backendLogger"; +import _ from "lodash"; +import moment from "moment"; +import { NextResponse } from "next/server"; + +export async function GET(request: Request, + { params }: { params: { name: string } } +) { + + const { name } = params; + const { searchParams } = new URL(request.url); + const search = searchParams.get("search"); + const page = searchParams.get("page"); + const takeData = 10; + const skipData = Number(page) * takeData - takeData; + + try { + let fixData; + const fixStatus = _.startCase(name); + + if (!page) { + fixData = await prisma.voting.findMany({ + orderBy: { + createdAt: "desc", + }, + where: { + Voting_Status: { + name: fixStatus, + }, + isActive: true, + title: { + contains: search ? search : "", + mode: "insensitive", + }, + isArsip: false, + }, + include: { + Author: { + select: { + id: true, + username: true, + Profile: { + select: { + id: true, + name: true, + }, + }, + }, + }, + Voting_Kontributor: true, + Voting_DaftarNamaVote: true, + }, + }); + } else { + fixData = await prisma.voting.findMany({ + take: takeData, + skip: skipData, + orderBy: { + createdAt: "desc", + }, + where: { + Voting_Status: { + name: fixStatus, + }, + isActive: true, + title: { + contains: search ? search : "", + mode: "insensitive", + }, + isArsip: false, + }, + include: { + Author: { + select: { + id: true, + username: true, + Profile: { + select: { + id: true, + name: true, + }, + }, + }, + }, + Voting_Kontributor: true, + Voting_DaftarNamaVote: true, + }, + }); + + if (fixStatus === "Publish") { + const data = await prisma.voting.findMany({ + where: { + Voting_Status: { + name: fixStatus, + }, + isActive: true, + title: { + contains: search ? search : "", + mode: "insensitive", + }, + isArsip: false, + }, + }); + + for (let i of data) { + if (moment(i.akhirVote).diff(moment(), "minutes") < 0) { + await prisma.event.update({ + where: { + id: i.id, + }, + data: { + isArsip: true, + }, + }); + } + } + const nCount = await prisma.voting.count({ + where: { + Voting_Status: { + name: fixStatus, + }, + isActive: true, + title: { + contains: search ? search : "", + mode: "insensitive", + }, + }, + }); + + fixData = { + data: data, + count: _.ceil(nCount / takeData) + } + } + } + + 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 } + ) + } +} \ No newline at end of file diff --git a/src/app/api/admin/voting/status/[name]/route.ts b/src/app/api/admin/voting/status/[name]/route.ts deleted file mode 100644 index df431047..00000000 --- a/src/app/api/admin/voting/status/[name]/route.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { prisma } from "@/lib"; -import _ from "lodash"; -import moment from "moment"; -import { NextResponse } from "next/server"; - -export async function GET(request: Request, - { params }: { params: { name: string } } -) { - const method = request.method; - if (method !== "GET") { - return NextResponse.json({ - success: false, - message: "Method not allowed" - }, - { status: 405 } - ) - } - - const { name } = params; - const { searchParams } = new URL(request.url); - const search = searchParams.get("search"); - const page = searchParams.get("page"); - const takeData = 10; - const skipData = Number(page) * takeData - takeData; - - try { - let fixData; - const fixStatus = _.startCase(name); - - if (!page && !search) { - fixData = await prisma.voting.findMany({ - orderBy: { - updatedAt: "desc" - }, - where: { - isActive: true, - isArsip: false, - Voting_Status: { - name: fixStatus - } - }, - include: { - Author: { - select: { - id: true, - username: true, - Profile: { - select: { - name: true - } - } - } - }, - Voting_Status: true, - Voting_Kontributor: true, - Voting_DaftarNamaVote: true, - } - }) - } else if (!page && search) { - fixData = await prisma.voting.findMany({ - orderBy: { - updatedAt: "desc" - }, - where: { - isActive: true, - isArsip: false, - Voting_Status: { - name: fixStatus - }, - title: { - contains: search, - mode: "insensitive" - } - }, - include: { - Author: { - select: { - id: true, - username: true, - Profile: { - select: { - name: true - } - } - } - }, - Voting_Status: true, - Voting_Kontributor: true, - Voting_DaftarNamaVote: true, - } - }) - } else if (page && !search) { - if (fixStatus === "Publish") { - const getAllData = await prisma.voting.findMany({ - where: { - isActive: true, - Voting_Status: { - name: fixStatus - }, - isArsip: false - } - }); - - } - } - } catch (error) { - - } -} \ No newline at end of file diff --git a/src/app_modules/admin/donasi/detail/publish/detail_publish.tsx b/src/app_modules/admin/donasi/detail/publish/detail_publish.tsx index fa267c11..347826b3 100644 --- a/src/app_modules/admin/donasi/detail/publish/detail_publish.tsx +++ b/src/app_modules/admin/donasi/detail/publish/detail_publish.tsx @@ -120,25 +120,25 @@ function TampilanDetailDonasi({ { maxWidth: "36rem", cols: 1, spacing: "sm" }, ]} > - + - + <Title c={AdminColor.white} align="center" order={4}> Gambar Donasi - + - Detail Donasi + Detail Donasi - Judul + Judul - : + : - + <Title order={5} c={AdminColor.white}> {donasi?.title} @@ -146,11 +146,11 @@ function TampilanDetailDonasi({ - Penggalang Dana + Penggalang Dana - : + : - + <Title order={5} c={AdminColor.white}> {donasi?.Author.username} @@ -158,11 +158,11 @@ function TampilanDetailDonasi({ - Durasi + Durasi - : + : - + <Title c={AdminColor.white} order={5}> {donasi?.DonasiMaster_Durasi.name} hari @@ -170,24 +170,24 @@ function TampilanDetailDonasi({ - Dana dibutuhkan + Dana dibutuhkan - : + : - Kategori + Kategori - : + : - + <Title c={AdminColor.white} order={5}> {donasi?.DonasiMaster_Ketegori?.name} @@ -195,11 +195,11 @@ function TampilanDetailDonasi({ - Total donatur + Total donatur - : + : - + <Title order={5} c={AdminColor.white}> {countDonatur} @@ -207,11 +207,11 @@ function TampilanDetailDonasi({ - Progres + Progres - : + : - + <Title order={5} c={AdminColor.white}> {toNumber(donasi.progres).toFixed(2)} % @@ -219,13 +219,13 @@ function TampilanDetailDonasi({ - Dana terkumpul + Dana terkumpul - : + : @@ -233,25 +233,25 @@ function TampilanDetailDonasi({ {/* Pencairan Dana */} - +
- Pencairan Dana + Pencairan Dana
- Total Dana Dicairkan + Total Dana Dicairkan - Bank Tujuan - + <Text c={AdminColor.white} fz={"xs"}>Bank Tujuan</Text> + <Title order={6} c={AdminColor.white}> {donasi?.namaBank} @@ -260,16 +260,16 @@ function TampilanDetailDonasi({ - Akumulasi Pencairan - + <Text c={AdminColor.white} fz={"xs"}>Akumulasi Pencairan</Text> + <Title order={6} c={AdminColor.white}> {donasi?.akumulasiPencairan} Kali - Nomor Rekening - + <Text fz={"xs"} c={AdminColor.white}>Nomor Rekening</Text> + <Title order={6} c={AdminColor.white}> {donasi?.rekening} @@ -277,13 +277,13 @@ function TampilanDetailDonasi({ - Sisa Dana + Sisa Dana diff --git a/src/app_modules/admin/vote/child/table_review/index.tsx b/src/app_modules/admin/vote/child/table_review/index.tsx index c998d289..b07a2133 100644 --- a/src/app_modules/admin/vote/child/table_review/index.tsx +++ b/src/app_modules/admin/vote/child/table_review/index.tsx @@ -129,7 +129,7 @@ function TableStatus({ listData }: { listData: any }) {
{e.title}
-
+
{ const { token } = await fetch("/api/get-cookie").then((res) => res.json()); if (!token) return await token.json().catch(() => null); - const response = await fetch(`/api/admin/voting/dashboard/${name}`, { + const response = await fetch(`/api/admin/vote/dashboard/${name}`, { method: "GET", headers: { "Content-Type": "application/json", @@ -19,11 +20,11 @@ const apiGetVoteStatusCountDashboard = async ({ name }: { }); return await response.json().catch(() => null); } -const apiGetVoteRiwayatCount = async () => { +const apiGetAdminVoteRiwayatCount = 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/admin/voting/dashboard/riwayat`, { + const response = await fetch(`/api/admin/vote/dashboard/riwayat`, { method: "GET", headers: { "Content-Type": "application/json", @@ -33,4 +34,31 @@ const apiGetVoteRiwayatCount = async () => { } }); return await response.json().catch(() => null); +} + +const apiGetAdminVotingByStatus = async ({ + name, + page, + search }: { + name: "Publish" | "Review" | "Reject"; + page: string; + search: string; + }) => { + const { token } = await fetch("/api/get-cookie").then((res) => res.json()); + if (!token) return await token.json().catch(() => null); + + const isPage = page ? `?page=${page}` : ""; + const isSearch = search ? `&search=${search}` : ""; + const response = await fetch( + `/api/admin/vote/status/${name}${isPage}${isSearch}`, + { + 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/admin/vote/main/index.tsx b/src/app_modules/admin/vote/main/index.tsx index 68c9a3a9..269517b4 100644 --- a/src/app_modules/admin/vote/main/index.tsx +++ b/src/app_modules/admin/vote/main/index.tsx @@ -7,10 +7,11 @@ import { IconAlertTriangle, IconBookmark, IconHistory, IconUpload } from "@table import { AccentColor, AdminColor } from "@/app_modules/_global/color/color_pallet"; import { useState } from "react"; import { clientLogger } from "@/util/clientLogger"; -import { apiGetVoteRiwayatCount, apiGetVoteStatusCountDashboard } from "../lib/api_fetch_admin_voting"; + import global_limit from "@/lib/limit"; import { useShallowEffect } from "@mantine/hooks"; import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; +import { apiGetAdminVoteRiwayatCount, apiGetAdminVoteStatusCountDashboard } from "../lib/api_fetch_admin_voting"; export default function AdminVote_Main() { const [countPublish, setCountPublish] = useState(null); @@ -36,7 +37,7 @@ export default function AdminVote_Main() { } async function onLoadCountPublish() { try { - const response = await apiGetVoteStatusCountDashboard({ + const response = await apiGetAdminVoteStatusCountDashboard({ name: "Publish", }) if (response) { @@ -48,7 +49,7 @@ export default function AdminVote_Main() { } async function onLoadCountReview() { try { - const response = await apiGetVoteStatusCountDashboard({ + const response = await apiGetAdminVoteStatusCountDashboard({ name: "Review", }) @@ -61,7 +62,7 @@ export default function AdminVote_Main() { } async function onLoadCountReject() { try { - const response = await apiGetVoteStatusCountDashboard({ + const response = await apiGetAdminVoteStatusCountDashboard({ name: "Reject", }) if (response) { @@ -73,7 +74,7 @@ export default function AdminVote_Main() { } async function onLoadCountRiwayat() { try { - const response = await apiGetVoteRiwayatCount() + const response = await apiGetAdminVoteRiwayatCount() if (response) { setCountRiwayat(response.data); } diff --git a/src/middleware.ts b/src/middleware.ts index 841018e0..97c69c95 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -34,8 +34,8 @@ const middlewareConfig: MiddlewareConfig = { // ADMIN API // >> buat dibawah sini << - "api/admin/job/*", - + "/api/admin/vote/*", + // Akses awal "/api/get-cookie",