API Table Forum Posting & API Table Forum Report Komentar

This commit is contained in:
2025-02-10 17:15:01 +08:00
25 changed files with 412 additions and 357 deletions

View File

@@ -0,0 +1,22 @@
import { jwtVerify } from "jose";
export async function decrypt({
token,
encodedKey,
}: {
token: string;
encodedKey: string;
}): Promise<Record<string, any> | null> {
try {
const enc = new TextEncoder().encode(encodedKey);
const { payload } = await jwtVerify(token, enc, {
algorithms: ["HS256"],
});
return (payload.user as Record<string, any>) || null;
} catch (error) {
console.error("Gagal verifikasi session", error);
return null;
}
}
// wibu:0.2.82

View File

@@ -7,16 +7,43 @@ export async function decrypt({
token: string;
encodedKey: string;
}): Promise<Record<string, any> | null> {
if (!token || !encodedKey) {
console.error("Missing required parameters:", {
hasToken: !!token,
hasEncodedKey: !!encodedKey,
});
return null;
}
try {
const enc = new TextEncoder().encode(encodedKey);
const { payload } = await jwtVerify(token, enc, {
algorithms: ["HS256"],
});
return (payload.user as Record<string, any>) || null;
if (!payload || !payload.user) {
console.error("Invalid payload structure:", {
hasPayload: !!payload,
hasUser: payload ? !!payload.user : false,
});
return null;
}
// Logging untuk debug
// console.log("Decrypt successful:", {
// payloadExists: !!payload,
// userExists: !!payload.user,
// tokenPreview: token.substring(0, 10) + "...",
// });
return payload.user as Record<string, any>;
} catch (error) {
console.error("Gagal verifikasi session", error);
console.error("Token verification failed:", {
error,
tokenLength: token?.length,
errorName: error instanceof Error ? error.name : "Unknown error",
errorMessage: error instanceof Error ? error.message : String(error),
});
return null;
}
}
// wibu:0.2.82

View File

