From c94da645f36ff40a03b4e11c70c84a008960e699 Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Tue, 27 Jan 2026 16:59:31 +0800 Subject: [PATCH] =?UTF-8?q?API=20=E2=80=93=20Donation=20(Admin=20&=20User)?= =?UTF-8?q?=20-=20src/app/api/mobile/admin/donation/[id]/disbursement/rout?= =?UTF-8?q?e.ts=20-=20src/app/api/mobile/donation/[id]/news/route.ts=20-?= =?UTF-8?q?=20src/app/api/mobile/donation/route.ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Donation Helper / Logic - src/lib/mobile/donation/ ### No Issue --- .../admin/donation/[id]/disbursement/route.ts | 81 +++++++++++++++---- .../api/mobile/donation/[id]/news/route.ts | 51 +++++++++--- src/app/api/mobile/donation/route.ts | 4 +- src/lib/mobile/donation/find-donatur-list.tsx | 25 ++++++ 4 files changed, 134 insertions(+), 27 deletions(-) create mode 100644 src/lib/mobile/donation/find-donatur-list.tsx diff --git a/src/app/api/mobile/admin/donation/[id]/disbursement/route.ts b/src/app/api/mobile/admin/donation/[id]/disbursement/route.ts index 26500868..620493b1 100644 --- a/src/app/api/mobile/admin/donation/[id]/disbursement/route.ts +++ b/src/app/api/mobile/admin/donation/[id]/disbursement/route.ts @@ -1,11 +1,22 @@ +import { funFindDonaturList } from "@/lib/mobile/donation/find-donatur-list"; +import { + sendNotificationMobileToManyUser, + sendNotificationMobileToOneUser, +} from "@/lib/mobile/notification/send-notification"; import prisma from "@/lib/prisma"; import { NextResponse } from "next/server"; +import { + NotificationMobileBodyType, + NotificationMobileTitleType, +} from "../../../../../../../../types/type-mobile-notification"; +import { routeUserMobile } from "@/lib/mobile/route-page-mobile"; export { POST, GET }; async function POST(request: Request, { params }: { params: { id: string } }) { const { id } = params; const { data } = await request.json(); + const { title, nominalCair, deskripsi, imageId, authorId } = data; try { const dataDonasi = await prisma.donasi.findUnique({ @@ -22,19 +33,19 @@ async function POST(request: Request, { params }: { params: { id: string } }) { return NextResponse.json( { success: false, - message: "Pencarian Donasi Gagal", - reason: "Pencarian Donasi Gagal", + message: "DataPencarian Donasi Gagal", + reason: "Data Pencarian Donasi Gagal", }, - { status: 400 } + { status: 400 }, ); const createPencairan = await prisma.donasi_PencairanDana.create({ data: { donasiId: id, - nominalCair: +data.nominalCair, - deskripsi: data.deskripsi, - title: data.title, - imageId: data.imageId, + nominalCair: +nominalCair, + deskripsi: deskripsi, + title: title, + imageId: imageId, }, }); @@ -45,11 +56,11 @@ async function POST(request: Request, { params }: { params: { id: string } }) { message: "Pencairan Dana Gagal", reason: "Pencairan Dana Gagal", }, - { status: 400 } + { status: 400 }, ); const hasilTotalPencairan = - Number(dataDonasi.totalPencairan) + Number(data.nominalCair); + Number(dataDonasi.totalPencairan) + Number(nominalCair); // const hasilAkumulasiPencairan = Number(dataDonasi.akumulasiPencairan) + 1; const countPencairan = await prisma.donasi_PencairanDana.count({ @@ -66,8 +77,47 @@ async function POST(request: Request, { params }: { params: { id: string } }) { akumulasiPencairan: countPencairan, totalPencairan: hasilTotalPencairan, }, + select: { + authorId: true, + title: true, + }, }); + // ================= START SEND NOTIFICATION ================= + await sendNotificationMobileToOneUser({ + recipientId: updateDonasi?.authorId!, + senderId: authorId, + payload: { + title: "Pencairan Dana Berhasil" as NotificationMobileTitleType, + body: `Telah dilaksanakan pencairan dana untuk ${updateDonasi?.title}` as NotificationMobileBodyType, + type: "announcement", + kategoriApp: "DONASI", + deepLink: routeUserMobile.donationDetailPublish({ + id: id, + }), + }, + }); + + const recipientIds = await funFindDonaturList(id); + + if (recipientIds.length > 0) { + await sendNotificationMobileToManyUser({ + recipientIds, + senderId: authorId, + payload: { + title: "Pencarian Dana" as NotificationMobileTitleType, + body: `Update pencarian dana pada ${updateDonasi?.title}` as NotificationMobileBodyType, + type: "announcement", + kategoriApp: "DONASI", + deepLink: routeUserMobile.donationDetailPublish({ + id: id, + }), + }, + }); + } + + // ================= END SEND NOTIFICATION ================= + if (!updateDonasi) return NextResponse.json( { @@ -75,7 +125,7 @@ async function POST(request: Request, { params }: { params: { id: string } }) { message: "Update Donasi Gagal", reason: "Update Donasi Gagal", }, - { status: 400 } + { status: 400 }, ); return NextResponse.json( @@ -84,7 +134,7 @@ async function POST(request: Request, { params }: { params: { id: string } }) { message: "Pencairan Dana Berhasil", // data: data, }, - { status: 200 } + { status: 200 }, ); } catch (error) { console.error("[ERROR]", error); @@ -94,7 +144,7 @@ async function POST(request: Request, { params }: { params: { id: string } }) { message: "Pencairan Dana Gagal", reason: (error as Error).message, }, - { status: 500 } + { status: 500 }, ); } } @@ -110,7 +160,6 @@ async function GET(request: Request, { params }: { params: { id: string } }) { console.log("[CATEGORY]", category); let fixData; try { - if (category === "get-all") { fixData = await prisma.donasi_PencairanDana.findMany({ take: page ? takeData : undefined, @@ -140,7 +189,7 @@ async function GET(request: Request, { params }: { params: { id: string } }) { message: "Category tidak ditemukan", reason: "Category tidak ditemukan", }, - { status: 400 } + { status: 400 }, ); } @@ -150,7 +199,7 @@ async function GET(request: Request, { params }: { params: { id: string } }) { message: "Success get data disbursement", data: fixData, }, - { status: 200 } + { status: 200 }, ); } catch (error) { console.error("[ERROR]", error); @@ -160,7 +209,7 @@ async function GET(request: Request, { params }: { params: { id: string } }) { message: "Gagal mendapatkan data disbursement", reason: (error as Error).message, }, - { status: 500 } + { status: 500 }, ); } } diff --git a/src/app/api/mobile/donation/[id]/news/route.ts b/src/app/api/mobile/donation/[id]/news/route.ts index 94f8b5d9..72ad3121 100644 --- a/src/app/api/mobile/donation/[id]/news/route.ts +++ b/src/app/api/mobile/donation/[id]/news/route.ts @@ -1,25 +1,39 @@ import { NextRequest, NextResponse } from "next/server"; import { prisma } from "@/lib"; import _ from "lodash"; +import { sendNotificationMobileToManyUser } from "@/lib/mobile/notification/send-notification"; +import { + NotificationMobileBodyType, + NotificationMobileTitleType, +} from "../../../../../../../types/type-mobile-notification"; +import { routeUserMobile } from "@/lib/mobile/route-page-mobile"; +import { funFindDonaturList } from "@/lib/mobile/donation/find-donatur-list"; export { POST, GET, PUT, DELETE }; async function POST( request: NextRequest, - { params }: { params: { id: string } } + { params }: { params: { id: string } }, ) { const { id } = params; const { data } = await request.json(); + const { title, deskripsi, imageId } = data; + const senderId = await prisma.donasi.findUnique({ + where: { id: id }, + select: { + authorId: true, + }, + }); try { if (data && data?.imageId) { const createWithFile = await prisma.donasi_Kabar.create({ data: { - title: data.title, - deskripsi: data.deskripsi, + title: title, + deskripsi: deskripsi, donasiId: id, - imageId: data.imageId, + imageId: imageId, }, }); @@ -28,8 +42,8 @@ async function POST( } else { const create = await prisma.donasi_Kabar.create({ data: { - title: data.title, - deskripsi: data.deskripsi, + title: title, + deskripsi: deskripsi, donasiId: id, }, }); @@ -38,6 +52,25 @@ async function POST( return NextResponse.json({ status: 400, message: "Gagal disimpan" }); } + const recipientIds = await funFindDonaturList(id); + + // SEND NOTIFICATION + if (recipientIds.length > 0) { + await sendNotificationMobileToManyUser({ + recipientIds, + senderId: senderId?.authorId!, + payload: { + title: "Berita terbaru" as NotificationMobileTitleType, + body: `Ada berita terupdate pada ${title}` as NotificationMobileBodyType, + type: "announcement", + kategoriApp: "DONASI", + deepLink: routeUserMobile.donationDetailPublish({ + id: id, + }), + }, + }); + } + return NextResponse.json({ status: 200, success: true, @@ -56,7 +89,7 @@ async function POST( async function GET( request: NextRequest, - { params }: { params: { id: string } } + { params }: { params: { id: string } }, ) { const { id } = params; const { searchParams } = new URL(request.url); @@ -178,7 +211,7 @@ async function PUT(request: Request, { params }: { params: { id: string } }) { async function DELETE( request: Request, - { params }: { params: { id: string } } + { params }: { params: { id: string } }, ) { const { id } = params; try { @@ -198,7 +231,7 @@ async function DELETE( headers: { Authorization: `Bearer ${process.env.WS_APIKEY}`, }, - } + }, ); if (!deleteImage) { diff --git a/src/app/api/mobile/donation/route.ts b/src/app/api/mobile/donation/route.ts index 4e7ece15..da4d9566 100644 --- a/src/app/api/mobile/donation/route.ts +++ b/src/app/api/mobile/donation/route.ts @@ -5,7 +5,7 @@ import { NextResponse } from "next/server"; import { NotificationMobileBodyType } from "../../../../../types/type-mobile-notification"; import { routeAdminMobile } from "@/lib/mobile/route-page-mobile"; -export { POST }; +export { POST, GET }; async function POST(request: Request) { const { data } = await request.json(); @@ -121,7 +121,7 @@ async function POST(request: Request) { } // GET ALL DATA DONASI -export async function GET(request: Request) { +async function GET(request: Request) { const { searchParams } = new URL(request.url); const category = searchParams.get("category"); const authorId = searchParams.get("authorId"); diff --git a/src/lib/mobile/donation/find-donatur-list.tsx b/src/lib/mobile/donation/find-donatur-list.tsx new file mode 100644 index 00000000..b352d5b5 --- /dev/null +++ b/src/lib/mobile/donation/find-donatur-list.tsx @@ -0,0 +1,25 @@ +import prisma from "@/lib/prisma"; + +export const funFindDonaturList = async (donasiId: string) => { + const finDonatur = await prisma.donasi_Invoice.findMany({ + where: { + donasiId: donasiId, + DonasiMaster_StatusInvoice: { + name: "Berhasil", + }, + }, + select: { + authorId: true, + }, + distinct: ["authorId"], // Ambil hanya authorId unik dari DB + }); + + // Filter null safety (jika diperlukan) + const recipientIds = finDonatur + .map((e) => e.authorId) + .filter((id): id is string => id !== null && id !== undefined); + + console.log("[FIND DONATUR UNIK]", recipientIds); + + return recipientIds; +};