104 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const express = require("express");
 | 
						|
const path = require("path");
 | 
						|
const router = express.Router();
 | 
						|
const webpush = require("web-push"); //requiring the web-push module
 | 
						|
const schedule = require("node-schedule");
 | 
						|
 | 
						|
const mustBeAuthenticated = require(path.join(
 | 
						|
  __dirname, "/middleware/mustBeAuthenticated"
 | 
						|
));
 | 
						|
 | 
						|
const config = require(path.join(__dirname + "/../config/defaults/push"));
 | 
						|
const Subscription = require(path.join(__dirname, "/schemas/Subscription"));
 | 
						|
const lotteryConfig = require(path.join(
 | 
						|
  __dirname + "/../config/defaults/lottery"
 | 
						|
));
 | 
						|
 | 
						|
router.use((req, res, next) => {
 | 
						|
  next();
 | 
						|
});
 | 
						|
 | 
						|
if (!config.publicKey) {
 | 
						|
  console.error(
 | 
						|
    "You are missing the push-setup! Server will continue running even without this."
 | 
						|
  );
 | 
						|
  module.exports = router;
 | 
						|
  return;
 | 
						|
}
 | 
						|
 | 
						|
const vapidKeys = {
 | 
						|
  publicKey: config.publicKey,
 | 
						|
  privateKey: config.privateKey
 | 
						|
};
 | 
						|
//setting our previously generated VAPID keys
 | 
						|
webpush.setVapidDetails(
 | 
						|
  config.mailto,
 | 
						|
  vapidKeys.publicKey,
 | 
						|
  vapidKeys.privateKey
 | 
						|
);
 | 
						|
 | 
						|
const sendNotification = (subscription, dataToSend = "") => {
 | 
						|
  try {
 | 
						|
    webpush.sendNotification(subscription, dataToSend);
 | 
						|
  } catch (e) {
 | 
						|
    console.log("error", e);
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
router.route("/save-subscription").post(async (req, res) => {
 | 
						|
  const subscription = req.body;
 | 
						|
  await saveToDatabase(subscription); //Method to save the subscription to Database
 | 
						|
  res.json({ message: "success" });
 | 
						|
});
 | 
						|
 | 
						|
const saveToDatabase = async subscription => {
 | 
						|
  let found = await Subscription.find({
 | 
						|
    endpoint: subscription.endpoint,
 | 
						|
    "keys.p256dh": subscription.keys.p256dh,
 | 
						|
    "keys.auth": subscription.keys.auth
 | 
						|
  });
 | 
						|
 | 
						|
  if (found.length > 0) {
 | 
						|
    return;
 | 
						|
  } else {
 | 
						|
    let newSubscription = new Subscription(subscription);
 | 
						|
    await newSubscription.save();
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
router
 | 
						|
  .route("/send-notification")
 | 
						|
  .post(mustBeAuthenticated, async (req, res) => {
 | 
						|
    const message = JSON.stringify({
 | 
						|
      message: req.body.message,
 | 
						|
      title: "Vinlotteri!",
 | 
						|
      link: req.body.link
 | 
						|
    });
 | 
						|
    let subs = await Subscription.find();
 | 
						|
    for (let i = 0; i < subs.length; i++) {
 | 
						|
      let subscription = subs[i]; //get subscription from your databse here.
 | 
						|
      sendNotification(subscription, message);
 | 
						|
    }
 | 
						|
    res.json(true);
 | 
						|
    return;
 | 
						|
  });
 | 
						|
 | 
						|
schedule.scheduleJob(
 | 
						|
  `0 50 ${lotteryConfig.hours - 1} * * ${lotteryConfig.date}`,
 | 
						|
  async () => {
 | 
						|
    let subs = await Subscription.find();
 | 
						|
    for (let i = 0; i < subs.length; i++) {
 | 
						|
      let subscription = subs[i]; //get subscription from your databse here.
 | 
						|
      const message = JSON.stringify({
 | 
						|
        message: "Husk vinlotteriet, det begynner om 10 minutter!",
 | 
						|
        title: "Vinlotteri!",
 | 
						|
        link: "/"
 | 
						|
      });
 | 
						|
      sendNotification(subscription, message);
 | 
						|
    }
 | 
						|
  }
 | 
						|
);
 | 
						|
 | 
						|
module.exports = router;
 | 
						|
module.exports.sendNotification = sendNotification;
 |