diff --git a/src/controllers/tanksController.js b/src/controllers/tanksController.js index 89b85a10..f1bf9adf 100644 --- a/src/controllers/tanksController.js +++ b/src/controllers/tanksController.js @@ -2223,12 +2223,12 @@ eventEmitter.on("sendMotorStartNotification", async (hw_Id, customerId, fcmToken ? `🚨 Pump will stop when the water level reaches **${manualThresholdTime}%**.` : `⚠️ Pump will stop **manually**.`; - const message = `🚰 **Motor Started** πŸš€\n` + - `πŸ‘€ **Customer ID:** ${customerId}\n` + - `πŸ”Ή **Motor Name:** ${tankName} - ${blockName}\n` + - `πŸ’§ **Water Level:** ${waterLevel}\n` + - `πŸ“± **Mode:** **Forced Manual**\n` + - `πŸ•’ **Pump started at:** ${formattedTime}\n` + const message = `🚰 Motor Started πŸš€\n` + + `πŸ‘€ Customer ID: ${customerId}\n` + + `πŸ”Ή Motor Name: ${tankName} - ${blockName}\n` + + `πŸ’§ Water Level: ${waterLevel}\n` + + `πŸ“± Mode: Manually Started\n` + + `πŸ•’ Pump started at: ${formattedTime}\n` await sendNotification(hw_Id, customerId, fcmTokens, "Motor Started πŸš€", message); @@ -2254,12 +2254,12 @@ eventEmitter.on("sendMotorStopNotification", async (hw_Id, customerId, fcmTokens return; } - const message = `πŸ›‘ **Motor Stopped** ❌\n` + - `πŸ‘€ **Customer ID:** ${customerId}\n` + - `πŸ”Ή **Motor Name:** ${tankName} - ${blockName}\n` + - `πŸ’§ **Water Level:** ${waterLevel}\n` + - `πŸ“± **Mode:** **Forced Manual**\n` + - `πŸ•’ **Pump stopped at:** ${formattedTime}`; + const message = `πŸ›‘ Motor Stopped ❌\n` + + `πŸ‘€ Customer ID: ${customerId}\n` + + `πŸ”Ή Motor Name: ${tankName} - ${blockName}\n` + + `πŸ’§ Water Level: ${waterLevel}\n` + + `πŸ“± Mode: Manually Stopped\n` + + `πŸ•’ Pump stopped at: ${formattedTime}`; await sendNotification(hw_Id, customerId, fcmTokens, "Motor Stopped ❌", message); console.log(`βœ… Motor stop notification sent for Customer ID: ${customerId}`); @@ -2663,6 +2663,7 @@ const sendNotification = async (hw_Id, customerId, fcmIds, title, body) => { +// Function to send notifications const sendDailyConsumptionNotification = async () => { try { const now = new Date(); @@ -2671,23 +2672,38 @@ const sendDailyConsumptionNotification = async () => { console.log(`πŸ•’ Checking users for scheduled notifications at ${currentTime}`); - // Fetch users who have set notifications for the current time + // Fetch unique users who have enabled notifications for the current time const users = await User.find({ allowNotifications: true, notificationTime: currentTime, - }).select("customerId fcmIds lastNotificationSent"); + }).select("customerId fcmIds lastNotificationSent").lean(); - if (users.length === 0) { + // Ensure unique customers only + const uniqueUsers = users.filter((user, index, self) => + index === self.findIndex((u) => u.customerId === user.customerId) + ); + + if (uniqueUsers.length === 0) { console.log("⏳ No users have notifications scheduled for this time."); return; } - for (const user of users) { - const { customerId, fcmIds } = user; + for (const user of uniqueUsers) { + const { customerId, fcmIds, lastNotificationSent } = user; // Ensure user has valid FCM tokens if (!Array.isArray(fcmIds) || fcmIds.length === 0) { - console.log(`⚠️ No valid FCM tokens found for customer ID: ${customerId}`); + console.log(`⚠️ No valid FCM tokens for customer ID: ${customerId}`); + continue; + } + + // Remove duplicate and trim tokens + const uniqueTokens = [...new Set(fcmIds.map(token => token.trim()))]; + + // Check if notification should be sent based on lastNotificationSent + const lastSent = new Date(lastNotificationSent || 0); + if (now - lastSent < 24 * 60 * 60 * 1000) { + console.log(`⏳ Skipping notification for ${customerId}, already sent in the last 24 hours.`); continue; } @@ -2745,19 +2761,25 @@ const sendDailyConsumptionNotification = async () => { console.log(`πŸ“© Preparing notification for ${customerId}:`, notificationBody); + // Update lastNotificationSent before sending + await User.updateOne( + { customerId }, + { $set: { lastNotificationSent: new Date() } } + ); + // Send notification to FCM tokens - const notificationPromises = fcmIds.map(async (token) => { + const notificationPromises = uniqueTokens.map(async (token) => { try { - const response = await admin.messaging().send({ + await admin.messaging().send({ notification: { title: "Daily Water Consumption Report", body: notificationBody }, token, data: { target: "/tank_levels" }, }); console.log(`βœ… Notification sent to token: ${token}`); - console.log("FCM Response:", response); } catch (error) { console.error(`❌ Failed to send notification to token: ${token}`, error); + if (error.code === "messaging/registration-token-not-registered") { await User.updateOne({ customerId }, { $pull: { fcmIds: token } }); console.log(`🚫 Removed invalid token: ${token}`); @@ -2772,8 +2794,6 @@ const sendDailyConsumptionNotification = async () => { } }; - -// Schedule the function to run every minute to check for user notification times cron.schedule("* * * * *", async () => { console.log("πŸ”„ Running daily consumption notification check..."); await sendDailyConsumptionNotification(); @@ -6695,14 +6715,15 @@ client.on('message', async (topic, message) => { const customerId = motorTank.customerId; console.log("tankName",tankName) console.log("customerId", customerId) + console.log("status", status) + // Ensure fcmTokens are fetched before emitting // const user = await User.findOne({ customerId: motorTank.customerId }).select("fcmIds manualStartAndStopNotify"); // const fcmTokens = user?.fcmIds || []; // Ensure fcmTokens is an array // console.log("fcmTokens", fcmTokens) const users = await User.findOne({ customerId : motorTank.customerId}).select("fcmIds"); - // console.log("users", users) - // let fcmTokens = users.flatMap(user => user.fcmIds).filter(token => token); + let fcmTokens = users.fcmIds.filter(token => token); console.log(`πŸ“‘ Found ${fcmTokens.length} FCM tokens for Customer ID: ${customerId}`); @@ -6710,14 +6731,6 @@ client.on('message', async (topic, message) => { if (!Array.isArray(fcmTokens) || fcmTokens.length === 0) { console.warn(`⚠️ No valid FCM tokens found for Customer ID: ${customerId}`); } - - // const motorTank = await Tank.findOne({ "connections.inputConnections.motor_id": hw_Id }); - - - - // const inputConnection = motorTank.connections.inputConnections.find(conn => conn.motor_id === hw_Id); - - console.log(`πŸ“’ Processing motor logic for hw_Id: ${hw_Id}`); const blockName = motorTank.blockName || "N/A"; @@ -6729,109 +6742,55 @@ client.on('message', async (topic, message) => { console.log("πŸ› οΈ inputConnection.motor_on_type:", inputConnection.motor_on_type); - if (status === 2 && inputConnection.motor_stop_status === "1") { - // Only update if motor_stop_status is still 1 (motor was previously OFF) - inputConnection.motor_stop_status = 2; - inputConnection.motor_on_type = "forced_manual"; - inputConnection.startTime = new Date().toISOString(); - // status = 1; - // inputConnection.motor_status = 1; + // if (status === 2 && inputConnection.motor_stop_status === "1" && inputConnection.motor_on_type !== "forced_manual") { + // // Only update if motor_stop_status is still 1 (motor was previously OFF) + // inputConnection.motor_stop_status ="2"; + // inputConnection.motor_on_type = "forced_manual"; + // inputConnection.startTime = new Date().toISOString(); + // // status = 1; + // // inputConnection.motor_status = "1"; - console.log("πŸ› οΈ IN inputConnection.motor_stop_status:", inputConnection.motor_stop_status); - console.log("πŸ› οΈ Motor_status:", status); - console.log("πŸ› οΈinputConnection.motor_status:", inputConnection.motor_status); + // console.log("πŸ› οΈ IN inputConnection.motor_stop_status:", inputConnection.motor_stop_status); + // console.log("πŸ› οΈIn Motor_status:", status); + // console.log("πŸ› οΈIn inputConnection.motor_status:", inputConnection.motor_status); - console.log("πŸš€ Motor started. Updating motor_stop_status to 2."); - console.log("πŸ“’ Emitting sendMotorStartNotification event..."); + // console.log("πŸš€ Motor started. Updating motor_stop_status to 2."); + // console.log("πŸ“’ Emitting sendMotorStartNotification event..."); - await motorTank.markModified("connections.inputConnections"); - await motorTank.save(); - console.log("πŸ’Ύ motorTank saved successfully after start."); + // await motorTank.markModified("connections.inputConnections"); + // await motorTank.save(); + // console.log("πŸ’Ύ motorTank saved successfully after start."); - eventEmitter.emit( - "sendMotorStartNotification", - hw_Id, - customerId, - fcmTokens, - inputConnection.water_level || 0, - blockName, - tankName, - "forced_manual", - inputConnection.stop_criteria, - inputConnection.typeOfWater, - inputConnection.manual_threshold_time - ); + // eventEmitter.emit( + // "sendMotorStartNotification", + // hw_Id, + // customerId, + // fcmTokens, + // inputConnection.water_level || 0, + // blockName, + // tankName, + // "forced_manual", + // inputConnection.stop_criteria, + // inputConnection.typeOfWater, + // inputConnection.manual_threshold_time + // ); - } - - // if (allowNotifications && inputConnection.motor_stop_status === "1" && status === 2 && inputConnection.motor_on_type !== "forced_manual") { - // const currentTime = moment().tz('Asia/Kolkata').format('DD-MMM-YYYY - HH:mm'); - // inputConnection.motor_stop_status = "2"; - // inputConnection.motor_on_type = "forced_manual"; - // inputConnection.startTime = currentTime; + // } - // console.log("πŸ“’ Emitting sendMotorStartNotification event..."); - - // eventEmitter.emit( - // "sendMotorStartNotification", - // hw_Id, - // customerId, - // fcmTokens, - // inputConnection.water_level || 0, - // blockName, - // tankName, - // "forced_manual", - // inputConnection.stop_criteria, - // inputConnection.typeOfWater, - // inputConnection.manual_threshold_time - // ); - - // await motorTank.markModified("connections.inputConnections"); - // await motorTank.save(); - // console.log("πŸ’Ύ motorTank saved successfully."); - // } - - // if (allowNotifications && inputConnection.motor_stop_status === "1" && status === 2 && inputConnection.motor_on_type !== "forced_manual") { - // const currentTime = moment().tz('Asia/Kolkata').format('DD-MMM-YYYY - HH:mm'); - // inputConnection.motor_stop_status = "2"; - // inputConnection.motor_on_type = "forced_manual"; - // inputConnection.startTime = currentTime; - - // console.log("πŸš€ Motor started in FORCED_MANUAL mode."); - - // console.log("πŸ“’ Emitting sendMotorStartNotification event..."); - - - - // eventEmitter.emit( - // "sendMotorStartNotification", - // hw_Id, - // customerId, - // fcmTokens, - // inputConnection.water_level || 0, - // blockName, - // tankName, - // "forced_manual", - // inputConnection.stop_criteria, - // inputConnection.typeOfWater, - // inputConnection.manual_threshold_time - // ); - // await motorTank.markModified("connections.inputConnections"); - // await motorTank.save(); // Ensure the change is saved - // console.log("πŸ’Ύ motorTank saved successfully."); - // } - // if (allowNotifications && inputConnection.motor_stop_status === "2" && status === 1) { - // const currentTime = moment().tz('Asia/Kolkata').format('DD-MMM-YYYY - HH:mm'); - // inputConnection.motor_stop_status = "1"; - // inputConnection.stopTime = currentTime; - - // console.log("πŸ“’ Emitting sendMotorStopNotification event..."); - + // console.log(`πŸ” Checking stop condition: status=${status}, motor_stop_status=${inputConnection.motor_stop_status}`); + // if (status === 1 && inputConnection.motor_stop_status === "2") { + // console.log("πŸ›‘ Motor stopping... Updating motor_stop_status to 1."); - + // inputConnection.motor_stop_status = "1"; + // inputConnection.stopTime = new Date().toISOString(); + + // await motorTank.markModified("connections.inputConnections"); + // await motorTank.save(); // Ensure data is saved before emitting + + // console.log("πŸ“’ Emitting sendMotorStopNotification event..."); // eventEmitter.emit( // "sendMotorStopNotification", // hw_Id, @@ -6844,53 +6803,59 @@ client.on('message', async (topic, message) => { // inputConnection.typeOfWater // ); // } - - // if (allowNotifications && inputConnection.motor_stop_status === "2" && status === 1) { - // const currentTime = moment().tz('Asia/Kolkata').format('DD-MMM-YYYY - HH:mm'); - // inputConnection.motor_stop_status = "1"; - // inputConnection.stopTime = currentTime; - - // console.log("πŸ“’ Emitting sendMotorStopNotification event..."); - - // eventEmitter.emit( - // "sendMotorStopNotification", - // hw_Id, - // customerId, - // fcmTokens, - // inputConnection.water_level || 0, - // blockName, - // tankName, - // "forced_manual", - // inputConnection.typeOfWater - // ); - - // await motorTank.markModified("connections.inputConnections"); - // await motorTank.save(); - // } - console.log(`πŸ” Checking stop condition: status=${status}, motor_stop_status=${inputConnection.motor_stop_status}`); - if (status === 2 && inputConnection.motor_stop_status === "2") { - console.log("πŸ›‘ Motor stopping... Updating motor_stop_status to 1."); - - inputConnection.motor_stop_status = "1"; - inputConnection.stopTime = new Date().toISOString(); - - await motorTank.markModified("connections.inputConnections"); - await motorTank.save(); // Ensure data is saved before emitting - - console.log("πŸ“’ Emitting sendMotorStopNotification event..."); - eventEmitter.emit( - "sendMotorStopNotification", - hw_Id, - customerId, - fcmTokens, - inputConnection.water_level || 0, - blockName, - tankName, - "forced_manual", - inputConnection.typeOfWater - ); - } - + // if (status === 2 && inputConnection.motor_stop_status === "1" && inputConnection.motor_on_type !== "forced_manual") { + // // Motor is starting (only execute this block) + // inputConnection.motor_stop_status = "2"; // Motor is now running + // inputConnection.motor_on_type = "forced_manual"; + // inputConnection.startTime = new Date().toISOString(); + + // console.log("πŸš€ Motor started. Updating motor_stop_status to 2."); + // console.log("πŸ“’ Emitting sendMotorStartNotification event..."); + + // await motorTank.markModified("connections.inputConnections"); + // await motorTank.save(); + // console.log("πŸ’Ύ motorTank saved successfully after start."); + + // eventEmitter.emit( + // "sendMotorStartNotification", + // hw_Id, + // customerId, + // fcmTokens, + // inputConnection.water_level || 0, + // blockName, + // tankName, + // "forced_manual", + // inputConnection.stop_criteria, + // inputConnection.typeOfWater, + // inputConnection.manual_threshold_time + // ); + + // } else if (status === 1 && inputConnection.motor_stop_status === "2") { + // // Motor is stopping (only execute this block) + // console.log("πŸ›‘ Motor stopping... Updating motor_stop_status to 1."); + + // inputConnection.motor_stop_status = "1"; // Motor is now OFF + // inputConnection.stopTime = new Date().toISOString(); + + // await motorTank.markModified("connections.inputConnections"); + // await motorTank.save(); // Ensure data is saved before emitting + + // console.log("πŸ“’ Emitting sendMotorStopNotification event..."); + // eventEmitter.emit( + // "sendMotorStopNotification", + // hw_Id, + // customerId, + // fcmTokens, + // inputConnection.water_level || 0, + // blockName, + // tankName, + // "forced_manual", + // inputConnection.typeOfWater + // ); + // } + + console.log(`πŸ” Final condition: status=${status}, motor_stop_status=${inputConnection.motor_stop_status}`); + await motorTank.save(); // Save the updated tank }