From f4c7638d0cea1951764a29768e549da4f12556c1 Mon Sep 17 00:00:00 2001 From: nico Date: Mon, 10 Mar 2025 10:00:26 +0800 Subject: [PATCH 1/2] Fix Collaboration use Server to API --- .../admin/collaboration/[id]/report/route.ts | 57 +++ src/app/api/admin/collaboration/[id]/route.ts | 66 +++ .../status/{[name] => publish}/route.ts | 10 +- .../collaboration/status/reject/route.ts | 143 +++++++ .../admin/colab/detail/publish/[id]/page.tsx | 12 + .../dev/admin/colab/sub-menu/publish/page.tsx | 4 +- .../dev/admin/colab/sub-menu/reject/page.tsx | 4 +- .../investasi/detail/publish/[id]/page.tsx | 12 +- .../admin/colab/detail/detail_group.tsx | 11 + .../admin/colab/detail/detail_publish.tsx | 173 ++++++++ .../lib/api_fetch_admin_collaboration.ts | 48 ++- .../admin/colab/sub_menu/publish.tsx | 388 +++++++----------- .../admin/colab/sub_menu/publish.txt | 317 ++++++++++++++ .../admin/colab/sub_menu/reject.tsx | 278 +++++++------ .../admin/colab/sub_menu/reject.txt | 186 +++++++++ .../admin/investasi/detail/detail_publish.tsx | 8 +- .../admin/job/_view/view_table_review.tsx | 10 +- src/lib/router_admin/router_admin_colab.ts | 1 + src/lib/router_hipmi/router_admin.ts | 4 + src/middleware.ts | 1 + 20 files changed, 1333 insertions(+), 400 deletions(-) create mode 100644 src/app/api/admin/collaboration/[id]/report/route.ts create mode 100644 src/app/api/admin/collaboration/[id]/route.ts rename src/app/api/admin/collaboration/status/{[name] => publish}/route.ts (96%) create mode 100644 src/app/api/admin/collaboration/status/reject/route.ts create mode 100644 src/app/dev/admin/colab/detail/publish/[id]/page.tsx create mode 100644 src/app_modules/admin/colab/detail/detail_group.tsx create mode 100644 src/app_modules/admin/colab/detail/detail_publish.tsx create mode 100644 src/app_modules/admin/colab/sub_menu/publish.txt create mode 100644 src/app_modules/admin/colab/sub_menu/reject.txt diff --git a/src/app/api/admin/collaboration/[id]/report/route.ts b/src/app/api/admin/collaboration/[id]/report/route.ts new file mode 100644 index 00000000..9520aac0 --- /dev/null +++ b/src/app/api/admin/collaboration/[id]/report/route.ts @@ -0,0 +1,57 @@ +import { funGetUserIdByToken } from "@/app_modules/_global/fun/get"; +import backendLogger from "@/util/backendLogger"; +import { NextResponse } from "next/server"; +import prisma from "@/lib/prisma"; +import { revalidatePath } from "next/cache"; +import { RouterAdminColab } from "@/lib/router_admin/router_admin_colab"; + +export async function GET(req: Request, { params }: { params: { id: string, report: string } }) { + try { + const { id } = params + const userLoginId = await funGetUserIdByToken(); + const data = await prisma.projectCollaboration.update({ + where: { + id: params.id + }, + data: { + isActive: false, + isReject: true, + report: params.report + }, + select: { + userId: true, + } + }) + if (!data) return { status: 400, message: "Gagal update project" }; + + const updateReport = await prisma.projectCollaboration_Notifikasi.create({ + data: { + projectCollaborationId: params.id, + adminId: userLoginId as string, + userId: data.userId as any, + note: "Project Anda Telah Direport Admin", + }, + }); + + if (!updateReport) return { status: 400, message: "Gagal update notifikasi" }; + + revalidatePath(RouterAdminColab.table_publish); + + return NextResponse.json({ + success: true, + message: "Project berhasil direport", + data: updateReport, + }, + { status: 200 } + ) + } catch (error) { + backendLogger.error("Error get data collaboration report >>", error); + return NextResponse.json({ + success: false, + message: "Error get data collaboration report", + reason: (error as Error).message + }, + { status: 500 } + ) + } +} \ No newline at end of file diff --git a/src/app/api/admin/collaboration/[id]/route.ts b/src/app/api/admin/collaboration/[id]/route.ts new file mode 100644 index 00000000..3a912a16 --- /dev/null +++ b/src/app/api/admin/collaboration/[id]/route.ts @@ -0,0 +1,66 @@ +import prisma from "@/lib/prisma"; +import backendLogger from "@/util/backendLogger"; +import { NextResponse } from "next/server"; + +export async function GET(req: Request, { params }: { params: { id: string } }) { + try { + const { id } = params; + const data = await prisma.projectCollaboration.findUnique({ + where: { + id: id + }, + select: { + id: true, + isActive: true, + title: true, + lokasi: true, + purpose: true, + benefit: true, + createdAt: true, + Author: { + select: { + id: true, + username: true, + }, + }, + ProjectCollaborationMaster_Industri: true, + ProjectCollaboration_Partisipasi: { + where: { + User: { + active: true, + }, + }, + select: { + id: true, + User: { + select: { + id: true, + Profile: { + select: { + name: true, + }, + }, + }, + }, + }, + }, + }, + }); + return NextResponse.json({ + success: true, + message: "Success get collaboration", + data: data + }, + { status: 200 } + ) + } catch (error) { + backendLogger.error("Error get collaboration >>", error); + return NextResponse.json({ + success: false, + message: "Error get collaboration", + reason: (error as Error).message + }, + { status: 500 } + ) + } +} \ No newline at end of file diff --git a/src/app/api/admin/collaboration/status/[name]/route.ts b/src/app/api/admin/collaboration/status/publish/route.ts similarity index 96% rename from src/app/api/admin/collaboration/status/[name]/route.ts rename to src/app/api/admin/collaboration/status/publish/route.ts index e61ab5d6..3bf71a30 100644 --- a/src/app/api/admin/collaboration/status/[name]/route.ts +++ b/src/app/api/admin/collaboration/status/publish/route.ts @@ -3,20 +3,15 @@ import backendLogger from "@/util/backendLogger"; import _ from "lodash"; import { NextResponse } from "next/server"; -export async function GET(request: Request, { params }: - { params: { name: string } } -) { +export async function GET(request: Request) { - - const { name } = params; const { searchParams } = new URL(request.url); const page = searchParams.get("page"); const takeData = 10; const skipData = Number(page) * takeData - takeData; - + try { let fixData; - const fixStatus = _.startCase(name); if (!page) { fixData = await prisma.projectCollaboration.findMany({ @@ -30,6 +25,7 @@ export async function GET(request: Request, { params }: active: true, }, + }, select: { id: true, diff --git a/src/app/api/admin/collaboration/status/reject/route.ts b/src/app/api/admin/collaboration/status/reject/route.ts new file mode 100644 index 00000000..7d43e265 --- /dev/null +++ b/src/app/api/admin/collaboration/status/reject/route.ts @@ -0,0 +1,143 @@ +import { prisma } from "@/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 page = searchParams.get("page"); + const takeData = 10; + const skipData = Number(page) * takeData - takeData; + + try { + let fixData; + + + if (!page) { + fixData = await prisma.projectCollaboration.findMany({ + orderBy: { + createdAt: "desc", + }, + where: { + isActive: false, + isReject: true, + Author: { + active: true, + }, + + + }, + 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: false, + isReject: true, + Author: { + active: true, + }, + }, + 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: false, + isReject: true, + 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/dev/admin/colab/detail/publish/[id]/page.tsx b/src/app/dev/admin/colab/detail/publish/[id]/page.tsx new file mode 100644 index 00000000..aad0ff7a --- /dev/null +++ b/src/app/dev/admin/colab/detail/publish/[id]/page.tsx @@ -0,0 +1,12 @@ +import DetailPublish from '@/app_modules/admin/colab/detail/detail_publish'; +import React from 'react'; + +function Page() { + return ( + <> + + + ); +} + +export default Page; diff --git a/src/app/dev/admin/colab/sub-menu/publish/page.tsx b/src/app/dev/admin/colab/sub-menu/publish/page.tsx index 902b50c3..b177e938 100644 --- a/src/app/dev/admin/colab/sub-menu/publish/page.tsx +++ b/src/app/dev/admin/colab/sub-menu/publish/page.tsx @@ -2,11 +2,9 @@ import { AdminColab_TablePublish } from "@/app_modules/admin/colab"; import adminColab_getListAllPublish from "@/app_modules/admin/colab/fun/get/get_list_all_publish"; export default async function Page() { - const listData = await adminColab_getListAllPublish({ page: 1 }); - return ( <> - + ); } diff --git a/src/app/dev/admin/colab/sub-menu/reject/page.tsx b/src/app/dev/admin/colab/sub-menu/reject/page.tsx index 11e5c047..898b9f62 100644 --- a/src/app/dev/admin/colab/sub-menu/reject/page.tsx +++ b/src/app/dev/admin/colab/sub-menu/reject/page.tsx @@ -2,11 +2,11 @@ import { AdminColab_TableRejected } from "@/app_modules/admin/colab"; import adminColab_getListAllRejected from "@/app_modules/admin/colab/fun/get/get_list_all_reject"; export default async function Page() { - const listReject = await adminColab_getListAllRejected({page: 1}) + return ( <> - + ); } \ No newline at end of file diff --git a/src/app/dev/admin/investasi/detail/publish/[id]/page.tsx b/src/app/dev/admin/investasi/detail/publish/[id]/page.tsx index 7d8582cd..53c5ac52 100644 --- a/src/app/dev/admin/investasi/detail/publish/[id]/page.tsx +++ b/src/app/dev/admin/investasi/detail/publish/[id]/page.tsx @@ -6,13 +6,8 @@ import { } from "@/app_modules/admin/investasi/fun"; import getOneInvestasiById from "@/app_modules/investasi/fun/get_one_investasi_by_id"; -export default async function Page({ params }: { params: { id: string } }) { - const investasiId = params.id; - const statusTransaksi = await adminInvestasi_getStatusInvestasi(); - const dataTransaksi = await adminInvestasi_funGetAllTransaksiById({ - investasiId, - page: 1, - }); +export default async function Page() { + // export default async function Page({ params }: { params: { id: string } }) { // const investasiId = params.id; // const dataInvestasi = await getOneInvestasiById(investasiId); @@ -24,8 +19,7 @@ export default async function Page({ params }: { params: { id: string } }) { return ( <> - ); diff --git a/src/app_modules/admin/colab/detail/detail_group.tsx b/src/app_modules/admin/colab/detail/detail_group.tsx new file mode 100644 index 00000000..320640de --- /dev/null +++ b/src/app_modules/admin/colab/detail/detail_group.tsx @@ -0,0 +1,11 @@ +import React from 'react'; + +function DetailGroup() { + return ( +
+ DetailGroup +
+ ); +} + +export default DetailGroup; diff --git a/src/app_modules/admin/colab/detail/detail_publish.tsx b/src/app_modules/admin/colab/detail/detail_publish.tsx new file mode 100644 index 00000000..e738bbf9 --- /dev/null +++ b/src/app_modules/admin/colab/detail/detail_publish.tsx @@ -0,0 +1,173 @@ +'use client'; +import React, { useState } from 'react'; +import AdminGlobal_ComponentBackButton from '../../_admin_global/back_button'; +import { Button, Flex, Grid, Group, Modal, Paper, Stack, Text, Textarea, Title } from '@mantine/core'; +import { useParams } from 'next/navigation'; +import { MODEL_COLLABORATION } from '@/app_modules/colab/model/interface'; +import { useShallowEffect } from '@mantine/hooks'; +import { clientLogger } from '@/util/clientLogger'; +import { apiGetAdminCollaborationById } from '../lib/api_fetch_admin_collaboration'; +import { AdminColor } from '@/app_modules/_global/color/color_pallet'; +import CustomSkeleton from '@/app_modules/components/CustomSkeleton'; +import { ComponentGlobal_NotifikasiPeringatan } from '@/app_modules/_global/notif_global'; +import { IconCheck } from '@tabler/icons-react'; + +function DetailPublish() { + const params = useParams<{ id: string }>(); + const [data, setData] = useState(null); + const [loading, setLoading] = useState(false); + const [openReject, setOpenReject] = useState(false); + + useShallowEffect(() => { + loadInitialData(); + }, []) + + const loadInitialData = async () => { + try { + const response = await apiGetAdminCollaborationById({ + id: params.id, + }) + + if (response?.success && response?.data) { + setData(response.data); + } + + } catch (error) { + clientLogger.error("Invalid data format recieved:", error); + setData(null); + } + } + + async function onReject() { + try { + const response = await apiGetAdminCollaborationById({ + id: params.id, + }) + + if (response?.success && response?.data) { + setOpenReject(true) + setData(response.data); + setLoading(false) + } + } catch (error) { + ComponentGlobal_NotifikasiPeringatan("Gagal Load"); + clientLogger.error("Invalid data format recieved:", error); + setData(null); + } + } + + return ( + <> + + + + + + {!data ? () : ( + + Detail Publish + + + + Username: + + + {data?.Author?.username} + + + + + Title: + + + @{data?.title} + + + + + Industri: + + + + {data?.ProjectCollaborationMaster_Industri.name} + + + + + Jumlah Partisipan: + + + {data?.ProjectCollaboration_Partisipasi.length} + + + + + Lokasi: + + + {data?.lokasi} + + + + + Tujuan Proyek: + + + {data?.purpose} + + + + + Keuntungan: + + + {data?.benefit} + + + + + )} + + + {/* Reject Project */} + setOpenReject(false)} + centered + withCloseButton={false} + size={"lg"} + > + + + + Apakah anda yakin ingin mereport project{" "} + + {data?.title} + + ? + {" "} +