From 01584d0f1edbd261ff0f22e6da32ca0b54325bd0 Mon Sep 17 00:00:00 2001 From: Bhaskar Date: Fri, 21 Feb 2025 11:13:51 +0530 Subject: [PATCH] removed notification preference --- src/controllers/tanksController.js | 204 +++++++++++++++++++---------- 1 file changed, 136 insertions(+), 68 deletions(-) diff --git a/src/controllers/tanksController.js b/src/controllers/tanksController.js index b5f79fe5..0dea7292 100644 --- a/src/controllers/tanksController.js +++ b/src/controllers/tanksController.js @@ -1736,9 +1736,9 @@ eventEmitter.on( // Retrieve the user information const users = await User.find({ customerId: customerId, fcmIds: { $in: fcmTokens } }); - console.log("users", users); + // console.log("users", users); const userNames = users.map(user => user.username).join(', '); - console.log("userNames", userNames); + // console.log("userNames", userNames); const startMethod = motorOnType === "Mobile APP" ? "Mobile APP" : "Manual"; @@ -2460,8 +2460,6 @@ const emitWithTimestamp = (eventName, fcmTokens, motorId, waterLevel) => { // } // }; - - const sendNotification = async (customerId, fcmIds, title, body) => { try { if (!customerId) { @@ -2472,84 +2470,50 @@ const sendNotification = async (customerId, fcmIds, title, body) => { throw new Error("No FCM tokens provided or invalid format."); } + // Flatten tokens safely const flatTokens = fcmIds.flat ? fcmIds.flat() : fcmIds; if (flatTokens.length === 0) { throw new Error("Flattened FCM token list is empty."); } - // Fetch users based on customerId - const users = await User.find({ customerId }).select("fcmIds notificationPreference lastNotificationSent"); + // Fetch the user based on customerId + const user = await User.findOne({ customerId }).select("fcmIds"); - const promises = users.map(async (user) => { - const { fcmIds: userFcmIds, notificationPreference, lastNotificationSent } = user; - - if (!Array.isArray(userFcmIds)) { - console.log(`Invalid fcmIds for customer ID: ${customerId}`); - return; - } - - const validTokens = flatTokens.filter(token => userFcmIds.includes(token)); - - if (validTokens.length === 0) { - console.log(`No matching FCM tokens for customer ID: ${customerId}`); - return; - } + if (!user || !Array.isArray(user.fcmIds)) { + console.log(`No valid user or FCM tokens found for customer ID: ${customerId}`); + return; + } - // Handle notification preferences - if (notificationPreference === "never") { - console.log(`Notifications disabled for customer ID: ${customerId}`); - return; - } + // Match provided fcmIds with those stored for the customerId + const validTokens = flatTokens.filter(token => user.fcmIds.includes(token)); - const now = new Date(); - const lastSent = new Date(lastNotificationSent || 0); - - let minInterval = 0; - switch (notificationPreference) { - case "6_hours": - minInterval = 6 * 60 * 60 * 1000; // 6 hours - break; - case "8_hours": - minInterval = 8 * 60 * 60 * 1000; // 8 hours - break; - case "1_month": - minInterval = 30 * 24 * 60 * 60 * 1000; // 1 month - break; - } + if (validTokens.length === 0) { + console.log(`No matching FCM tokens for customer ID: ${customerId}`); + return; + } - // Check if enough time has passed for non-"always" preferences - if (notificationPreference !== "always" && now - lastSent < minInterval) { - console.log(`Skipping notification for customer ID: ${customerId} due to preference (${notificationPreference}).`); - return; - } + // Send notifications to matching tokens + const promises = validTokens.map(async (token) => { + try { + const response = await admin.messaging().send({ + notification: { title, body }, + token, + data: { target: "/tank_levels" }, + }); - // Send notifications - const notificationPromises = validTokens.map(async (token) => { - try { - const response = await admin.messaging().send({ - notification: { title, body }, - token, - data: { target: "/tank_levels" }, - }); + console.log(`Notification sent successfully to token: ${token}`, response); + console.log(`Title: `, title); + console.log(`Body: `, body); - console.log(`Notification sent successfully to token: ${token}`); - console.log("FCM Response:", response); - } catch (error) { - console.error(`Failed to send notification to token: ${token}`, error); + } 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}`); - } + // Handle invalid tokens + if (error.code === "messaging/registration-token-not-registered") { + await User.updateOne({ customerId }, { $pull: { fcmIds: token } }); + console.log(`Removed invalid token: ${token}`); } - }); - - await Promise.all(notificationPromises); - - // Update lastNotificationSent timestamp if preference is not "always" - if (notificationPreference !== "always") { - await User.updateOne({ customerId }, { $set: { lastNotificationSent: now } }); } }); @@ -2562,6 +2526,110 @@ const sendNotification = async (customerId, fcmIds, title, body) => { +// const sendNotification = async (customerId, fcmIds, title, body) => { +// try { +// if (!customerId) { +// throw new Error("Customer ID is required."); +// } + +// if (!Array.isArray(fcmIds) || fcmIds.length === 0) { +// throw new Error("No FCM tokens provided or invalid format."); +// } + +// const flatTokens = fcmIds.flat ? fcmIds.flat() : fcmIds; +// if (flatTokens.length === 0) { +// throw new Error("Flattened FCM token list is empty."); +// } + +// // Fetch users based on customerId +// const users = await User.find({ customerId }).select("fcmIds notificationPreference lastNotificationSent"); + +// const promises = users.map(async (user) => { +// const { fcmIds: userFcmIds, notificationPreference, lastNotificationSent } = user; + +// if (!Array.isArray(userFcmIds)) { +// console.log(`Invalid fcmIds for customer ID: ${customerId}`); +// return; +// } + +// const validTokens = flatTokens.filter(token => userFcmIds.includes(token)); + +// if (validTokens.length === 0) { +// console.log(`No matching FCM tokens for customer ID: ${customerId}`); +// return; +// } + +// // Handle notification preferences +// if (notificationPreference === "never") { +// console.log(`Notifications disabled for customer ID: ${customerId}`); +// return; +// } + +// const now = new Date(); +// const lastSent = new Date(lastNotificationSent || 0); + +// let minInterval = 0; +// switch (notificationPreference) { +// case "6_hours": +// minInterval = 6 * 60 * 60 * 1000; // 6 hours +// break; +// case "8_hours": +// minInterval = 8 * 60 * 60 * 1000; // 8 hours +// break; +// case "1_month": +// minInterval = 30 * 24 * 60 * 60 * 1000; // 1 month +// break; +// } + +// // Check if enough time has passed for non-"always" preferences +// if (notificationPreference !== "always" && now - lastSent < minInterval) { +// console.log(`Skipping notification for customer ID: ${customerId} due to preference (${notificationPreference}).`); +// return; +// } + +// // Send notifications +// const notificationPromises = validTokens.map(async (token) => { +// try { +// const response = await admin.messaging().send({ +// notification: { title, body }, +// token, +// data: { target: "/tank_levels" }, +// }); + +// console.log(`Notification sent successfully to token: ${token}`); +// console.log("FCM Response:", response); +// console.log("Titel:", title); +// console.log("Body:", body); +// console.log("Data:", data); + + +// } 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}`); +// } +// } +// }); + +// await Promise.all(notificationPromises); + +// // Update lastNotificationSent timestamp if preference is not "always" +// if (notificationPreference !== "always") { +// await User.updateOne({ customerId }, { $set: { lastNotificationSent: now } }); +// } +// }); + +// await Promise.all(promises); + +// } catch (error) { +// console.error("Error sending notifications:", error); +// } +// }; + + + // const sendPushNotification = async (registrationToken, title, body) => { // const message = {