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..830d34d1 --- /dev/null +++ b/src/app/api/admin/forum/komentar/route.ts @@ -0,0 +1,133 @@ +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) { + 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_Komentar: { + isActive: true, + komentar: { + contains: search ? search : "", + mode: "insensitive", + }, + }, + }, + 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_Komentar: { + isActive: true, + komentar: { + contains: search ? search : "", + mode: "insensitive", + }, + }, + }, + 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_Komentar: { + isActive: true, + komentar: { + contains: search ? search : "", + mode: "insensitive", + }, + }, + } + }) + + fixData = { + data: data, + nCount: _.ceil(nCount / takeData) + } + } + + 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..9e4dbed9 --- /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, + message: "Success get data forum posting", + data: fixData + }, + { 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..43403b86 100644 --- a/src/app/api/admin/forum/publish/route.ts +++ b/src/app/api/admin/forum/publish/route.ts @@ -24,6 +24,40 @@ 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 +107,6 @@ export async function GET(request: Request) { data: data, nCount: _.ceil(nCount / takeData) } - } return NextResponse.json({ success: true, @@ -91,5 +124,7 @@ export async function GET(request: Request) { }, { status: 500 } ) + } finally { + await prisma.$disconnect() } } \ No newline at end of file diff --git a/src/app/dev/admin/forum/sub-menu/posting/page.tsx b/src/app/dev/admin/forum/sub-menu/posting/page.tsx index c6457777..55e43394 100644 --- a/src/app/dev/admin/forum/sub-menu/posting/page.tsx +++ b/src/app/dev/admin/forum/sub-menu/posting/page.tsx @@ -2,11 +2,11 @@ import { AdminForum_TablePublish } from "@/app_modules/admin/forum"; import { adminForum_getListPosting } from "@/app_modules/admin/forum/fun/get/get_list_publish"; export default async function Page() { - const listPublish = await adminForum_getListPosting({page: 1}); + return ( <> - + ); } diff --git a/src/app/dev/admin/forum/sub-menu/report-komentar/page.tsx b/src/app/dev/admin/forum/sub-menu/report-komentar/page.tsx index dfff6d5b..52063831 100644 --- a/src/app/dev/admin/forum/sub-menu/report-komentar/page.tsx +++ b/src/app/dev/admin/forum/sub-menu/report-komentar/page.tsx @@ -1,12 +1,10 @@ -import adminForum_funGetAllReportKomentar from "@/app_modules/admin/forum/fun/get/get_all_report_komentar"; import AdminForum_TableReportKomentar from "@/app_modules/admin/forum/sub_menu/table_report_komentar"; export default async function Page() { - const listData = await adminForum_funGetAllReportKomentar({ page: 1 }); - + return ( <> - + ); } 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..7e5704a7 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); @@ -35,10 +38,11 @@ const apiGetAdminForumReportPosting = async () => { }, }) + return await response.json().catch(() => null); } -const apiGetAdminForumReportKomentar = async () => { +const apiGetAdminCountForumReportKomentar = async () => { const { token } = await fetch("/api/get-cookie").then((res) => res.json()); if (!token) return await token.json().catch(() => null); @@ -52,5 +56,56 @@ const apiGetAdminForumReportKomentar = async () => { }, }) + 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/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({ page } : { page?: 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 response = await fetch(`/api/admin/forum/komentar${isPage}`, { + method: "GET", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + "Access-Control-Allow-Origin": "*", + Authorization: `Bearer ${token}`, + }, + }) + + return await response.json().catch(() => null); +} +const apiGetAdminForumPublish = async ({ page }: { page?: 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 response = await fetch(`/api/admin/forum/publish${isPage}`, { + 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..9580c581 100644 --- a/src/app_modules/admin/forum/sub_menu/table_posting.tsx +++ b/src/app_modules/admin/forum/sub_menu/table_posting.tsx @@ -1,16 +1,17 @@ "use client"; + import { RouterAdminForum } from "@/app/lib/router_admin/router_admin_forum"; -import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; +import { AdminColor } from "@/app_modules/_global/color/color_pallet"; import ComponentAdminGlobal_HeaderTamplate from "@/app_modules/admin/_admin_global/header_tamplate"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; import { MODEL_FORUM_POSTING } from "@/app_modules/forum/model/interface"; +import { clientLogger } from "@/util/clientLogger"; import { Badge, Box, Button, Center, - Group, - Modal, Pagination, Paper, ScrollArea, @@ -18,154 +19,170 @@ import { Stack, Table, Text, - TextInput, - Title, + TextInput } from "@mantine/core"; -import { IconMessageCircle, IconSearch } from "@tabler/icons-react"; -import { IconFlag3 } from "@tabler/icons-react"; -import { IconEyeCheck, IconTrash } from "@tabler/icons-react"; -import _, { isEmpty } from "lodash"; +import { useShallowEffect } from "@mantine/hooks"; +import { IconFlag3, IconMessageCircle, IconSearch } from "@tabler/icons-react"; import { useRouter } from "next/navigation"; 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 { 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 ComponentAdminForum_ButtonDeletePosting from "../component/button_delete"; +import { apiGetAdminForumPublish } from "../lib/api_fetch_admin_forum"; -export default function AdminForum_TablePosting({ - listPublish, -}: { - listPublish: any; -}) { + +export default function AdminForum_TablePosting() { return ( <> - + {/*
{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({ + page: `${activePage}` + }) + + + if (response?.success && response?.data.data) { + setData(response.data.data); + setNPage(response.data.nCount || 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 = (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 apiGetAdminForumPublish({ + page: `${activePage}` + }); + setData(loadData.data.data); + setNPage(loadData.data.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( + new Date(e?.createdAt) + )} + +
+ + +
+ + {e?.Forum_Komentar.length} + +
+ + +
+ = 3 ? "red" : AdminColor.white} + 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 +192,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 +232,8 @@ function TablePublish({ listPublish }: { listPublish: any }) { p={"md"} w={"100%"} h={"100%"} - + + > @@ -241,7 +260,7 @@ function TablePublish({ listPublish }: { listPublish: any }) { - {TableRows} + {renderTableBody()}
@@ -260,11 +279,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 ( <>