diff --git a/app.js b/app.js index ddc06b3..be461ab 100644 --- a/app.js +++ b/app.js @@ -10,6 +10,7 @@ const models = require( './models/index' ) const passport = require( './auth/passport' ) const protectRoute = require( './auth/protectRoute' ) const checkToken = require( './auth/checkToken' ) +const weeklyReview = require( './src/mail/email_scheduler' ) const routes = require( './routes/index' ) const accounts = require( './routes/accounts' ) @@ -54,6 +55,9 @@ app.use( (req, res, next) => { next(err) }) +// email scheduler +weeklyReview.job() + // error handlers // development error handler diff --git a/migrations/20161102161713-create-audit.js b/migrations/20161102161713-create-audit.js new file mode 100644 index 0000000..653832c --- /dev/null +++ b/migrations/20161102161713-create-audit.js @@ -0,0 +1,45 @@ +'use strict'; +module.exports = { + up: function(queryInterface, Sequelize) { + return queryInterface.createTable('Audits', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + table_name: { + type: Sequelize.STRING + }, + element_id: { + type: Sequelize.INTEGER + }, + element_name: { + type: Sequelize.STRING + }, + old_value: { + type: Sequelize.STRING + }, + new_value: { + type: Sequelize.STRING + }, + field_type: { + type: Sequelize.STRING + }, + user_id: { + type: Sequelize.INTEGER + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + down: function(queryInterface, Sequelize) { + return queryInterface.dropTable('Audits'); + } +}; \ No newline at end of file diff --git a/models/audit.js b/models/audit.js new file mode 100644 index 0000000..d98712d --- /dev/null +++ b/models/audit.js @@ -0,0 +1,19 @@ +'use strict'; +module.exports = function(sequelize, DataTypes) { + var Audit = sequelize.define('Audit', { + table_name: DataTypes.STRING, + element_id: DataTypes.INTEGER, + element_name: DataTypes.STRING, + old_value: DataTypes.STRING, + new_value: DataTypes.STRING, + field_type: DataTypes.STRING, + user_id: DataTypes.INTEGER + }, { + classMethods: { + associate: function(models) { + // associations can be defined here + } + } + }); + return Audit; +}; \ No newline at end of file diff --git a/src/mail/email_scheduler.js b/src/mail/email_scheduler.js new file mode 100644 index 0000000..6e9ae50 --- /dev/null +++ b/src/mail/email_scheduler.js @@ -0,0 +1,20 @@ +const schedule = require('node-schedule') +const { User, Audit } = require( '../../models/index' ) +const WeeklyReview = require('./weekly_review') + +const emailList = users => + users.forEach( user => + Audit.find({ where: { user_id: user.id }, raw: true }) + .then( review => { + if ( review ) { + WeeklyReview.send( user.email, review ) + } + }) + ) + +const review = schedule.scheduleJob('1 * * * * *', () => + User.findAll({ attributes: [ 'id', 'email' ], raw: true }) + .then( users => emailList( users ) ) + ) + +module.exports = review diff --git a/src/mail/weekly_review.js b/src/mail/weekly_review.js new file mode 100644 index 0000000..62af9d4 --- /dev/null +++ b/src/mail/weekly_review.js @@ -0,0 +1,29 @@ +const transporter = require('./mailer') + +const weeklyReview = review => { + return ` +
${review.element_name}
+${review.old_value}
+${review.new_value}
+${review.field_type}
+ ` +} + +const options = ( userEmail, review ) => { + const url = `${process.env.SITE_URL}` + const environment_header = + process.env.ENVIRONMENT ? `[${process.env.ENVIRONMENT}]` : '' + + return { + from: '"Floworky"