113 lines
3.4 KiB
JavaScript
113 lines
3.4 KiB
JavaScript
const { setGlobalOptions } = require("firebase-functions");
|
|
const { onValueCreated } = require("firebase-functions/v2/database");
|
|
const admin = require("firebase-admin");
|
|
|
|
admin.initializeApp();
|
|
|
|
setGlobalOptions({ maxInstances: 10 });
|
|
|
|
/// 🔔 1. NOTIFIKASI TRIGGER (MONITORING & SELESAI)
|
|
exports.notifHandler = onValueCreated(
|
|
"/notifikasi/{id}",
|
|
async (event) => {
|
|
try {
|
|
const data = event.data.val();
|
|
if (!data) return null;
|
|
|
|
const tipe = data.tipe || "";
|
|
const jenisTape = data.jenisTape || "Ketan";
|
|
const waktu = data.waktu || "-";
|
|
const suhu = data.suhu || "-";
|
|
const alkohol = data.alkohol || "-";
|
|
const status = data.status || "";
|
|
const jamTotal = data.jam_total || data.waktu || "-";
|
|
|
|
/// AMBIL TOKEN
|
|
const tokenSnap = await admin.database().ref("fcm_token").once("value");
|
|
const token = tokenSnap.val();
|
|
|
|
if (!token) {
|
|
console.log("❌ Token tidak ada");
|
|
return null;
|
|
}
|
|
|
|
let message;
|
|
|
|
if (tipe === "monitoring") {
|
|
const delta = data.delta_alkohol !== undefined ? data.delta_alkohol : "-";
|
|
message = {
|
|
notification: {
|
|
title: `📊 Monitoring Tape ${jenisTape}`,
|
|
body: `Status: ${status}\nSuhu: ${suhu}°C\nAlkohol: ${alkohol}%\nDelta 3 Jam: ${delta}%`,
|
|
},
|
|
token: token,
|
|
};
|
|
} else if (tipe === "selesai") {
|
|
message = {
|
|
notification: {
|
|
title: `🍌 Fermentasi Tape ${jenisTape} Selesai!`,
|
|
body: `Waktu: ${waktu}\nTotal Waktu: ${jamTotal} Jam\nSuhu: ${suhu}°C\nAlkohol: ${alkohol}%\nStatus: ${status}`,
|
|
},
|
|
token: token,
|
|
};
|
|
} else {
|
|
console.log(`⚠️ Tipe notifikasi tidak dikenal: ${tipe}`);
|
|
return null;
|
|
}
|
|
|
|
await admin.messaging().send(message);
|
|
console.log(`✅ Notif ${tipe} terkirim`);
|
|
return null;
|
|
} catch (error) {
|
|
console.error("❌ Error sending notification:", error);
|
|
return null;
|
|
}
|
|
}
|
|
);
|
|
|
|
/// 🔔 2. PERINGATAN TRIGGER (HANYA TERLALU MATANG)
|
|
exports.peringatanHandler = onValueCreated(
|
|
"/peringatan/{id}",
|
|
async (event) => {
|
|
try {
|
|
const data = event.data.val();
|
|
if (!data) return null;
|
|
|
|
const status = data.status || "";
|
|
const jenisTape = data.jenisTape || "Ketan";
|
|
const suhu = data.suhu || "-";
|
|
const alkohol = data.alkohol || "-";
|
|
const waktu = data.waktu || "-";
|
|
|
|
// HANYA kirim jika status "Terlalu Matang"
|
|
if (status !== "Terlalu Matang") {
|
|
console.log(`⚠️ Mengabaikan peringatan dengan status: ${status}`);
|
|
return null;
|
|
}
|
|
|
|
/// AMBIL TOKEN
|
|
const tokenSnap = await admin.database().ref("fcm_token").once("value");
|
|
const token = tokenSnap.val();
|
|
|
|
if (!token) {
|
|
console.log("❌ Token tidak ada");
|
|
return null;
|
|
}
|
|
|
|
const message = {
|
|
notification: {
|
|
title: `⚠️ Peringatan: Tape ${jenisTape} Terlalu Matang!`,
|
|
body: `Tape sudah terlalu matang.\nWaktu: ${waktu}\nSuhu: ${suhu}°C\nAlkohol: ${alkohol}%`,
|
|
},
|
|
token: token,
|
|
};
|
|
|
|
await admin.messaging().send(message);
|
|
console.log("✅ Notif peringatan Terlalu Matang terkirim");
|
|
return null;
|
|
} catch (error) {
|
|
console.error("❌ Error sending warning notification:", error);
|
|
return null;
|
|
}
|
|
}
|
|
); |