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;
 |