From 062f78265e0c19c9e146f8d0a8f037d7603bb0fd Mon Sep 17 00:00:00 2001 From: amel Date: Wed, 20 Nov 2024 16:23:37 +0800 Subject: [PATCH] upd: web push Deskripsi: - pengaplikasian web push pada pengumuman - pengaplikasian web push pada diskusi divisi No Issues --- prisma/schema.prisma | 4 +- src/app/api/announcement/route.ts | 43 ++++++++++++++++++++-- src/app/api/discussion/route.ts | 49 +++++++++++++++++++++++-- src/module/_global/fun/send_web_push.ts | 26 +++++++++++++ src/module/_global/index.ts | 2 + 5 files changed, 115 insertions(+), 9 deletions(-) create mode 100644 src/module/_global/fun/send_web_push.ts diff --git a/prisma/schema.prisma b/prisma/schema.prisma index aa9eed7..a45f6eb 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -124,7 +124,7 @@ model User { DivisionCalendarMember DivisionCalendarMember[] Notifications Notifications[] @relation("UserToUser") Notifications2 Notifications[] @relation("UserFromUser") - Subscribe Subscribe[] + Subscribe Subscribe? } model UserLog { @@ -518,4 +518,4 @@ model Subscribe { subscription String @db.Text createdAt DateTime? @default(now()) updatedAt DateTime? @updatedAt -} \ No newline at end of file +} diff --git a/src/app/api/announcement/route.ts b/src/app/api/announcement/route.ts index f3f8918..814390e 100644 --- a/src/app/api/announcement/route.ts +++ b/src/app/api/announcement/route.ts @@ -1,4 +1,4 @@ -import { prisma } from "@/module/_global"; +import { funSendWebPush, prisma } from "@/module/_global"; import { funGetUserByCookies } from "@/module/auth"; import _ from "lodash"; import moment from "moment"; @@ -160,14 +160,25 @@ export async function POST(request: Request) { } }, select: { - idUser: true + idUser: true, + User: { + select: { + Subscribe: { + select: { + subscription: true + } + } + } + } } }) - + // mengirim notifikasi + // datanotif untuk realtime notifikasi + // datapush untuk web push notifikasi ketika aplikasi tidak aktif const dataNotif = memberNotif.map((v: any) => ({ - ..._.omit(v, ["idUser"]), + ..._.omit(v, ["idUser", "User", "Subscribe"]), idUserTo: v.idUser, idUserFrom: userId, category: 'announcement', @@ -176,15 +187,30 @@ export async function POST(request: Request) { desc: 'Anda memiliki pengumuman baru. Silahkan periksa detailnya.' })) + const dataPush = memberNotif.map((v: any) => ({ + ..._.omit(v, ["idUser", "User", "Subscribe"]), + idUser: v.idUser, + subscription: v.User.Subscribe?.subscription, + })) + if (userRoleLogin != "supadmin") { const perbekel = await prisma.user.findFirst({ where: { isActive: true, idUserRole: "supadmin", idVillage: user.idVillage + }, + select: { + id: true, + Subscribe: { + select: { + subscription: true + } + } } }) + dataNotif.push({ idUserTo: perbekel?.id, idUserFrom: userId, @@ -193,8 +219,17 @@ export async function POST(request: Request) { title: 'Pengumuman Baru', desc: 'Anda memiliki pengumuman baru. Silahkan periksa detailnya.' }) + + dataPush.push({ + idUser: perbekel?.id, + subscription: perbekel?.Subscribe?.subscription + }) } + + const pushNotif = dataPush.filter((item) => item.subscription != undefined) + + const sendWebPush = await funSendWebPush({ sub: pushNotif, message: { title: 'Pengumuman Baru', body: 'Anda memiliki pengumuman baru. Silahkan periksa detailnya.' } }) const insertNotif = await prisma.notifications.createMany({ data: dataNotif }) diff --git a/src/app/api/discussion/route.ts b/src/app/api/discussion/route.ts index 20546dc..c1a4660 100644 --- a/src/app/api/discussion/route.ts +++ b/src/app/api/discussion/route.ts @@ -1,4 +1,4 @@ -import { prisma } from "@/module/_global"; +import { funSendWebPush, prisma } from "@/module/_global"; import { funGetUserByCookies } from "@/module/auth"; import { createLogUser } from "@/module/user"; import _ from "lodash"; @@ -134,15 +134,23 @@ export async function POST(request: Request) { select: { User: { select: { - id: true + id: true, + Subscribe: { + select: { + subscription: true + } + } } } } }) + // mengirim notifikasi + // datanotif untuk realtime notifikasi + // datapush untuk web push notifikasi ketika aplikasi tidak aktif const dataNotif = memberDivision.map((v: any) => ({ - ..._.omit(v, ["User"]), + ..._.omit(v, ["User", "Subscribe"]), idUserTo: v.User.id, idUserFrom: String(user.id), category: 'division/' + idDivision + '/discussion', @@ -151,12 +159,26 @@ export async function POST(request: Request) { desc: 'Terdapat diskusi baru. Silahkan periksa detailnya.' })) + const dataPush = memberDivision.map((v: any) => ({ + ..._.omit(v, ["User", "Subscribe"]), + idUser: v.User.id, + subscription: v.User.Subscribe?.subscription, + })) + if (userRoleLogin != "supadmin") { const perbekel = await prisma.user.findFirst({ where: { isActive: true, idUserRole: "supadmin", idVillage: user.idVillage + }, + select: { + id: true, + Subscribe: { + select: { + subscription: true + } + } } }) @@ -168,6 +190,11 @@ export async function POST(request: Request) { title: 'Diskusi Baru', desc: 'Terdapat diskusi baru. Silahkan periksa detailnya.' }) + + dataPush.push({ + idUser: perbekel?.id, + subscription: perbekel?.Subscribe?.subscription + }) } if (userRoleLogin != "cosupadmin") { @@ -176,6 +203,14 @@ export async function POST(request: Request) { isActive: true, idUserRole: "cosupadmin", idGroup: user.idGroup + }, + select: { + id: true, + Subscribe: { + select: { + subscription: true + } + } } }) @@ -187,8 +222,16 @@ export async function POST(request: Request) { title: 'Diskusi Baru', desc: 'Terdapat diskusi baru. Silahkan periksa detailnya.' }) + + dataPush.push({ + idUser: ketuaGrup?.id, + subscription: ketuaGrup?.Subscribe?.subscription + }) } + const pushNotif = dataPush.filter((item) => item.subscription != undefined) + + const sendWebPush = await funSendWebPush({ sub: pushNotif, message: { body: 'Terdapat diskusi baru. Silahkan periksa detailnya.', title: 'Diskusi Baru' } }) const insertNotif = await prisma.notifications.createMany({ data: dataNotif }) diff --git a/src/module/_global/fun/send_web_push.ts b/src/module/_global/fun/send_web_push.ts new file mode 100644 index 0000000..c43a40a --- /dev/null +++ b/src/module/_global/fun/send_web_push.ts @@ -0,0 +1,26 @@ +import { WibuServerPush } from "wibu-pkg"; + +export async function funSendWebPush({ sub, message }: { sub: { idUser: string, subscription: string }[], message: { body: string, title: string } }) { + try { + const subs: PushSubscription[] = sub.map((v) => JSON.parse(v.subscription)) as PushSubscription[] + + const kirim = await WibuServerPush.sendMany({ + subscriptions: subs as any, + data: { + body: message.body, + title: message.title, + link: "/home?cat=notification", + variant: "notification" + } + }) + + if (kirim) { + return { success: true, message: "Berhasil mengirim notifikasi" } + } + + return { success: false, message: "Gagal mengirim notifikasi" } + } catch (error) { + console.error("Send web push notification error", error); + return { success: false, message: "Gagal mengirim notifikasi" } + } +} \ No newline at end of file diff --git a/src/module/_global/index.ts b/src/module/_global/index.ts index d9ee900..bedf570 100644 --- a/src/module/_global/index.ts +++ b/src/module/_global/index.ts @@ -26,6 +26,7 @@ import { ScrollProvider } from "./components/scroll_provider"; import SkeletonUser from "./components/skeleton_user"; import SkeletonList from "./components/skeleton_list"; import { funViewDir } from "./fun/view_dir"; +import { funSendWebPush } from "./fun/send_web_push"; export { WARNA }; export { LayoutLogin }; @@ -61,3 +62,4 @@ export { SkeletonUser } export { SkeletonList } export { keyWibu } export { funViewDir } +export { funSendWebPush }