|
|
const webpush = require('web-push'); |
|
|
const User = require('../models/User'); |
|
|
|
|
|
|
|
|
webpush.setVapidDetails( |
|
|
process.env.VAPID_EMAIL, |
|
|
process.env.VAPID_PUBLIC_KEY, |
|
|
process.env.VAPID_PRIVATE_KEY |
|
|
); |
|
|
|
|
|
|
|
|
const sendToUser = async (userId, title, message, url = '/') => { |
|
|
try { |
|
|
const user = await User.findById(userId); |
|
|
if (user && user.pushSubscription) { |
|
|
await webpush.sendNotification( |
|
|
user.pushSubscription, |
|
|
JSON.stringify({ title, body: message, url }) |
|
|
); |
|
|
} |
|
|
} catch (err) { |
|
|
|
|
|
if (err.statusCode === 410) { |
|
|
await User.findByIdAndUpdate(userId, { $unset: { pushSubscription: "" } }); |
|
|
} |
|
|
console.error("Push Error (Single):", err.statusCode); |
|
|
} |
|
|
}; |
|
|
|
|
|
|
|
|
const sendGlobal = async (title, message, url = '/') => { |
|
|
try { |
|
|
|
|
|
const users = await User.find({ pushSubscription: { $exists: true } }); |
|
|
const payload = JSON.stringify({ title, body: message, url }); |
|
|
|
|
|
console.log(`📢 Sending Global Push to ${users.length} devices...`); |
|
|
|
|
|
const promises = users.map(user => |
|
|
webpush.sendNotification(user.pushSubscription, payload).catch(err => { |
|
|
if (err.statusCode === 410) { |
|
|
User.findByIdAndUpdate(user._id, { $unset: { pushSubscription: "" } }); |
|
|
} |
|
|
}) |
|
|
); |
|
|
|
|
|
await Promise.all(promises); |
|
|
} catch (err) { |
|
|
console.error("Push Error (Global):", err); |
|
|
} |
|
|
}; |
|
|
|
|
|
module.exports = { sendToUser, sendGlobal }; |
|
|
|