API – Donation (Admin & User)

- src/app/api/mobile/admin/donation/[id]/route.ts
- src/app/api/mobile/admin/donation/[id]/invoice/route.ts
- src/app/api/mobile/donation/route.ts
- src/app/api/mobile/donation/[id]/invoice/route.ts

Routing Helper
- src/lib/mobile/route-page-mobile.ts

### No Issue
This commit is contained in:
2026-01-23 17:04:43 +08:00
parent 048b7b6094
commit 8ccf1f2b6e
5 changed files with 197 additions and 12 deletions

View File

@@ -1,6 +1,9 @@
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
import { prisma } from "@/lib"; import { prisma } from "@/lib";
import _ from "lodash"; import _ from "lodash";
import { sendNotificationMobileToOneUser } from "@/lib/mobile/notification/send-notification";
import { NotificationMobileBodyType, NotificationMobileTitleType } from "../../../../../../../../types/type-mobile-notification";
import { routeUserMobile } from "@/lib/mobile/route-page-mobile";
export { GET, PUT }; export { GET, PUT };
@@ -50,6 +53,7 @@ async function GET(req: Request, { params }: { params: { id: string } }) {
interface DataType { interface DataType {
donationId: string; donationId: string;
nominal: number; nominal: number;
senderId: string;
} }
async function PUT(req: Request, { params }: { params: { id: string } }) { async function PUT(req: Request, { params }: { params: { id: string } }) {
@@ -111,6 +115,9 @@ async function PUT(req: Request, { params }: { params: { id: string } }) {
data: { data: {
donasiMaster_StatusInvoiceId: checkStatusTransaksi.id, donasiMaster_StatusInvoiceId: checkStatusTransaksi.id,
}, },
select: {
authorId: true,
},
}); });
if (!updateInvoice) { if (!updateInvoice) {
@@ -154,6 +161,38 @@ async function PUT(req: Request, { params }: { params: { id: string } }) {
); );
} }
// SEND NOTIFICATION: to donatur
await sendNotificationMobileToOneUser({
recipientId: updateInvoice?.authorId as string,
senderId: data?.senderId || "",
payload: {
title: "Transaksi Berhasil" as NotificationMobileTitleType,
body: `Selamat anda menjadi donatur pada ${updateDonasi?.title}` as NotificationMobileBodyType,
type: "announcement",
kategoriApp: "DONASI",
deepLink: routeUserMobile.donationTransaction,
},
});
// SEND NOTIFICATION: to creator
await sendNotificationMobileToOneUser({
recipientId: updateDonasi?.authorId as any,
senderId: data?.senderId || "",
payload: {
title: "Ada Donatur Baru !" as NotificationMobileTitleType,
body: `Cek daftar donatur pada ${updateDonasi?.title}` as NotificationMobileBodyType,
type: "announcement",
kategoriApp: "DONASI",
deepLink: routeUserMobile.donationDetailPublish({
id: updateDonasi?.id as string,
}),
},
});
return NextResponse.json( return NextResponse.json(
{ {
success: true, success: true,

View File

@@ -1,6 +1,15 @@
import {
sendNotificationMobileToManyUser,
sendNotificationMobileToOneUser,
} from "@/lib/mobile/notification/send-notification";
import { routeUserMobile } from "@/lib/mobile/route-page-mobile";
import prisma from "@/lib/prisma"; import prisma from "@/lib/prisma";
import _ from "lodash"; import _ from "lodash";
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
import {
NotificationMobileBodyType,
NotificationMobileTitleType,
} from "../../../../../../../types/type-mobile-notification";
export { GET, PUT }; export { GET, PUT };
@@ -48,7 +57,7 @@ async function GET(request: Request, { params }: { params: { id: string } }) {
DonasiMaster_StatusInvoice: { DonasiMaster_StatusInvoice: {
name: "Berhasil", name: "Berhasil",
}, },
}, },
}); });
return NextResponse.json( return NextResponse.json(
@@ -60,7 +69,7 @@ async function GET(request: Request, { params }: { params: { id: string } }) {
donatur: successInvoice, donatur: successInvoice,
}, },
}, },
{ status: 200 } { status: 200 },
); );
} catch (error) { } catch (error) {
return NextResponse.json( return NextResponse.json(
@@ -69,7 +78,7 @@ async function GET(request: Request, { params }: { params: { id: string } }) {
message: "Error get detail Investasi", message: "Error get detail Investasi",
reason: (error as Error).message, reason: (error as Error).message,
}, },
{ status: 500 } { status: 500 },
); );
} }
} }
@@ -77,6 +86,10 @@ async function GET(request: Request, { params }: { params: { id: string } }) {
async function PUT(request: Request, { params }: { params: { id: string } }) { async function PUT(request: Request, { params }: { params: { id: string } }) {
const { id } = params; const { id } = params;
const { data } = await request.json(); const { data } = await request.json();
const { catatan, senderId } = data;
console.log("[PUT CATATAN]", catatan);
console.log("[PUT SENDER ID]", senderId);
const { searchParams } = new URL(request.url); const { searchParams } = new URL(request.url);
const status = searchParams.get("status"); const status = searchParams.get("status");
const fixStatus = _.startCase(status as string); const fixStatus = _.startCase(status as string);
@@ -102,7 +115,7 @@ async function PUT(request: Request, { params }: { params: { id: string } }) {
message: "Error update data event", message: "Error update data event",
reason: "Status not found", reason: "Status not found",
}, },
{ status: 500 } { status: 500 },
); );
if (fixStatus === "Reject") { if (fixStatus === "Reject") {
@@ -111,11 +124,24 @@ async function PUT(request: Request, { params }: { params: { id: string } }) {
id: id, id: id,
}, },
data: { data: {
catatan: data, catatan: catatan,
donasiMaster_StatusDonasiId: checkStatus.id, donasiMaster_StatusDonasiId: checkStatus.id,
}, },
}); });
// SEND NOTIFICATION
await sendNotificationMobileToOneUser({
recipientId: updateData.authorId as any,
senderId: senderId,
payload: {
title: "Pengajuan Review Ditolak",
body: "Mohon perbaiki data sesuai catatan penolakan !",
type: "announcement",
kategoriApp: "DONASI",
deepLink: routeUserMobile.donationByStatus({ status: "reject" }),
},
});
fixData = updateData; fixData = updateData;
} else if (fixStatus === "Publish") { } else if (fixStatus === "Publish") {
const updateData = await prisma.donasi.update({ const updateData = await prisma.donasi.update({
@@ -128,6 +154,39 @@ async function PUT(request: Request, { params }: { params: { id: string } }) {
}, },
}); });
// SEND NOTIFICAtION
await sendNotificationMobileToOneUser({
recipientId: updateData.authorId as any,
senderId: senderId,
payload: {
title: "Review Selesai",
body: `Donasi kamu telah dipublikasikan ! ${updateData.title}` as NotificationMobileBodyType,
type: "announcement",
kategoriApp: "DONASI",
deepLink: routeUserMobile.donationByStatus({ status: "publish" }),
},
});
const allUsers = await prisma.user.findMany({
where: {
NOT: { id: updateData.authorId as any },
active: true,
},
select: { id: true },
});
await sendNotificationMobileToManyUser({
recipientIds: allUsers.map((user) => user.id),
senderId: senderId,
payload: {
title: "Ayo Cek Donasi Terbaru" as NotificationMobileTitleType,
body: `${updateData.title}` as NotificationMobileBodyType,
type: "announcement",
kategoriApp: "DONASI",
deepLink: routeUserMobile.donationDetailPublish({ id: id }),
},
});
fixData = updateData; fixData = updateData;
} }
@@ -137,7 +196,7 @@ async function PUT(request: Request, { params }: { params: { id: string } }) {
message: "Data Donasi Berhasil Diambil", message: "Data Donasi Berhasil Diambil",
data: data, data: data,
}, },
{ status: 200 } { status: 200 },
); );
} catch (error) { } catch (error) {
return NextResponse.json( return NextResponse.json(
@@ -146,7 +205,7 @@ async function PUT(request: Request, { params }: { params: { id: string } }) {
message: "Error get detail Investasi", message: "Error get detail Investasi",
reason: (error as Error).message, reason: (error as Error).message,
}, },
{ status: 500 } { status: 500 },
); );
} }
} }