@@ -4,7 +4,7 @@ import backendLogger from "@/util/backendLogger";
import { NextResponse } from "next/server";
import _ from 'lodash';
export async function GET(request: Request, { komentarId }: { komentarId: string }) {
export async function GET(request: Request) {
const method = request.method;
if (method !== "GET") {
return NextResponse.json({
@@ -26,8 +26,6 @@ export async function GET(request: Request, { komentarId }: { komentarId: string
try {
let fixData;
if (!page) {
fixData = await prisma.forum_ReportKomentar.findMany({
@@ -35,7 +33,13 @@ export async function GET(request: Request, { komentarId }: { komentarId: string
createdAt: "desc"
},
where: {
forum_KomentarId: komentarId,
Forum_Komentar: {
isActive: true,
komentar: {
contains: search ? search : "",
mode: "insensitive",
},
},
},
select: {
id: true,
@@ -53,6 +57,7 @@ export async function GET(request: Request, { komentarId }: { komentarId: string
},
},
},
},
})
} else {
@@ -63,7 +68,13 @@ export async function GET(request: Request, { komentarId }: { komentarId: string
createdAt: "desc",
},
where: {
forum_KomentarId: komentarId,
Forum_Komentar: {
isActive: true,
komentar: {
contains: search ? search : "",
mode: "insensitive",
},
},
},
select: {
id: true,
@@ -85,7 +96,13 @@ export async function GET(request: Request, { komentarId }: { komentarId: string
})
const nCount = await prisma.forum_ReportKomentar.count({
where: {
forum_KomentarId: komentarId,
Forum_Komentar: {
isActive: true,
komentar: {
contains: search ? search : "",
mode: "insensitive",
},
},
}
})
@@ -94,7 +111,7 @@ export async function GET(request: Request, { komentarId }: { komentarId: string
nCount: _.ceil(nCount / takeData)
}
}
console.log("Ini fixData", fixData)
return NextResponse.json({
success: true,
message: "Success get data forum komentar",

View File

@@ -131,8 +131,8 @@ export async function GET(request: Request,
}
return NextResponse.json({
success: true,
data: fixData,
message: "Success get data forum posting"
message: "Success get data forum posting",
data: fixData
},
{ status: 200 }
)

View File

@@ -25,7 +25,6 @@ export async function GET(request: Request) {
if (!page) {
fixData = await prisma.forum_Posting.findMany({
orderBy: {
createdAt: "desc",
},

View File

@@ -3,42 +3,46 @@ import backendLogger from "@/util/backendLogger";
import { NextResponse } from "next/server";
export async function GET(request: Request) {
const method = request.method;
if (method !== "GET") {
return NextResponse.json({
success: false,
message: "Method not allowed",
if (request.method !== "GET") {
return NextResponse.json(
{
success: false,
message: "Method not allowed",
},
{ status: 405 }
);
}
try {
let fixData;
fixData = await prisma.voting.count({
where: {
Voting_Status: {
name: "Publish",
},
{ status: 405 }
)
}
try {
let fixData;
fixData = await prisma.voting.count({
where: {
Voting_Status: {
name: "Publish",
},
isArsip: true,
}
})
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 }
)
} finally {
await prisma.$disconnect();
}
}
isArsip: true,
},
});
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 }
);
} finally {
await prisma.$disconnect();
}
}

View File

@@ -1,20 +1,39 @@
import { decrypt } from "@/app/(auth)/_lib/decrypt";
import { cookies } from "next/headers";
import { NextRequest, NextResponse } from "next/server";
import { NextResponse } from "next/server";
export const dynamic = "force-dynamic";
export async function GET(request: NextRequest) {
const id = request.nextUrl.searchParams.get("id");
// const { searchParams } = new URL(request.url);
// const id = searchParams.get("id");
// const delToken = await prisma.userSession.delete({
// where: {
// userId: id as string,
// },
// });
export async function GET() {
const sessionKey = process.env.NEXT_PUBLIC_BASE_SESSION_KEY!; // Gunakan environment variable yang tidak diekspos ke client-side
if (!sessionKey) {
return NextResponse.json(
{ success: false, message: "Session key tidak ditemukan" },
{ status: 500 }
);
}
const del = cookies().delete(process.env.NEXT_PUBLIC_BASE_SESSION_KEY!);
return NextResponse.json(
{ success: true, message: "Logout Berhasil" },
{ status: 200 }
);
const cookieStore = cookies();
const sessionCookie = cookieStore.get(sessionKey);
if (!sessionCookie) {
return NextResponse.json(
{ success: false, message: "Session tidak ditemukan" },
{ status: 400 }
);
}
try {
cookieStore.delete(sessionKey);
return NextResponse.json(
{ success: true, message: "Logout berhasil" },
{ status: 200 }
);
} catch (error) {
console.error("Gagal menghapus cookie:", error);
return NextResponse.json(
{ success: false, message: "Gagal melakukan logout" },
{ status: 500 }
);
}
}

View File

@@ -38,7 +38,14 @@ export async function POST(req: Request) {
user: dataUser as any,
});
return NextResponse.json(
if (!token) {
return NextResponse.json(
{ success: false, message: "Gagal membuat session" },
{ status: 500 }
);
}
// Buat response dengan token dalam cookie
const response = NextResponse.json(
{
success: true,
message: "Berhasil Login",
@@ -47,6 +54,16 @@ export async function POST(req: Request) {
},
{ status: 200 }
);
// Set cookie dengan token yang sudah dipastikan tidak null
response.cookies.set(process.env.NEXT_PUBLIC_BASE_SESSION_KEY!, token, {
path: "/",
sameSite: "lax",
secure: process.env.NODE_ENV === "production",
maxAge: 30 * 24 * 60 * 60, // 30 hari dalam detik (1 bulan)
});
return response;
} catch (error) {
backendLogger.log("API Error or Server Error", error);
return NextResponse.json(

View File

@@ -21,13 +21,11 @@ export async function GET(request: Request) {
},
});
await prisma.$disconnect();
return NextResponse.json(
{ success: true, message: "Berhasil mendapatkan data", data: res },
{ status: 200 }
);
} catch (error) {
await prisma.$disconnect();
backendLogger.error("Error Get Master Bank >>", error);
return NextResponse.json(
{
@@ -37,5 +35,7 @@ export async function GET(request: Request) {
},
{ status: 500 }
);
} finally {
await prisma.$disconnect();
}
}

View File

@@ -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 (
<>
<AdminForum_TablePublish listPublish={listPublish as any} />
<AdminForum_TablePublish />
</>
);
}

View File

@@ -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 (
<>
<AdminForum_TableReportKomentar listData={listData} />
<AdminForum_TableReportKomentar />
</>
);
}

View File

@@ -1,21 +0,0 @@
import { RouterAdminDashboard } from "@/app/lib/router_hipmi/router_admin";
import { RouterHome } from "@/app/lib/router_hipmi/router_home";
import { funGetUserIdByToken } from "@/app_modules/_global/fun/get";
import { funGlobal_getUserById } from "@/app_modules/_global/fun/get/fun_get_user_by_id";
import { CheckCookies_UiView } from "@/app_modules/check_cookies";
import { redirect } from "next/navigation";
export default async function Page() {
// const userLoginId = await funGetUserIdByToken();
// const dataUser = await funGlobal_getUserById({ userId: userLoginId });
// if (dataUser?.masterUserRoleId === "1") {
// return redirect(RouterHome.main_home);
// }
// if (dataUser?.masterUserRoleId !== "1") {
// return redirect(RouterAdminDashboard.splash_admin);
// }
// return <CheckCookies_UiView />;
}