diff --git a/run.env.local b/run.env.local new file mode 100644 index 00000000..3e93d529 --- /dev/null +++ b/run.env.local @@ -0,0 +1 @@ +bun --env-file=.env.local run --bun dev \ No newline at end of file diff --git a/run.prisma.env.local b/run.prisma.env.local new file mode 100644 index 00000000..57a64842 --- /dev/null +++ b/run.prisma.env.local @@ -0,0 +1,3 @@ +bun --env-file=.env.local prisma db push +bun --env-file=.env.local prisma db seed +bun --env-file=.env.local run --bun build \ No newline at end of file diff --git a/src/app/api/forum/[id]/route.ts b/src/app/api/forum/[id]/route.ts new file mode 100644 index 00000000..9a18775f --- /dev/null +++ b/src/app/api/forum/[id]/route.ts @@ -0,0 +1,54 @@ +import backendLogger from "@/util/backendLogger"; +import { NextResponse } from "next/server"; + +export { GET }; + +async function GET(request: Request, { params }: { params: { id: string } }) { + try { + const { id } = params; + + const data = await prisma.forum_Posting.findUnique({ + where: { + id: id, + }, + select: { + id: true, + diskusi: true, + isActive: true, + createdAt: true, + authorId: true, + Author: { + select: { + id: true, + username: true, + Profile: true, + }, + }, + + _count: { + select: { + Forum_Komentar: true, + }, + }, + ForumMaster_StatusPosting: true, + forumMaster_StatusPostingId: true, + }, + }); + + return NextResponse.json({ + success: true, + message: "Success get data", + data: data, + }); + } catch (error) { + backendLogger.error("Error get data forum", error); + return NextResponse.json( + { + success: false, + message: "Error get data forum", + reason: (error as Error).message, + }, + { status: 500 } + ); + } +} diff --git a/src/app/api/forum/forumku/[id]/route.ts b/src/app/api/forum/forumku/[id]/route.ts new file mode 100644 index 00000000..4c430580 --- /dev/null +++ b/src/app/api/forum/forumku/[id]/route.ts @@ -0,0 +1,122 @@ +import { NextResponse } from "next/server"; + +export { GET }; + +async function GET(request: Request, { params }: { params: { id: string } }) { + try { + let fixData; + const { id } = params; + const { searchParams } = new URL(request.url); + const page = searchParams.get("page"); + const takeData = 5; + const skipData = Number(page) * takeData - takeData; + + console.log("id", id) + console.log("page >", page) + + if (!page) { + fixData = await prisma.forum_Posting.findMany({ + orderBy: { + createdAt: "desc", + }, + where: { + authorId: id, + isActive: true, + }, + select: { + id: true, + diskusi: true, + createdAt: true, + isActive: true, + authorId: true, + Author: { + select: { + id: true, + username: true, + Profile: { + select: { + id: true, + name: true, + imageId: true, + }, + }, + }, + }, + Forum_Komentar: { + where: { + isActive: true, + }, + }, + ForumMaster_StatusPosting: { + select: { + id: true, + status: true, + }, + }, + forumMaster_StatusPostingId: true, + }, + }); + } else { + fixData = await prisma.forum_Posting.findMany({ + take: takeData, + skip: skipData, + orderBy: { + createdAt: "desc", + }, + where: { + authorId: id, + isActive: true, + }, + select: { + id: true, + diskusi: true, + createdAt: true, + isActive: true, + authorId: true, + Author: { + select: { + id: true, + username: true, + Profile: { + select: { + id: true, + name: true, + imageId: true, + }, + }, + }, + }, + Forum_Komentar: { + where: { + isActive: true, + }, + }, + ForumMaster_StatusPosting: { + select: { + id: true, + status: true, + }, + }, + forumMaster_StatusPostingId: true, + }, + }); + } + + return NextResponse.json({ + success: true, + message: "Berhasil mendapatkan data", + data: fixData, + }); + } catch (error) { + return NextResponse.json( + { + success: false, + message: "Gagal mendapatkan data", + error: (error as Error).message, + }, + { + status: 500, + } + ); + } +} diff --git a/src/app/api/forum/route.ts b/src/app/api/forum/route.ts index 9188747e..6c53c6d2 100644 --- a/src/app/api/forum/route.ts +++ b/src/app/api/forum/route.ts @@ -9,9 +9,10 @@ export async function GET(request: Request) { const { searchParams } = new URL(request.url); const page = searchParams.get("page"); const search = searchParams.get("search"); - const takeData = 4 + const takeData = 5; const skipData = Number(page) * takeData - takeData; + if (!page) { fixData = await prisma.forum_Posting.findMany({ orderBy: { diff --git a/src/app/dev/forum/edit/posting/[id]/page.tsx b/src/app/dev/forum/edit/posting/[id]/page.tsx index 292059f4..726a9ff6 100644 --- a/src/app/dev/forum/edit/posting/[id]/page.tsx +++ b/src/app/dev/forum/edit/posting/[id]/page.tsx @@ -1,13 +1,10 @@ import { Forum_EditPosting } from "@/app_modules/forum"; -import { forum_getOnePostingById } from "@/app_modules/forum/fun/get/get_one_posting_by_id"; -export default async function Page({ params }: { params: { id: string } }) { - let postingId = params.id; - const dataPosting = await forum_getOnePostingById(postingId) +export default async function Page() { return ( <> - + ); } diff --git a/src/app/dev/forum/forumku/[id]/layout.tsx b/src/app/dev/forum/forumku/[id]/layout.tsx index 1043a279..8e0ddbea 100644 --- a/src/app/dev/forum/forumku/[id]/layout.tsx +++ b/src/app/dev/forum/forumku/[id]/layout.tsx @@ -1,22 +1,14 @@ import { LayoutForum_Forumku } from "@/app_modules/forum"; -import { user_getOneByUserId } from "@/app_modules/home/fun/get/get_one_user_by_id"; import React from "react"; export default async function Layout({ children, - params, }: { children: React.ReactNode; - params: { id: string }; }) { - const authorId = params.id; - const dataAuthor = await user_getOneByUserId(authorId); - return ( <> - - {children} - + {children} ); } diff --git a/src/app/dev/forum/forumku/[id]/page.tsx b/src/app/dev/forum/forumku/[id]/page.tsx index b4d4391f..81cdd338 100644 --- a/src/app/dev/forum/forumku/[id]/page.tsx +++ b/src/app/dev/forum/forumku/[id]/page.tsx @@ -34,8 +34,6 @@ export default async function Page({ params }: { params: { id: string } }) { return ( <> diff --git a/src/app/zCoba/skeleton/page.tsx b/src/app/zCoba/skeleton/page.tsx index 83058314..5e0c03ad 100644 --- a/src/app/zCoba/skeleton/page.tsx +++ b/src/app/zCoba/skeleton/page.tsx @@ -6,7 +6,7 @@ import { UIGlobal_LayoutTamplate, } from "@/app_modules/_global/ui"; import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; -import { Button, Grid, Skeleton, Stack } from "@mantine/core"; +import { Button, Center, Grid, Group, Skeleton, Stack } from "@mantine/core"; import Link from "next/link"; export default function Voting_ComponentSkeletonViewPuh() { @@ -15,13 +15,34 @@ export default function Voting_ComponentSkeletonViewPuh() { } > - + +
+ +
+ + + + + + + + + + + + + + + +
+ + {/* {Array.from({ length: 4 }).map((_, i) => ( ))} - +
*/}
); diff --git a/src/app_modules/auth/invalid_user/view.tsx b/src/app_modules/auth/invalid_user/view.tsx index 737c74b1..fddda4a7 100644 --- a/src/app_modules/auth/invalid_user/view.tsx +++ b/src/app_modules/auth/invalid_user/view.tsx @@ -2,11 +2,13 @@ import { MainColor } from "@/app_modules/_global/color"; import { UIGlobal_LayoutDefault } from "@/app_modules/_global/ui"; -import { Button, Stack, Text, Title } from "@mantine/core"; +import { Button, Stack, Title } from "@mantine/core"; import { useRouter } from "next/navigation"; +import { useState } from "react"; export default function InvalidUser() { const router = useRouter(); + const [isLoading, setIsLoading] = useState(false); const deleteCookie = async () => { const sessionKey = process.env.NEXT_PUBLIC_BASE_SESSION_KEY!; if (!sessionKey) { @@ -14,12 +16,15 @@ export default function InvalidUser() { } try { + setIsLoading(true); await fetch("/api/auth/logout", { method: "GET", }); router.push("/login"); } catch (error) { console.error("Gagal menghapus cookie:", error); + } finally { + setIsLoading(false); } }; @@ -32,6 +37,8 @@ export default function InvalidUser() { Invalid User + + + ); +} diff --git a/src/app_modules/forum/component/card_loader.tsx b/src/app_modules/forum/component/card_loader.tsx deleted file mode 100644 index e3660996..00000000 --- a/src/app_modules/forum/component/card_loader.tsx +++ /dev/null @@ -1,25 +0,0 @@ -"use client"; - -import { Overlay, Center, Loader } from "@mantine/core"; - -export default function ComponentForum_CardLoadingOverlay({ - size, - variant, -}: { - size?: number; - variant?: any; -}) { - return ( - <> - -
- -
-
- - ); -} diff --git a/src/app_modules/forum/component/loading_drawer.tsx b/src/app_modules/forum/component/loading_drawer.tsx deleted file mode 100644 index 3a1a53ac..00000000 --- a/src/app_modules/forum/component/loading_drawer.tsx +++ /dev/null @@ -1,22 +0,0 @@ -"use client"; - -import { Center, Group, LoadingOverlay, Skeleton } from "@mantine/core"; - -export default function ComponentForum_LoadingDrawer() { - const customLoad = ( -
- - {Array(3) - .fill(0) - .map((e, i) => ( - - ))} - -
- ); - return ( - <> - {customLoad} - - ); -} diff --git a/src/app_modules/forum/component/main_component/card_more_button.tsx b/src/app_modules/forum/component/main_component/card_more_button.tsx index a248c564..bda87f56 100644 --- a/src/app_modules/forum/component/main_component/card_more_button.tsx +++ b/src/app_modules/forum/component/main_component/card_more_button.tsx @@ -37,6 +37,7 @@ import { AccentColor, MainColor, } from "@/app_modules/_global/color/color_pallet"; +import { clientLogger } from "@/util/clientLogger"; export default function ComponentForum_BerandaMoreButton({ authorId, @@ -255,11 +256,11 @@ function ButtonDelete({ const [loading, setLoading] = useState(false); async function onDelete() { - setOpenDel(false); - await forum_funDeletePostingById(postingId as any).then(async (res) => { - if (res.status === 200) { - ComponentGlobal_NotifikasiBerhasil(`Postingan Terhapus`, 2000); - setLoading(true); + try { + setLoading(true); + const deleteData = await forum_funDeletePostingById(postingId as any); + if (deleteData.status === 200) { + setOpenDel(false); const cloneData = _.clone(allData); const hapusData = cloneData.filter((e) => e.id !== postingId); @@ -272,10 +273,16 @@ function ButtonDelete({ data: hapusData, }) ); + + ComponentGlobal_NotifikasiBerhasil(`Postingan Terhapus`, 2000); } else { - ComponentGlobal_NotifikasiGagal(res.message); + setLoading(false); + ComponentGlobal_NotifikasiGagal(deleteData.message); } - }); + } catch (error) { + setLoading(false); + clientLogger.error("Error get data forum", error); + } } return ( <> @@ -324,120 +331,132 @@ function ButtonStatus({ const [loading, setLoading] = useState(false); async function onTutupForum() { - setOpenStatus(false); - - const upateStatusClose = await forum_funEditStatusPostingById( - postingId as any, - 2 - ); - if (upateStatusClose.status === 200) { - ComponentGlobal_NotifikasiBerhasil(`Forum Ditutup`, 2000); + try { setLoading(true); - - const cloneData = _.clone(allData); - const loadData = cloneData.map( - (e) => ( - e.id === postingId, - { - ...e, - ForumMaster_StatusPosting: { - id: e.id === postingId ? 2 : e.ForumMaster_StatusPosting.id, - status: - e.id === postingId - ? "Close" - : e.ForumMaster_StatusPosting.status, - }, - } - ) - ); - onLoadData(loadData); - - // - mqtt_client.publish( - "Forum_ganti_status", - JSON.stringify({ - id: postingId, - data: loadData, - }) + const upateStatusClose = await forum_funEditStatusPostingById( + postingId as any, + 2 ); - const findData = cloneData.find((val) => val.id === postingId); - const updateDetail = { - ...findData, - ForumMaster_StatusPosting: { - id: 2, - status: "Close", - }, - }; + if (upateStatusClose.status === 200) { + setOpenStatus(false); + ComponentGlobal_NotifikasiBerhasil(`Forum Ditutup`, 2000); - mqtt_client.publish( - "Forum_detail_ganti_status", - JSON.stringify({ - id: postingId, - data: updateDetail.ForumMaster_StatusPosting, - }) - ); - } else { - ComponentGlobal_NotifikasiGagal(upateStatusClose.message); + const cloneData = _.clone(allData); + const loadData = cloneData.map( + (e) => ( + e.id === postingId, + { + ...e, + ForumMaster_StatusPosting: { + id: e.id === postingId ? 2 : e.ForumMaster_StatusPosting.id, + status: + e.id === postingId + ? "Close" + : e.ForumMaster_StatusPosting.status, + }, + } + ) + ); + onLoadData(loadData); + + // + mqtt_client.publish( + "Forum_ganti_status", + JSON.stringify({ + id: postingId, + data: loadData, + }) + ); + + const findData = cloneData.find((val) => val.id === postingId); + const updateDetail = { + ...findData, + ForumMaster_StatusPosting: { + id: 2, + status: "Close", + }, + }; + + mqtt_client.publish( + "Forum_detail_ganti_status", + JSON.stringify({ + id: postingId, + data: updateDetail.ForumMaster_StatusPosting, + }) + ); + } else { + setLoading(false); + ComponentGlobal_NotifikasiGagal(upateStatusClose.message); + } + } catch (error) { + setLoading(false); + clientLogger.error("Error get data forum", error); } } async function onBukaForum() { - setOpenStatus(false); - - const updateStatusOpen = await forum_funEditStatusPostingById( - postingId as any, - 1 - ); - if (updateStatusOpen.status === 200) { - ComponentGlobal_NotifikasiBerhasil(`Forum Dibuka`, 2000); + try { setLoading(true); - - const cloneData = _.clone(allData); - const loadData = cloneData.map( - (e) => ( - e.id === postingId, - { - ...e, - ForumMaster_StatusPosting: { - id: e.id === postingId ? 1 : e.ForumMaster_StatusPosting.id, - status: - e.id === postingId - ? "Open" - : e.ForumMaster_StatusPosting.status, - }, - } - ) + const updateStatusOpen = await forum_funEditStatusPostingById( + postingId as any, + 1 ); - mqtt_client.publish( - "Forum_ganti_status", - JSON.stringify({ - id: postingId, - data: loadData, - }) - ); + if (updateStatusOpen.status === 200) { + setOpenStatus(false); + ComponentGlobal_NotifikasiBerhasil(`Forum Dibuka`, 2000); - onLoadData(loadData); + const cloneData = _.clone(allData); + const loadData = cloneData.map( + (e) => ( + e.id === postingId, + { + ...e, + ForumMaster_StatusPosting: { + id: e.id === postingId ? 1 : e.ForumMaster_StatusPosting.id, + status: + e.id === postingId + ? "Open" + : e.ForumMaster_StatusPosting.status, + }, + } + ) + ); - const findData = cloneData.find((val) => val.id === postingId); - const updateDetail = { - ...findData, - ForumMaster_StatusPosting: { - id: 1, - status: "Open", - }, - }; + mqtt_client.publish( + "Forum_ganti_status", + JSON.stringify({ + id: postingId, + data: loadData, + }) + ); - mqtt_client.publish( - "Forum_detail_ganti_status", - JSON.stringify({ - id: postingId, - data: updateDetail.ForumMaster_StatusPosting, - }) - ); - } else { - ComponentGlobal_NotifikasiGagal(updateStatusOpen.message); + onLoadData(loadData); + + const findData = cloneData.find((val) => val.id === postingId); + const updateDetail = { + ...findData, + ForumMaster_StatusPosting: { + id: 1, + status: "Open", + }, + }; + + mqtt_client.publish( + "Forum_detail_ganti_status", + JSON.stringify({ + id: postingId, + data: updateDetail.ForumMaster_StatusPosting, + }) + ); + } else { + setLoading(false); + ComponentGlobal_NotifikasiGagal(updateStatusOpen.message); + } + } catch (error) { + setLoading(false); + clientLogger.error("Error get data forum", error); } } @@ -461,7 +480,7 @@ function ButtonStatus({ {statusId === 1 ? ( - - - ); -}