View File

@@ -1,6 +1,12 @@
import _ from "lodash"; import _ from "lodash";
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
import prisma from "@/lib/prisma"; import prisma from "@/lib/prisma";
import { sendNotificationMobileToManyUser } from "@/lib/mobile/notification/send-notification";
import {
NotificationMobileBodyType,
NotificationMobileTitleType,
} from "../../../../../../../types/type-mobile-notification";
import { routeAdminMobile } from "@/lib/mobile/route-page-mobile";
export { POST, GET, PUT }; export { POST, GET, PUT };
@@ -33,6 +39,14 @@ async function POST(request: Request, { params }: { params: { id: string } }) {
}, },
}); });
if (!create) {
return NextResponse.json({
status: 500,
success: false,
message: "Gagal membuat invoice",
});
}
return NextResponse.json({ return NextResponse.json({
status: 201, status: 201,
success: true, success: true,
@@ -48,7 +62,7 @@ async function POST(request: Request, { params }: { params: { id: string } }) {
reason: (error as Error).message, reason: (error as Error).message,
}); });
} }
} }
async function GET(request: Request, { params }: { params: { id: string } }) { async function GET(request: Request, { params }: { params: { id: string } }) {
try { try {
@@ -65,7 +79,7 @@ async function GET(request: Request, { params }: { params: { id: string } }) {
createdAt: true, createdAt: true,
donasiMaster_BankId: true, donasiMaster_BankId: true,
donasiMaster_StatusInvoiceId: true, donasiMaster_StatusInvoiceId: true,
MasterBank: true, MasterBank: true,
Donasi: { Donasi: {
select: { select: {
id: true, id: true,
@@ -139,7 +153,7 @@ async function PUT(request: Request, { params }: { params: { id: string } }) {
}); });
} }
const update = await prisma.donasi_Invoice.update({ const updated = await prisma.donasi_Invoice.update({
where: { where: {
id: id, id: id,
}, },
@@ -164,7 +178,40 @@ async function PUT(request: Request, { params }: { params: { id: string } }) {
}, },
}); });
console.log("[UPDATE INVOICE]", update); if (!updated) {
return NextResponse.json({
status: 500,
success: false,
message: "Gagal memperbarui data",
});
}
const findUsers = await prisma.user.findMany({
where: {
masterUserRoleId: "2",
active: true,
NOT: { id: updated?.Donasi?.authorId as string },
},
select: { id: true },
});
// SEND NOTIFICATION
await sendNotificationMobileToManyUser({
recipientIds: findUsers.map((user) => user.id),
senderId: data.authorId,
payload: {
title: "Ada Donasi Baru !" as NotificationMobileTitleType,
body: `Cek data investor pada ${updated?.Donasi?.title}` as NotificationMobileBodyType,
type: "announcement",
kategoriApp: "DONASI",
deepLink: routeAdminMobile.donationDetailPublish({
id: updated?.Donasi?.id as string,
status: "publish",
}),
},
});
console.log("[UPDATE INVOICE]", updated);
return NextResponse.json({ return NextResponse.json({
status: 200, status: 200,

View File

@@ -1,6 +1,9 @@
import { sendNotificationMobileToManyUser } from "@/lib/mobile/notification/send-notification";
import prisma from "@/lib/prisma"; import prisma from "@/lib/prisma";
import _ from "lodash"; import _ from "lodash";
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
import { NotificationMobileBodyType } from "../../../../../types/type-mobile-notification";
import { routeAdminMobile } from "@/lib/mobile/route-page-mobile";
export { POST }; export { POST };
@@ -49,6 +52,26 @@ async function POST(request: Request) {
console.log("[DATA DONASI]", dataDonasi); console.log("[DATA DONASI]", dataDonasi);
const adminUsers = await prisma.user.findMany({
where: { masterUserRoleId: "2", NOT: { id: data.authorId } },
select: { id: true },
});
// SEND NOTIFICATION
await sendNotificationMobileToManyUser({
recipientIds: adminUsers.map((user) => user.id),
senderId: data.authorId,
payload: {
title: "Pengajuan Review Baru",
body: data.title as NotificationMobileBodyType,
type: "announcement",
deepLink: routeAdminMobile.donationByStatus({ status: "review" }),
kategoriApp: "DONASI",
},
});
if (!dataDonasi) if (!dataDonasi)
return NextResponse.json({ return NextResponse.json({
status: 400, status: 400,

View File

@@ -29,8 +29,19 @@ const routeAdminMobile = {
id: string; id: string;
status: StatusApp; status: StatusApp;
}) => `/admin/investment/${id}/${status}`, }) => `/admin/investment/${id}/${status}`,
// DONATION
donationByStatus: ({ status }: { status: StatusApp }) => `/admin/donation/${status}/status`,
donationDetailPublish: ({
id,
status,
}: {
id: string;
status: StatusApp;
}) => `/admin/donation/${id}/${status}`,
}; };
// ================ ROUTER USER =================
const routeUserMobile = { const routeUserMobile = {
home: `/(user)/home`, home: `/(user)/home`,
// JOB // JOB
@@ -60,5 +71,11 @@ const routeUserMobile = {
investmentPortofolioByStatus: ({ status }: { status?: StatusApp }) => investmentPortofolioByStatus: ({ status }: { status?: StatusApp }) =>
`/investment/(tabs)/portofolio?status=${status}`, `/investment/(tabs)/portofolio?status=${status}`,
investmentDetailPublish: ({ id }: { id: string }) => `/investment/${id}`, investmentDetailPublish: ({ id }: { id: string }) => `/investment/${id}`,
investmentTransaction: `/investment/(tabs)/transaction` investmentTransaction: `/investment/(tabs)/transaction`,
// DONATION
donationByStatus: ({ status }: { status?: StatusApp }) =>
`/donation/(tabs)/status?status=${status}`,
donationDetailPublish: ({ id }: { id: string }) => `/donation/${id}`,
donationTransaction: `/donation/(tabs)/my-donation`,
}; };