From 6b493b755495aa647a6dde712f51fb1c4a72fe61 Mon Sep 17 00:00:00 2001 From: nico Date: Mon, 10 Feb 2025 12:17:49 +0800 Subject: [PATCH] Tambahan Hari Ini --- src/app/api/admin/forum/komentar/route.ts | 116 +++++++ src/app/api/admin/forum/posting/route.ts | 150 +++++++++ src/app/api/admin/forum/publish/route.ts | 38 ++- .../admin/voting/dashboard/riwayat/route.ts | 2 +- .../admin/forum/lib/api_fetch_admin_forum.ts | 55 +++- .../admin/forum/main/dashboard.tsx | 6 +- .../admin/forum/sub_menu/table_posting.tsx | 301 ++++++++++-------- src/middleware.ts | 3 +- 8 files changed, 532 insertions(+), 139 deletions(-) create mode 100644 src/app/api/admin/forum/komentar/route.ts create mode 100644 src/app/api/admin/forum/posting/route.ts diff --git a/src/app/api/admin/forum/komentar/route.ts b/src/app/api/admin/forum/komentar/route.ts new file mode 100644 index 00000000..4fac2a60 --- /dev/null +++ b/src/app/api/admin/forum/komentar/route.ts @@ -0,0 +1,116 @@ +import { count } from 'console'; +import { prisma } from "@/app/lib"; +import backendLogger from "@/util/backendLogger"; +import { NextResponse } from "next/server"; +import _ from 'lodash'; + +export async function GET(request: Request, { komentarId }: { komentarId: string }) { + const method = request.method; + if (method !== "GET") { + return NextResponse.json({ + success: false, + message: "Method not allowed" + }, + { status: 405 } + ); + } + + 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; + + console.log("Ini page", page) + + try { + let fixData; + + + + if (!page) { + fixData = await prisma.forum_ReportKomentar.findMany({ + + orderBy: { + createdAt: "desc" + }, + where: { + forum_KomentarId: komentarId, + }, + select: { + id: true, + isActive: true, + createdAt: true, + deskripsi: true, + ForumMaster_KategoriReport: true, + User: { + select: { + Profile: { + select: { + id: true, + name: true, + }, + }, + }, + }, + }, + }) + } else { + const data = await prisma.forum_ReportKomentar.findMany({ + take: takeData, + skip: skipData, + orderBy: { + createdAt: "desc", + }, + where: { + forum_KomentarId: komentarId, + }, + select: { + id: true, + isActive: true, + createdAt: true, + deskripsi: true, + ForumMaster_KategoriReport: true, + User: { + select: { + Profile: { + select: { + id: true, + name: true, + }, + }, + }, + }, + }, + }) + const nCount = await prisma.forum_ReportKomentar.count({ + where: { + forum_KomentarId: komentarId, + } + }) + + fixData = { + data: data, + nCount: _.ceil(nCount / takeData) + } + } + console.log("Ini fixData", fixData) + return NextResponse.json({ + success: true, + message: "Success get data forum komentar", + data: fixData, + }, + { status: 200 } + ) + } catch (error) { + backendLogger.error("Error get data forum komentar", error); + return NextResponse.json({ + success: false, + message: "Error get data forum komentar", + reason: (error as Error).message + }, + ) + } finally { + await prisma.$disconnect(); + } +} \ No newline at end of file diff --git a/src/app/api/admin/forum/posting/route.ts b/src/app/api/admin/forum/posting/route.ts new file mode 100644 index 00000000..b2a21dba --- /dev/null +++ b/src/app/api/admin/forum/posting/route.ts @@ -0,0 +1,150 @@ +import { prisma } from "@/app/lib"; +import backendLogger from "@/util/backendLogger"; +import _ from "lodash"; +import { NextResponse } from "next/server"; + +export async function GET(request: Request, + { postingId }: { postingId: string }) { + const method = request.method; + if (method !== "GET") { + return NextResponse.json({ + success: false, + message: "Method not allowed", + }, + { status: 405 } + ) + } + + + 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; + + if (!page) { + fixData = await prisma.forum_ReportPosting.findMany({ + + orderBy: { + createdAt: "desc", + }, + where: { + forum_PostingId: postingId, + }, + select: { + id: true, + deskripsi: true, + createdAt: true, + User: { + select: { + id: true, + username: true, + Profile: { + select: { + name: true, + }, + }, + }, + }, + ForumMaster_KategoriReport: { + select: { + id: true, + title: true, + deskripsi: true, + }, + }, + }, + }); + } else { + const data = await prisma.forum_ReportPosting.findMany({ + take: takeData, + skip: skipData, + orderBy: { + createdAt: "desc", + }, + where: { + Forum_Posting: { + isActive: true, + diskusi: { + contains: search ? search : '', + mode: "insensitive" + } + }, + + }, + select: { + id: true, + isActive: true, + createdAt: true, + deskripsi: true, + forumMaster_KategoriReportId: true, + ForumMaster_KategoriReport: { + select: { + id: true, + title: true, + deskripsi: true, + }, + }, + + forum_PostingId: true, + Forum_Posting: { + select: { + id: true, + diskusi: true, + ForumMaster_StatusPosting: { + select: { + id: true, + status: true, + } + }, + Author: { + select: { + id: true, + username: true + } + } + }, + }, + userId: true, + User: { + select: { + id: true, + username: true, + }, + }, + }, + }); + const nCount = await prisma.forum_ReportPosting.count({ + where: { + isActive: true, + } + }) + + + fixData = { + data: data, + nCount: _.ceil(nCount / takeData) + } + } + return NextResponse.json({ + success: true, + data: fixData, + message: "Success get data forum posting" + }, + { status: 200 } + ) + } catch (error) { + backendLogger.error("Error get data forum posting >>", error); + return NextResponse.json({ + success: false, + message: "Error get data forum posting", + }, + { status: 500 } + ) + } finally { + await prisma.$disconnect(); + } +} \ No newline at end of file diff --git a/src/app/api/admin/forum/publish/route.ts b/src/app/api/admin/forum/publish/route.ts index d1f19d8e..7a848e61 100644 --- a/src/app/api/admin/forum/publish/route.ts +++ b/src/app/api/admin/forum/publish/route.ts @@ -24,6 +24,41 @@ export async function GET(request: Request) { let fixData; if (!page) { + fixData = await prisma.forum_Posting.findMany({ + + orderBy: { + createdAt: "desc", + }, + where: { + isActive: true, + diskusi: { + contains: search ? search : "", + mode: "insensitive", + }, + }, + select: { + id: true, + diskusi: true, + isActive: true, + createdAt: true, + Author: { + select: { + id: true, + username: true, + Profile: true, + }, + }, + Forum_ReportPosting: true, + Forum_Komentar: { + where: { + isActive: true, + }, + }, + ForumMaster_StatusPosting: true, + }, + }); + + } else { const data = await prisma.forum_Posting.findMany({ take: takeData, skip: skipData, @@ -73,7 +108,6 @@ export async function GET(request: Request) { data: data, nCount: _.ceil(nCount / takeData) } - } return NextResponse.json({ success: true, @@ -91,5 +125,7 @@ export async function GET(request: Request) { }, { status: 500 } ) + } finally { + await prisma.$disconnect() } } \ No newline at end of file diff --git a/src/app/api/admin/voting/dashboard/riwayat/route.ts b/src/app/api/admin/voting/dashboard/riwayat/route.ts index 3857af0e..c0411274 100644 --- a/src/app/api/admin/voting/dashboard/riwayat/route.ts +++ b/src/app/api/admin/voting/dashboard/riwayat/route.ts @@ -31,7 +31,7 @@ export async function GET(request: Request) { ) } catch (error) { backendLogger.error('Error get data voting dashboard >>', error); - NextResponse.json({ + return NextResponse.json({ success: false, message: 'Error get data voting dashboard', reason: (error as Error).message diff --git a/src/app_modules/admin/forum/lib/api_fetch_admin_forum.ts b/src/app_modules/admin/forum/lib/api_fetch_admin_forum.ts index 18d7741f..9c6fef07 100644 --- a/src/app_modules/admin/forum/lib/api_fetch_admin_forum.ts +++ b/src/app_modules/admin/forum/lib/api_fetch_admin_forum.ts @@ -1,7 +1,10 @@ export { apiGetAdminForumPublishCountDasboard, + apiGetAdminCountForumReportPosting , + apiGetAdminCountForumReportKomentar, apiGetAdminForumReportPosting, - apiGetAdminForumReportKomentar + apiGetAdminForumReportKomentar, + apiGetAdminForumPublish } const apiGetAdminForumPublishCountDasboard = async () => { @@ -21,7 +24,7 @@ const apiGetAdminForumPublishCountDasboard = async () => { return await response.json().catch(() => null); } -const apiGetAdminForumReportPosting = async () => { +const apiGetAdminCountForumReportPosting = async () => { const { token } = await fetch("/api/get-cookie").then((res) => res.json()); if (!token) return await token.json().catch(() => null); @@ -38,6 +41,38 @@ const apiGetAdminForumReportPosting = async () => { return await response.json().catch(() => null); } +const apiGetAdminCountForumReportKomentar = 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/forum/dashboard/report_komentar`, { + method: "GET", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + "Access-Control-Allow-Origin": "*", + Authorization: `Bearer ${token}`, + }, + }) + + return await response.json().catch(() => null); +} +const apiGetAdminForumReportPosting = 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/forum/dashboard/report_posting`, { + method: "GET", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + "Access-Control-Allow-Origin": "*", + Authorization: `Bearer ${token}`, + }, + }) + + return await response.json().catch(() => null); +} const apiGetAdminForumReportKomentar = async () => { const { token } = await fetch("/api/get-cookie").then((res) => res.json()); if (!token) return await token.json().catch(() => null); @@ -52,5 +87,21 @@ const apiGetAdminForumReportKomentar = async () => { }, }) + return await response.json().catch(() => null); +} +const apiGetAdminForumPublish = 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/forum/dashboard/publish`, { + method: "GET", + 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/forum/main/dashboard.tsx b/src/app_modules/admin/forum/main/dashboard.tsx index 433fa323..92f99431 100644 --- a/src/app_modules/admin/forum/main/dashboard.tsx +++ b/src/app_modules/admin/forum/main/dashboard.tsx @@ -8,7 +8,7 @@ import { AdminColor } from "@/app_modules/_global/color/color_pallet"; import { useShallowEffect } from "@mantine/hooks"; import { clientLogger } from "@/util/clientLogger"; import global_limit from "@/app/lib/limit"; -import { apiGetAdminForumPublishCountDasboard } from "../lib/api_fetch_admin_forum"; +import { apiGetAdminCountForumReportKomentar, apiGetAdminCountForumReportPosting, apiGetAdminForumPublishCountDasboard } from "../lib/api_fetch_admin_forum"; import { useState } from "react"; import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; @@ -63,7 +63,7 @@ function ForumMain() { async function onLoadCountReportPosting() { try { - const response = await apiGetAdminForumPublishCountDasboard() + const response = await apiGetAdminCountForumReportPosting() if (response) { setCountLaporanPosting(response.data) } @@ -74,7 +74,7 @@ function ForumMain() { async function onLoadCountReportKomentar() { try { - const response = await apiGetAdminForumPublishCountDasboard() + const response = await apiGetAdminCountForumReportKomentar() if (response) { setCountLaporanKomentar(response.data) } diff --git a/src/app_modules/admin/forum/sub_menu/table_posting.tsx b/src/app_modules/admin/forum/sub_menu/table_posting.tsx index a367e1bf..24aeda9d 100644 --- a/src/app_modules/admin/forum/sub_menu/table_posting.tsx +++ b/src/app_modules/admin/forum/sub_menu/table_posting.tsx @@ -1,5 +1,6 @@ "use client"; + import { RouterAdminForum } from "@/app/lib/router_admin/router_admin_forum"; import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; import ComponentAdminGlobal_HeaderTamplate from "@/app_modules/admin/_admin_global/header_tamplate"; @@ -30,13 +31,17 @@ import { useState } from "react"; import { adminForum_funDeletePostingById } from "../fun/delete/fun_delete_posting_by_id"; import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/_global/notif_global/notifikasi_berhasil"; import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/_global/notif_global/notifikasi_gagal"; -import { useDisclosure } from "@mantine/hooks"; +import { useDisclosure, useShallowEffect } from "@mantine/hooks"; import { adminForum_getListPosting } from "../fun/get/get_list_publish"; import adminJob_getListPublish from "@/app_modules/admin/job/fun/get/get_list_publish"; import ComponentAdminForum_ButtonDeletePosting from "../component/button_delete"; import ComponentAdminGlobal_IsEmptyData from "../../_admin_global/is_empty_data"; import { ComponentAdminGlobal_TitlePage } from "../../_admin_global/_component"; import { AdminColor } from "@/app_modules/_global/color/color_pallet"; +import { apiGetAdminForumPublish } from "../lib/api_fetch_admin_forum"; +import { clientLogger } from "@/util/clientLogger"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; + export default function AdminForum_TablePosting({ listPublish, @@ -47,125 +52,150 @@ export default function AdminForum_TablePosting({ <> - + {/*
{JSON.stringify(listPublish, null, 2)}
*/}
); } -function TablePublish({ listPublish }: { listPublish: any }) { + +function TablePublish() { const router = useRouter(); - const [data, setData] = useState(listPublish.data); - const [nPage, setNPage] = useState(listPublish.nPage); + const [data, setData] = useState(null); + const [nPage, setNPage] = useState(1); const [activePage, setActivePage] = useState(1); const [isSearch, setSearch] = useState(""); - async function onSearch(s: string) { - setSearch(s); - setActivePage(1); - const loadData = await adminForum_getListPosting({ - page: 1, - search: s, - }); - setData(loadData.data as any); - setNPage(loadData.nPage); - } - async function onPageClick(p: any) { - setActivePage(p); - const loadData = await adminForum_getListPosting({ - search: isSearch, - page: p, - }); - setData(loadData.data as any); - setNPage(loadData.nPage); + useShallowEffect(() => { + const loadInitialData = async () => { + try { + const response = await apiGetAdminForumPublish() + + + if (response?.success && response?.data.data) { + setData(response.data.data); + setNPage(response.data.nPage || 1); + } else { + console.error("Invalid data format recieved:", response); + setData([]); + } + } catch (error) { + clientLogger.error("Invlid data format recieved:", error); + setData([]); + } + } + loadInitialData(); + }, [activePage, isSearch]); + const onSearch = async (searchTerm: string) => { + setSearch(searchTerm); + setActivePage(1); } async function onLoadData() { - const loadData = await adminForum_getListPosting({ - page: 1, - }); - setData(loadData.data as any); - setNPage(loadData.nPage); + const loadData = await adminForum_getListPosting({ + page: 1, + }); + setData(loadData.data as any); + setNPage(loadData.nPage); } - const TableRows = data?.map((e, i) => ( - - -
- {e?.Author?.username} -
- - -
- - {e?.ForumMaster_StatusPosting?.status} - -
- - - - -
{ + setActivePage(page); + } + + + const renderTableBody = () => { + if (!Array.isArray(data) || data.length === 0) { + return ( + + +
+ Tidak ada data +
+ + + ) + } + return data?.map((e, i) => ( + + +
+ {e?.Author?.username} +
+ + +
+ + {e?.ForumMaster_StatusPosting?.status} + +
+ + + + +
+ + + + +
+ + {new Intl.DateTimeFormat(["id-ID"], { dateStyle: "medium" }).format( + e.createdAt + )} + +
+ + +
+ + {e?.Forum_Komentar.length} + +
+ + +
+ = 3 ? "red" : "black"} + fw={"bold"} + fz={"lg"} + > + {e?.Forum_ReportPosting.length} + +
+ + + + + { + if (val) { + onLoadData(); + } }} /> - - - - -
- - {new Intl.DateTimeFormat(["id-ID"], { dateStyle: "medium" }).format( - e.createdAt - )} - -
- - -
- - {e?.Forum_Komentar.length} - -
- - -
- = 3 ? "red" : "black"} - fw={"bold"} - fz={"lg"} - > - {e?.Forum_ReportPosting.length} - -
- - - - - { - if (val) { - onLoadData(); - } - }} - /> - - - - )); +
+ + + )); + } + return ( <> @@ -175,36 +205,37 @@ function TablePublish({ listPublish }: { listPublish: any }) { color={AdminColor.softBlue} component={ } - radius={"xl"} - placeholder="Cari postingan" - onChange={(val) => { - onSearch(val.currentTarget.value); - }} - /> + icon={} + radius={"xl"} + placeholder="Cari postingan" + onChange={(val) => { + onSearch(val.currentTarget.value); + }} + /> } /> {/* - - Posting - - } - radius={"xl"} - placeholder="Cari postingan" - onChange={(val) => { - onSearch(val.currentTarget.value); - }} - /> - */} - - {isEmpty(data) ? ( - + position="apart" + bg={"green.4"} + p={"xs"} + style={{ borderRadius: "6px" }} + > + + Posting + + } + radius={"xl"} + placeholder="Cari postingan" + onChange={(val) => { + onSearch(val.currentTarget.value); + }} + /> + */} + + + {!data ? ( + ) : ( @@ -214,7 +245,8 @@ function TablePublish({ listPublish }: { listPublish: any }) { p={"md"} w={"100%"} h={"100%"} - + + > @@ -241,7 +273,7 @@ function TablePublish({ listPublish }: { listPublish: any }) { - {TableRows} + {renderTableBody()}
@@ -260,11 +292,13 @@ function TablePublish({ listPublish }: { listPublish: any }) { ); } + function ButtonAction({ postingId }: { postingId: string }) { const router = useRouter(); const [loadingKomentar, setLoadingKomentar] = useState(false); const [loadingReport, setLoadingReport] = useState(false); + return ( <>