From 6efc2b8c2feb223cb2712ceac47fe181668ff887 Mon Sep 17 00:00:00 2001 From: sircatalyst Date: Wed, 17 Apr 2019 19:13:19 +0100 Subject: [PATCH] added periodic email notification functionality --- app.js | 4 +- config/emailFunction.js | 41 ++++++++ controllers/email.js | 20 ++++ email-templates/email.hbs | 213 ++++++++++++++++++++++++++++++++++++++ models/email.js | 12 +++ models/promise.js | 20 ++++ package.json | 2 + routes/email.js | 7 ++ 8 files changed, 318 insertions(+), 1 deletion(-) create mode 100644 config/emailFunction.js create mode 100644 controllers/email.js create mode 100644 email-templates/email.hbs create mode 100644 models/email.js create mode 100644 routes/email.js diff --git a/app.js b/app.js index 5be7ea1..0db6289 100644 --- a/app.js +++ b/app.js @@ -11,6 +11,7 @@ const path = require('path'); const database = require('./config/key').MongoURI; var indexRoute = require('./routes/index'); +var emailRoute = require('./routes/email'); // Set up the app with express const app = express(); @@ -55,6 +56,7 @@ db.on('error', console.error.bind(console, 'Mongodb connection error:')); // API ROUTES app.use('/', indexRoute); +app.use('/email', emailRoute); // Express will serve up 404 file if a route is not recognized app.get('*', (req, res) => { @@ -72,4 +74,4 @@ app.use(function(err, req, res, next) { res.render('error'); }); -module.exports = app; \ No newline at end of file +module.exports = app; diff --git a/config/emailFunction.js b/config/emailFunction.js new file mode 100644 index 0000000..21f7c56 --- /dev/null +++ b/config/emailFunction.js @@ -0,0 +1,41 @@ +const path = require("path"); +const fs = require("fs"); + +var api_key = 'd79d63126502f0d15e98e0865652ba10-7caa9475-388729451'; +var domain = 'sandbox787f8f71d66e4b36ae02fef66edd2005.mialgun.org'; +var mailgun = require('mailgun-js')({ apiKey: api_key, domain: domain }); + + +var sendEmail = function sendEmail(res, receiver) { + + const filename = path.normalize(path.join(__dirname, "../email-templates/email.hbs")); + const emailTemplate = fs + .readFileSync(filename) + .toString() + .replace(/{{email}}/, receiver); + const data = { + from: "FeeTracker ", + to: receiver, + subject: "FeeTracker Subscription", + html: emailTemplate.replace(/{{email}}/, receiver) + }; + + mailgun.messages().send(data, (error, body) => { + if (error) { + console.log('Email not sent') + + return res.status(400).json({ + status: 'error', + message: 'email not sent', + }); + } else { + console.log('Email sent'); + return res.status(200).json({ + status: 'success', + message: 'email sent', + }); + + } + }) +} +module.exports = sendEmail; diff --git a/controllers/email.js b/controllers/email.js new file mode 100644 index 0000000..888cbf8 --- /dev/null +++ b/controllers/email.js @@ -0,0 +1,20 @@ +var cron = require('node-cron'); +var sendEmailFunction = require('../config/emailFunction'); + +const emailDb = require('../models/promise').EmailDb; + +const Email = { + async sendEmail(req, res, next) { + try { + var task = cron.schedule('* * * * Monday', () => { + var receiver = req.body.email; + + sendEmailFunction(res, receiver) + console.log('STARTED task'); + }) + } catch (err) { + return res.status(400).send(error); + } + }, +}; +module.exports = Email; diff --git a/email-templates/email.hbs b/email-templates/email.hbs new file mode 100644 index 0000000..b25ecac --- /dev/null +++ b/email-templates/email.hbs @@ -0,0 +1,213 @@ + + + + + DevAlert + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ +
+ + + + +
+ + + + + + +
+ + + +
+
+
+ +
+
+ +
+ + + + + + +
+ +
+ + + + + + + +
+
Fee Tracker
+
+

+ +
+
+ +
+
+ +
+ + + + + + +
+ +
+ + + + + +
+
+

Hello!

+

You subscribed to the Fee Tracker weekly newsletter. You would be getting mails from us.

+ +

Cheers,

+
Fee Tracker Team
+ + + unsubscribe from newsletter + +
+
+
+ +
+
+ + +
+ + + \ No newline at end of file diff --git a/models/email.js b/models/email.js new file mode 100644 index 0000000..e60f58c --- /dev/null +++ b/models/email.js @@ -0,0 +1,12 @@ +const mongoose = require('mongoose'); + +const emailSchema = new mongoose.Schema({ + email: { + type: String, + required: true, + }, +}); + +const EmailSchema = mongoose.model('EmailSchema', emailSchema); + +module.exports = { EmailSchema }; diff --git a/models/promise.js b/models/promise.js index 37cc1cd..f67391c 100644 --- a/models/promise.js +++ b/models/promise.js @@ -1,5 +1,6 @@ // import models const Sample = require('./sample'); +const Email = require('./email'); class Example { /** @@ -61,8 +62,27 @@ class Example { }); }); } +}; + +class EmailDb { + /** + * @param {string} text + * @returns {object} Return all + */ + static findAll(param) { + return new Promise((resolve, reject) => { + Email.findAll(param) + .then(res => { + resolve(res); + }) + .catch(err => { + reject(err); + }); + }); + } } module.exports = { Example, + EmailDb }; diff --git a/package.json b/package.json index 177f411..d24fc08 100644 --- a/package.json +++ b/package.json @@ -29,8 +29,10 @@ "hbs": "^4.0.4", "http-errors": "^1.7.2", "lodash": "^4.17.11", + "mailgun-js": "^0.22.0", "mongoose": "^5.5.2", "morgan": "^1.9.1", + "node-cron": "^2.0.3", "validator": "^10.11.0" } } diff --git a/routes/email.js b/routes/email.js new file mode 100644 index 0000000..abd8cf2 --- /dev/null +++ b/routes/email.js @@ -0,0 +1,7 @@ +var express = require('express'); +var Email = require('../controllers/email'); +var router = express.Router(); + +router.post('/', Email.sendEmail); + +module.exports = router;