Fix API notifikasi untuk job

### No Issue
This commit is contained in:
2026-01-08 10:14:35 +08:00
parent 87515ae19f
commit 2086692897
5 changed files with 67 additions and 10 deletions

View File

@@ -1,6 +1,8 @@
import { NextResponse } from "next/server";
import prisma from "@/lib/prisma";
import _ from "lodash";
import { sendNotificationMobileToOneUser } from "@/lib/mobile/notification/send-notification";
import { routeUserMobile } from "@/lib/mobile/route-page-mobile";
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 } }) {
const { id } = params;
const { data } = await request.json();
const { catatan, senderId } = data;
const { searchParams } = new URL(request.url);
const status = searchParams.get("status");
const fixStatus = _.startCase(status as string);
let fixData;
try {
const checkStatus = await prisma.masterStatus.findFirst({
@@ -83,7 +89,7 @@ async function PUT(request: Request, { params }: { params: { id: string } }) {
},
data: {
masterStatusId: checkStatus.id,
catatan: data,
catatan: catatan,
},
select: {
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;
} else if (fixStatus === "Publish") {
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;
}

View File

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

View File

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

View File

@@ -5,10 +5,15 @@ type StatusApp = "review" | "draft" | "reject" | "publish";
const routeAdminMobile = {
userAccess: ({ id }: { id: string }) => `/admin/user-access/${id}`,
// JOB
jobDetail: ({ id, status }: { id: string; status: StatusApp }) => `/admin/job/${id}/${status}`,
jobByStatus: ({ status }: { status: StatusApp }) => `/admin/job/${status}/status`,
jobDetail: ({ id, status }: { id: string; status: StatusApp }) =>
`/admin/job/${id}/${status}`,
jobByStatus: ({ status }: { status: StatusApp }) =>
`/admin/job/${status}/status`,
};
const routeUserMobile = {
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 = {
title: string;
body: string;
title: NotificationMobileTitleType;
body: NotificationMobileBodyType;
userLoginId?: string;
appId?: string;
status?: string;
type: "announcement" | "trigger";
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 =
| "EVENT"
| "JOB"