Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,16 +42,16 @@ app.get('*', function(req, res, next) {
});

app.use('/api/login', new RateLimit({
windowMs: settings.rateLimitWindow,
max: settings.loginRequestLimit,
delayMs: 0
}));
windowMs: settings.rateLimitWindow,
max: settings.loginRequestLimit,
delayMs: 0
}));

app.use('/api', new RateLimit({
windowMs: settings.rateLimitWindow,
max: settings.requestLimit,
delayMs: 0
}));
windowMs: settings.rateLimitWindow,
max: settings.requestLimit,
delayMs: 0
}));

app.use(function(req, res, next) {
if (req.path === '/api/login' || req.path.indexOf('/api/external-upload') === 0) {
Expand All @@ -71,7 +71,7 @@ app.use(function(req, res, next) {
for (let route of routes) {
app.use('/api', route);
}
const cronexample = require('./lib/cron');
require('./lib/cron');
require('./error_handler')(app);

// Teardown can be passed any modules necessary for proper teardown
Expand Down
170 changes: 170 additions & 0 deletions bin/create_programs.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
#!/usr/bin/env node
'use strict';
require('dotenv').config();

const csv = require('csv');
const fs = require('fs');
const mongoose = require('mongoose');
mongoose.promise = Promise;
mongoose.connect(process.env.DB_HOST, {useMongoClient: true});

const College = require('../models/college.model');
const Department = require('../models/department.model');
const Program = require('../models/program.model');

let completed = 0;
let toComplete;

function loadCSV(callback) {
fs.readFile('./bin/raw-programs.csv', 'utf-8', (error, data) => {
if (error)
return console.log(error);

csv.parse(data, {columns: true}, (error, data) => {
if (error)
return console.log('There was an error parsing data!')
toComplete = data.length;
callback(data);
});
});
}

function createCollege(currentCollege, currentDepartment, currentProgram) {
return new Promise((resolve, reject) => {
const college = new College(currentCollege);
college.save((err, savedCollege) => {
if (!err) {
currentDepartment.college = savedCollege._id;
return createDepartment(currentDepartment, currentProgram).then(function() {
resolve();
}, err => {
console.log(err);
reject();
});
} else {
console.log(err);
reject();
}
});
});
}

function createDepartment(currentDepartment, currentProgram) {
return new Promise((resolve, reject) => {
const department = new Department(currentDepartment);

department.save((err, savedDepartment) => {

if (!err) {
currentProgram.department = savedDepartment._id;
createProgram(currentProgram).then(function() {
resolve();
}, err => {
console.log(err);
reject();
});
} else {
console.log(err);
reject();
}
});
});
}

function createProgram(currentProgram) {
return new Promise((resolve, reject) => {
const program = new Program(currentProgram);
program.save((err, savedProgram) => {
if (!err) {
completed += 1;
resolve();
} else {
console.log(err);
reject();
}
});
});
}

async function applyImport(entries) {
for (let entry of entries) {
await importEntry(entry);
}
}

function importEntry(entry) {
return new Promise((resolve, reject) => {
College.findOne({name: entry.college}, '_id', (err, foundCollege) => {
if (foundCollege) {
Department.findOne({name: entry.department}, '_id', (err, foundDepartment) => {
if (foundDepartment) {
createProgram({
name: entry.program,
department: foundDepartment._id,
nextReviewDate: entry.nextReviewDate
}).then(resolve, reject);
;
} else {
createDepartment({name: entry.department, college: foundCollege._id, abbreviation: entry.departmentAbbreviation}, {name: entry.program, nextReviewDate: entry.nextReviewDate}).then(resolve, reject);
;
}
});
} else {
createCollege({name: entry.college, abbreviation: entry.collegeAbbreviation}, {name: entry.department, abbreviation: entry.departmentAbbreviation}, {name: entry.program, nextReviewDate: entry.nextReviewDate}).then(resolve, reject);
}
});
});
}

function removePrograms() {
return new Promise((resolve, reject) => {
Program.find({}).remove(function(err) {
if (!err) {
resolve();
} else {
reject();
}
});
});
}

function removeDepartments() {
return new Promise((resolve, reject) => {
Department.find({}).remove(function(err) {
if (!err) {
resolve();
} else {
reject();
}
});
});
}

function removeColleges() {
return new Promise((resolve, reject) => {
College.find({}).remove(function(err) {
if (!err) {
resolve();
} else {
reject();
}
});
});
}

removePrograms().then(function() {
return removeDepartments();
})
.then(function() {
return removeColleges();
})
.then(function() {
loadCSV(applyImport);
});

setInterval(() => {
if (completed === toComplete) {
console.log('Successfully added colleges, departments, and programs');
process.exit(0);
}
}, 100);
103 changes: 52 additions & 51 deletions lib/cron/cronexample.js
Original file line number Diff line number Diff line change
@@ -1,75 +1,76 @@
const mongoose = require('mongoose');
const winston = require('winston');
const nodemailer = require('nodemailer');
const hbs = require('nodemailer-express-handlebars');
const Review = mongoose.model('Review');
const Document = mongoose.model('Document');
const User = mongoose.model('User');
const _ = require('lodash');


const CronJob = require('cron').CronJob;

const job = new CronJob({
cronTime: '5,10,15,20,25,30,35,40,45,50,55,59 * * * * *',
onTick: function() {
Review.find({}, (err,reviews) => {
if(err) {
console.log("error");
}
reviews.forEach(function(review) {
for (let node of _.values(review.nodes)) {
if (node.title === 'Questions' && node.completionEstimate === 3){
nodemailer.createTestAccount((err, account) => {
if (err) {
console.error('Failed to create a testing account. ' + err.message);
return process.exit(1);
}

console.log('Credentials obtained, sending message...');

// Create a SMTP transporter object
let transporter = nodemailer.createTransport({
host: account.smtp.host,
port: account.smtp.port,
secure: account.smtp.secure,
auth: {
user: account.user,
pass: account.pass
}
});
transporter.use('compile', hbs ({
viewPath: 'templates',
extName: '.hbs'
}));
Review.find({}, (err, reviews) => {
if (err) {
console.log('error');
}
reviews.forEach(function(review) {
for (let node of _.values(review.nodes)) {
let currentDate = Date.now();
let documentDate = node.finishDate.getTime();
let daysRemaining = Math.floor((documentDate - currentDate) / 86400000);
if (daysRemaining === 1) {
console.log(node.title);
Document.findById(node.document).then(function(document) {
for (let id of document.subscribers) {
User.findById(id).then(function(user) {
// Create a SMTP transporter object
let transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'prismtestserver@gmail.com',
pass: 'Answer30'
}
});
transporter.use('compile', hbs({
viewPath: 'templates',
extName: '.hbs'
}));

const memberArray = ['Justin', 'Andrew', 'Ben'];
let message = {
from: 'allen3just@yahoo.com',
to: 'example@example.com',
subject: 'Notification email',
template: '../lib/templates/document_deadline_notification',
context: {
Member: memberArray
}
};

transporter.sendMail(message, (err, info) => {
if (err) {
let message = {
from: 'prismtestserver@gmail.com',
to: 'allen3just@yahoo.com',
subject: 'Notification email',
template: '../templates/document_deadline_notification',
context: {
first: user.name.first,
last: user.name.last,
document: document.title
}
};
transporter.sendMail(message, (err, info) => {
if (err) {
console.log('Error occurred. ' + err.message);
return process.exit(1);
}
}

console.log('Preview URL: %s', nodemailer.getTestMessageUrl(info));
});
});

};
};
});
}, winston.error);
}
}, winston.error);
}
}
});
});
});
},
start: true,
timeZone: 'America/Los_Angeles'
});




// module.exports = job();
module.exports = job;
Loading