Fix API mobile notifikasi untuk job #39

Merged
bagasbanuna merged 1 commits from mobile-notification/7-jan-26 into staging 2026-01-08 15:26:21 +08:00
5 changed files with 67 additions and 10 deletions

View File

@@ -1,6 +1,8 @@
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
import prisma from "@/lib/prisma"; import prisma from "@/lib/prisma";
import _ from "lodash"; import _ from "lodash";
import { sendNotificationMobileToOneUser } from "@/lib/mobile/notification/send-notification";
import { routeUserMobile } from "@/lib/mobile/route-page-mobile";
export { GET, PUT }; export { GET, PUT };
@@ -54,10 +56,14 @@ 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;
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);
let fixData; let fixData;
try { try {
const checkStatus = await prisma.masterStatus.findFirst({ const checkStatus = await prisma.masterStatus.findFirst({
@@ -83,7 +89,7 @@ async function PUT(request: Request, { params }: { params: { id: string } }) {
}, },
data: { data: {
masterStatusId: checkStatus.id, masterStatusId: checkStatus.id,
catatan: data, catatan: catatan,
}, },
select: { select: {
id: true, id: true,
@@ -97,6 +103,18 @@ async function PUT(request: Request, { params }: { params: { id: string } }) {
}, },
}); });
await sendNotificationMobileToOneUser({
recipientId: updt.authorId as any,
senderId: senderId,
payload: {
title: "Pengajuan Review",
body: "Pengajuan data anda telah di tolak !",
type: "announcement",
kategoriApp: "JOB",
deepLink: routeUserMobile.jobByStatus({ status: "reject" }),
},
});
fixData = updt; fixData = updt;
} else if (fixStatus === "Publish") { } else if (fixStatus === "Publish") {
const updt = await prisma.job.update({ const updt = await prisma.job.update({
@@ -118,6 +136,18 @@ async function PUT(request: Request, { params }: { params: { id: string } }) {
}, },
}); });
await sendNotificationMobileToOneUser({
recipientId: updt.authorId as any,
senderId: senderId,
payload: {
title: "Pengajuan Review",
body: "Selamat data anda telah terpublikasi",
type: "announcement",
kategoriApp: "JOB",
deepLink: routeUserMobile.jobByStatus({ status: "publish" }),
},
});
fixData = updt; fixData = updt;
} }

View File

@@ -30,8 +30,8 @@ async function POST(request: Request) {
recipientIds: adminUsers.map((user) => user.id), recipientIds: adminUsers.map((user) => user.id),
senderId: data.authorId, senderId: data.authorId,
payload: { payload: {
title: "Job: Pengajuan Review", title: "Pengajuan Review",
body: data.title, body: "Terdapat pengajuan baru yang perlu direview",
type: "announcement", type: "announcement",
deepLink: routeAdminMobile.jobByStatus({ status: "review" }), deepLink: routeAdminMobile.jobByStatus({ status: "review" }),
kategoriApp: "JOB", kategoriApp: "JOB",

View File

@@ -2,6 +2,7 @@
import { adminMessaging } from "@/lib/firebase-admin"; import { adminMessaging } from "@/lib/firebase-admin";
import prisma from "@/lib/prisma"; import prisma from "@/lib/prisma";
import { NotificationMobilePayload } from "../../../../types/type-mobile-notification"; import { NotificationMobilePayload } from "../../../../types/type-mobile-notification";
import _ from "lodash";
/** /**
* Kirim notifikasi ke satu user (semua device aktifnya) * Kirim notifikasi ke satu user (semua device aktifnya)
@@ -20,15 +21,20 @@ export async function sendNotificationMobileToOneUser({
payload: NotificationMobilePayload; payload: NotificationMobilePayload;
}) { }) {
try { try {
const kategoriToNormalCase = _.lowerCase(payload.kategoriApp);
const titleFix = `${_.startCase(kategoriToNormalCase)}: ${payload.title}`;
console.log("titleFix", titleFix);
// 1. Simpan notifikasi ke DB // 1. Simpan notifikasi ke DB
const notification = await prisma.notifikasi.create({ const notification = await prisma.notifikasi.create({
data: { data: {
title: payload.title, title: titleFix,
pesan: payload.body, pesan: payload.body,
deepLink: payload.deepLink, deepLink: payload.deepLink,
kategoriApp: payload.kategoriApp, kategoriApp: payload.kategoriApp,
recipientId: recipientId, recipientId: recipientId,
senderId: senderId, senderId: senderId,
type: payload.type.trim(),
}, },
}); });
@@ -51,7 +57,7 @@ export async function sendNotificationMobileToOneUser({
await adminMessaging.send({ await adminMessaging.send({
token, token,
notification: { notification: {
title: payload.title, title: titleFix,
body: payload.body, body: payload.body,
}, },
data: { data: {

View File

@@ -5,10 +5,15 @@ type StatusApp = "review" | "draft" | "reject" | "publish";
const routeAdminMobile = { const routeAdminMobile = {
userAccess: ({ id }: { id: string }) => `/admin/user-access/${id}`, userAccess: ({ id }: { id: string }) => `/admin/user-access/${id}`,
// JOB // JOB
jobDetail: ({ id, status }: { id: string; status: StatusApp }) => `/admin/job/${id}/${status}`, jobDetail: ({ id, status }: { id: string; status: StatusApp }) =>
jobByStatus: ({ status }: { status: StatusApp }) => `/admin/job/${status}/status`, `/admin/job/${id}/${status}`,
jobByStatus: ({ status }: { status: StatusApp }) =>
`/admin/job/${status}/status`,
}; };
const routeUserMobile = { const routeUserMobile = {
home: `/(user)/home`, home: `/(user)/home`,
// JOB
jobByStatus: ({ status }: { status?: StatusApp }) =>
`/job/(tabs)/status?status=${status}`,
}; };

View File

@@ -1,14 +1,30 @@
// Jika semua custom type diawali "custom_"
export type NotificationMobilePayload = { export type NotificationMobilePayload = {
title: string; title: NotificationMobileTitleType;
body: string; body: NotificationMobileBodyType;
userLoginId?: string; userLoginId?: string;
appId?: string; appId?: string;
status?: string; status?: string;
type: "announcement" | "trigger"; type: "announcement" | "trigger";
deepLink: string; deepLink: string;
kategoriApp: TypeNotificationCategoryApp kategoriApp: TypeNotificationCategoryApp;
}; };
export type NotificationMobileTitleType =
| (string & { __type: "NotificationMobileTitleType" })
| "Pengajuan Review"
| "Review Selesai";
export type NotificationMobileBodyType =
// USER
| (string & { __type: "NotificationMobileBodyType" })
| "Terdapat pengajuan baru yang perlu direview"
// ADMIN
| "Pengajuan data anda telah di tolak !"
| "Selamat data anda telah terpublikasi"
export type TypeNotificationCategoryApp = export type TypeNotificationCategoryApp =
| "EVENT" | "EVENT"
| "JOB" | "JOB"