From 2c443587ba19c6c4e078433eee3def168078b63f Mon Sep 17 00:00:00 2001 From: nico Date: Tue, 11 Feb 2025 10:42:00 +0800 Subject: [PATCH] Tambahan --- .../api/admin/collaboration/[status]/route.ts | 156 +++++++++++ .../api/admin/collaboration/group/route.ts | 139 ++++++++++ src/app/api/admin/investasi/[status]/route.ts | 4 +- .../forum/sub-menu/report-posting/page.tsx | 4 +- .../lib/api_fetch_admin_collaboration.ts | 46 ++++ .../admin/forum/lib/api_fetch_admin_forum.ts | 5 +- .../admin/forum/sub_menu/table_posting.tsx | 2 +- .../forum/sub_menu/table_report_posting.tsx | 258 +++++++++--------- src/middleware.ts | 1 + 9 files changed, 487 insertions(+), 128 deletions(-) create mode 100644 src/app/api/admin/collaboration/[status]/route.ts create mode 100644 src/app/api/admin/collaboration/group/route.ts diff --git a/src/app/api/admin/collaboration/[status]/route.ts b/src/app/api/admin/collaboration/[status]/route.ts new file mode 100644 index 00000000..6faf5146 --- /dev/null +++ b/src/app/api/admin/collaboration/[status]/route.ts @@ -0,0 +1,156 @@ +import { prisma } from "@/app/lib"; +import backendLogger from "@/util/backendLogger"; +import _ from "lodash"; +import { NextResponse } from "next/server"; + +export async function GET(request: Request, { params }: + { params: { status: string } } +) { + + + const { status } = 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(status); + + if (!page) { + fixData = await prisma.projectCollaboration.findMany({ + skip: skipData, + take: takeData, + orderBy: { + createdAt: "desc", + }, + where: { + isActive: true, + isReject: false, + Author: { + active: true, + }, + title: { + contains: search ? search : "", + mode: "insensitive", + }, + }, + select: { + id: true, + createdAt: true, + isActive: true, + title: true, + Author: { + select: { + id: true, + username: true, + Profile: true, + }, + }, + projectCollaborationMaster_IndustriId: true, + ProjectCollaborationMaster_Industri: true, + ProjectCollaboration_Partisipasi: { + where: { + User: { + active: true, + }, + }, + // select: { + // User: { + // select: { + // id: true, + // username: true, + // Profile: true, + // }, + // }, + // }, + }, + }, + }); + } else { + const data = await prisma.projectCollaboration.findMany({ + skip: skipData, + take: takeData, + orderBy: { + createdAt: "desc", + }, + where: { + isActive: true, + isReject: false, + Author: { + active: true, + }, + title: { + contains: search ? search : "", + mode: "insensitive", + }, + }, + select: { + id: true, + createdAt: true, + isActive: true, + title: true, + Author: { + select: { + id: true, + username: true, + Profile: true, + }, + }, + projectCollaborationMaster_IndustriId: true, + ProjectCollaborationMaster_Industri: true, + ProjectCollaboration_Partisipasi: { + where: { + User: { + active: true, + }, + }, + // select: { + // User: { + // select: { + // id: true, + // username: true, + // Profile: true, + // }, + // }, + // }, + }, + }, + }); + + const nCount = await prisma.projectCollaboration.count({ + where: { + isActive: true, + isReject: false, + Author: { + active: true, + }, + }, + }); + + fixData = { + data: data, + nPage: _.ceil(nCount / takeData), + } + } + + return NextResponse.json({ + success: true, + message: "Success get data collaboration dashboard", + data: fixData, + }, + { status: 200 } + ); + } catch (error) { + backendLogger.error("Error get data collaboration dashboard >>", error); + return NextResponse.json({ + success: false, + message: "Error get data collaboration dashboard", + reason: (error as Error).message + }, + { status: 500 } + ) + } +} \ No newline at end of file diff --git a/src/app/api/admin/collaboration/group/route.ts b/src/app/api/admin/collaboration/group/route.ts new file mode 100644 index 00000000..8a25420b --- /dev/null +++ b/src/app/api/admin/collaboration/group/route.ts @@ -0,0 +1,139 @@ +import { prisma } from "@/app/lib"; +import backendLogger from "@/util/backendLogger"; +import _ from "lodash"; +import { NextResponse } from "next/server"; + +export async function GET(request: Request) { + + 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.projectCollaboration_RoomChat.findMany({ + orderBy: { + createdAt: "desc", + }, + where: { + isActive: true, + }, + select: { + id: true, + createdAt: true, + isActive: true, + name: true, + ProjectCollaboration_AnggotaRoomChat: { + select: { + User: { + select: { + id: true, + Profile: true, + }, + }, + }, + }, + ProjectCollaboration: { + select: { + id: true, + isActive: true, + title: true, + lokasi: true, + purpose: true, + benefit: true, + createdAt: true, + report: true, + Author: { + select: { + id: true, + Profile: { + select: { + name: true, + }, + }, + }, + }, + ProjectCollaborationMaster_Industri: true, + }, + }, + }, + }); + } else { + const data = await prisma.projectCollaboration_RoomChat.findMany({ + take: takeData, + skip: skipData, + orderBy: { + createdAt: "desc", + }, + where: { + isActive: true, + }, + select: { + id: true, + createdAt: true, + isActive: true, + name: true, + ProjectCollaboration_AnggotaRoomChat: { + select: { + User: { + select: { + id: true, + Profile: true, + }, + }, + }, + }, + ProjectCollaboration: { + select: { + id: true, + isActive: true, + title: true, + lokasi: true, + purpose: true, + benefit: true, + createdAt: true, + report: true, + Author: { + select: { + id: true, + Profile: { + select: { + name: true, + }, + }, + }, + }, + ProjectCollaborationMaster_Industri: true, + }, + }, + }, + }); + + const nCount = await prisma.projectCollaboration_RoomChat.count({ + where: { + isActive: true, + }, + }) + + fixData = { + data: data, + nPage: _.ceil(nCount / takeData) + } + } + + } catch (error) { + + backendLogger.error("Error get data collaboration group >>", error); + return NextResponse.json({ + success: false, + message: "Error get data collaboration group", + reason: (error as Error).message + }, + { status: 500 } + ) + } +} \ No newline at end of file diff --git a/src/app/api/admin/investasi/[status]/route.ts b/src/app/api/admin/investasi/[status]/route.ts index 8686ef12..14a0adb3 100644 --- a/src/app/api/admin/investasi/[status]/route.ts +++ b/src/app/api/admin/investasi/[status]/route.ts @@ -30,7 +30,7 @@ export async function GET(request: Request, { params }: { if (!page) { - const data = await prisma.investasi.findMany({ + fixData = await prisma.investasi.findMany({ orderBy: { updatedAt: "desc", }, @@ -62,6 +62,8 @@ export async function GET(request: Request, { params }: { }); } else { const data = await prisma.investasi.findMany({ + take: takeData, + skip: skipData, orderBy: { updatedAt: "desc", }, diff --git a/src/app/dev/admin/forum/sub-menu/report-posting/page.tsx b/src/app/dev/admin/forum/sub-menu/report-posting/page.tsx index 9d2e6dfb..ffce57f8 100644 --- a/src/app/dev/admin/forum/sub-menu/report-posting/page.tsx +++ b/src/app/dev/admin/forum/sub-menu/report-posting/page.tsx @@ -2,11 +2,11 @@ import { AdminForum_TableReportPosting } from "@/app_modules/admin/forum"; import adminForum_funGetAllReportPosting from "@/app_modules/admin/forum/fun/get/get_all_report_posting"; export default async function Page() { - const listData = await adminForum_funGetAllReportPosting({ page: 1 }); + return ( <> - + ); } diff --git a/src/app_modules/admin/colab/lib/api_fetch_admin_collaboration.ts b/src/app_modules/admin/colab/lib/api_fetch_admin_collaboration.ts index 3317011d..d6375f84 100644 --- a/src/app_modules/admin/colab/lib/api_fetch_admin_collaboration.ts +++ b/src/app_modules/admin/colab/lib/api_fetch_admin_collaboration.ts @@ -1,5 +1,7 @@ export { apiGetAdminCollaborationStatusCountDashboard, + apiGetAdminCollaborationStatusById, + apiGetAdminCollaborationRoomById } const apiGetAdminCollaborationStatusCountDashboard = async ({ @@ -23,3 +25,47 @@ const apiGetAdminCollaborationStatusCountDashboard = async ({ // console.log("Ini Response", await response.json()); return await response.json().catch(() => null); } +const apiGetAdminCollaborationStatusById = async ({ status, page, search }: { + status: "Publish" | "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/collaboration/${status}${isPage}${isSearch}`, { + headers: { + "Content-Type": "application/json", + Accept: "application/json", + "Access-Control-Allow-Origin": "*", + Authorization: `Bearer ${token}`, + } + }) + + return await response.json().catch(() => null); +} +const apiGetAdminCollaborationRoomById = async ({ page, search }: { + 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/collaboration/group${isPage}${isSearch}`, { + headers: { + "Content-Type": "application/json", + Accept: "application/json", + "Access-Control-Allow-Origin": "*", + Authorization: `Bearer ${token}`, + } + }) + + return await response.json().catch(() => null); +} + 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 7e5704a7..442b4303 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 @@ -58,11 +58,12 @@ const apiGetAdminCountForumReportKomentar = async () => { return await response.json().catch(() => null); } -const apiGetAdminForumReportPosting = async () => { +const apiGetAdminForumReportPosting = async ({page} : { page?: 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/admin/forum/posting`, { + const isPage = page ? `?page=${page}` : ""; + const response = await fetch(`/api/admin/forum/posting${isPage}`, { method: "GET", headers: { "Content-Type": "application/json", 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 9580c581..91cd297a 100644 --- a/src/app_modules/admin/forum/sub_menu/table_posting.tsx +++ b/src/app_modules/admin/forum/sub_menu/table_posting.tsx @@ -84,7 +84,7 @@ function TablePublish() { page: `${activePage}` }); setData(loadData.data.data); - setNPage(loadData.data.nPage); + setNPage(loadData.data.nCount); } const onPageClick = (page: number) => { diff --git a/src/app_modules/admin/forum/sub_menu/table_report_posting.tsx b/src/app_modules/admin/forum/sub_menu/table_report_posting.tsx index 646b53be..4a6496a8 100644 --- a/src/app_modules/admin/forum/sub_menu/table_report_posting.tsx +++ b/src/app_modules/admin/forum/sub_menu/table_report_posting.tsx @@ -30,139 +30,153 @@ import ComponentAdminForum_ButtonDeletePosting from "../component/button_delete" import adminForum_funGetAllReportPosting from "../fun/get/get_all_report_posting"; import { ComponentAdminGlobal_TitlePage } from "../../_admin_global/_component"; import { AdminColor } from "@/app_modules/_global/color/color_pallet"; +import { useShallowEffect } from "@mantine/hooks"; +import { apiGetAdminForumReportPosting } from "../lib/api_fetch_admin_forum"; +import { clientLogger } from "@/util/clientLogger"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; -export default function AdminForum_TableReportPosting({ - listData, -}: { - listData: any; -}) { +export default function AdminForum_TableReportPosting() { return ( <> - + {/*
{JSON.stringify(listPublish, null, 2)}
*/}
); } -function TableView({ listData }: { listData: any }) { +function TableView() { const router = useRouter(); - const [data, setData] = useState(listData.data); - const [nPage, setNPage] = useState(listData.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); + useShallowEffect(() => { + const loadInitialData = async () => { + try { + const response = await apiGetAdminForumReportPosting({ + page: `${activePage}` + }) + + if (response?.success && response?.data) { + setData(response.data); + setNPage(response.data.nCount || 1) + } else { + console.error("Invalid data format recieved", response), + setData([]) + } + } catch (error) { + clientLogger.error("Invalid data format recieved", error) + setData([]) + } + } + loadInitialData(); + }, [activePage, isSearch]); + async function onSearch(searchTerm: string) { + setSearch(searchTerm); setActivePage(1); - const loadData = await adminForum_funGetAllReportPosting({ - page: 1, - search: s, - }); - setData(loadData.data as any); - setNPage(loadData.nPage); } - async function onPageClick(p: any) { - setActivePage(p); - const loadData = await adminForum_funGetAllReportPosting({ - search: isSearch, - page: p, - }); - setData(loadData.data as any); - setNPage(loadData.nPage); + const onPageClick = (page: number) => { + setActivePage(page); } - async function onLoadData() { - const loadData = await adminForum_funGetAllReportPosting({ - page: 1, - }); - setData(loadData.data as any); - setNPage(loadData.nPage); - } - - const TableRows = data?.map((e, i) => ( - - -
- {e?.User.username} -
- - -
- {e?.forumMaster_KategoriReportId === null ? ( - Lainnya - ) : ( - {e?.ForumMaster_KategoriReport.title} - )} -
- - - {/* -
- {e?.Forum_Posting.Author.username} -
- - - - - -
- - - */} - - -
- - {e?.Forum_Posting.ForumMaster_StatusPosting?.status} - -
- - - -
- - {new Intl.DateTimeFormat(["id-ID"], { dateStyle: "medium" }).format( - e.createdAt + const renderTableBody = () => { + if (!Array.isArray(data) || data.length === 0) { + return ( + + +
+ Tidak ada data +
+ + + ) + } + return data?.map((e, i) => ( + + +
+ {e?.User.username} +
+ + +
+ {e?.forumMaster_KategoriReportId === null ? ( + Lainnya + ) : ( + {e?.ForumMaster_KategoriReport.title} )} - -
- - - - - {/* */} - - {/* { - if (val) { - onLoadData(); +
+ + + {/* +
+ {e?.Forum_Posting.Author.username} +
+ + + + + +
+ + + */} + + +
+ */} - - - - )); + > + {e?.Forum_Posting?.ForumMaster_StatusPosting?.status} + +
+ + + +
+ + {new Intl.DateTimeFormat("id-ID", { dateStyle: "medium" }).format( + new Date(e?.createdAt) + )} + +
+ + + + + {/* */} + + {/* { + if (val) { + onLoadData(); + } + }} + /> */} + + + + )); + } return ( <> @@ -172,14 +186,14 @@ function TableView({ listData }: { listData: any }) { color={AdminColor.softBlue} component={ } - radius={"xl"} - placeholder="Cari postingan" - onChange={(val) => { + icon={} + radius={"xl"} + placeholder="Cari postingan" + onChange={(val) => { - onSearch(val.currentTarget.value); - }} - /> + onSearch(val.currentTarget.value); + }} + /> } /> {/* */} - {isEmpty(data) ? ( - + {!data ? ( + ) : ( @@ -213,7 +227,7 @@ function TableView({ listData }: { listData: any }) { p={"md"} w={"100%"} h={"100%"} - + > @@ -241,7 +255,7 @@ function TableView({ listData }: { listData: any }) { - {TableRows} + {renderTableBody()}
diff --git a/src/middleware.ts b/src/middleware.ts index cbcfd294..4dbd6ca6 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -34,6 +34,7 @@ const middlewareConfig: MiddlewareConfig = { // ADMIN API // >> buat dibawah sini << + "/api/admin/collaboration/*", // Akses awal "/api/get-cookie",