2015-06-16 22:52:06 -04:00
|
|
|
var express = require("express");
|
2015-06-25 14:05:20 -04:00
|
|
|
var hbs = require('express-hbs');
|
2015-07-18 15:13:10 -04:00
|
|
|
require('handlebars-form-helpers').register(hbs.handlebars);
|
2015-06-27 16:43:53 -04:00
|
|
|
var nodemailer = require('nodemailer');
|
2015-08-05 14:31:22 -04:00
|
|
|
var alertmonUtils = require('./alertmonUtils.js');
|
2015-06-16 22:52:06 -04:00
|
|
|
var fs = require("fs");
|
|
|
|
var bodyParser = require("body-parser");
|
|
|
|
var app = express();
|
2015-06-21 14:04:07 -04:00
|
|
|
var logfile = fs.createWriteStream('./db/log.log', {flags: 'a'});
|
|
|
|
|
2015-06-27 16:43:53 -04:00
|
|
|
// Setup email
|
|
|
|
var transporter = nodemailer.createTransport({
|
|
|
|
service: 'Gmail',
|
|
|
|
auth: {
|
2015-07-13 19:19:46 -04:00
|
|
|
user: 'alertmonitorfl@gmail.com',
|
|
|
|
pass: '6g*hkvVc%91oo3#$'
|
2015-06-27 16:43:53 -04:00
|
|
|
}
|
|
|
|
});
|
|
|
|
var mailOptions = {
|
2015-07-13 19:19:46 -04:00
|
|
|
from: 'Alert Monitor <alertmonitorfl@gmail.com>',
|
2015-07-29 14:08:29 -04:00
|
|
|
to: 'jody@kaplon.us,don@gettner.com',
|
2015-06-27 16:43:53 -04:00
|
|
|
subject: 'Alert received',
|
2015-07-13 19:19:46 -04:00
|
|
|
text: 'test alert' // Get custom text in here with device info.
|
2015-06-27 16:43:53 -04:00
|
|
|
};
|
|
|
|
|
2015-06-21 14:04:07 -04:00
|
|
|
|
|
|
|
var file = "./db/test.db";
|
|
|
|
var exists = fs.existsSync(file);
|
|
|
|
|
|
|
|
if(!exists) {
|
|
|
|
console.log("Creating DB file.");
|
|
|
|
fs.openSync(file, "w");
|
|
|
|
}
|
|
|
|
|
|
|
|
var sqlite3 = require("sqlite3").verbose();
|
|
|
|
var db = new sqlite3.Database(file);
|
|
|
|
|
|
|
|
db.serialize(function() {
|
|
|
|
if(!exists) {
|
2015-06-22 12:16:56 -04:00
|
|
|
db.run(
|
|
|
|
"CREATE TABLE Alerts (" +
|
|
|
|
"origJSON TEXT," +
|
|
|
|
"coreId TEXT," +
|
|
|
|
"status TEXT," +
|
2015-07-30 12:52:25 -04:00
|
|
|
"published_at TEXT) " +
|
|
|
|
"CREATE TABLE Cores (" +
|
|
|
|
"coreId TEXT PRIMARY KEY," +
|
|
|
|
"coreName TEXT," +
|
2015-08-03 14:21:26 -04:00
|
|
|
"locationDesc TEXT)"
|
2015-06-22 12:16:56 -04:00
|
|
|
);
|
2015-06-21 14:04:07 -04:00
|
|
|
}
|
|
|
|
});
|
2015-06-16 22:52:06 -04:00
|
|
|
|
2015-07-18 15:13:10 -04:00
|
|
|
app.use(bodyParser.json()); // Needed for JSON POST requests from Particle Cores.
|
|
|
|
app.use(bodyParser.urlencoded({ extended: false })); // Needed for web POST requests from edit form.
|
|
|
|
|
2015-06-25 14:05:20 -04:00
|
|
|
// Use `.hbs` for extensions and find partials in `views/partials`.
|
|
|
|
app.engine('hbs', hbs.express4({
|
|
|
|
partialsDir: __dirname + '/views/partials'
|
|
|
|
}));
|
|
|
|
app.set('view engine', 'hbs');
|
|
|
|
app.set('views', __dirname + '/views');
|
2015-06-16 22:52:06 -04:00
|
|
|
|
|
|
|
app.get('/', function(req, res){
|
2015-07-07 10:18:41 -04:00
|
|
|
var d = new Date();
|
|
|
|
console.log("GET /, " + JSON.stringify(d, 4));
|
2015-07-16 13:31:21 -04:00
|
|
|
var devIndexQry =
|
2015-07-30 10:08:09 -04:00
|
|
|
"select al.coreId, max(co.coreName) as coreName, max(co.locationDesc) as locationDesc, max(published_at) as MaxPub, max(status) as MaxStatus " +
|
|
|
|
"from Alerts al " +
|
|
|
|
"left join Cores co on al.coreId = co.coreId " +
|
|
|
|
"group by al.coreId;";
|
2015-07-16 13:31:21 -04:00
|
|
|
db.all(devIndexQry, function(err, rows){
|
2015-07-07 10:18:41 -04:00
|
|
|
if(err !== null) {
|
|
|
|
console.log(err);
|
|
|
|
} else {
|
|
|
|
//console.log(rows);
|
2015-07-28 14:07:56 -04:00
|
|
|
|
|
|
|
// Loop over elements in rows array, convert ugly UTC times to pretty local times.
|
|
|
|
rows.forEach(function(row){
|
2015-08-05 14:31:22 -04:00
|
|
|
row.MaxPubDate = alertmonUtils.getLocDateFromUTC(row.MaxPub);
|
|
|
|
row.MaxPubTime = alertmonUtils.getLocTimeFromUTC(row.MaxPub);
|
2015-07-28 14:07:56 -04:00
|
|
|
});
|
|
|
|
|
2015-07-07 10:18:41 -04:00
|
|
|
res.render('index', {cores: rows}, function(err, html) {
|
|
|
|
if(err !== null) {
|
|
|
|
console.log(err);
|
|
|
|
} else {
|
|
|
|
res.send(html);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2015-07-06 22:08:08 -04:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2015-07-18 15:13:10 -04:00
|
|
|
app.get('/core/edit/:id', function(req, res){
|
|
|
|
var d = new Date();
|
|
|
|
var coreId = req.params.id;
|
|
|
|
console.log("GET /core/edit/" + coreId + ", " + JSON.stringify(d, 4));
|
|
|
|
|
2015-07-30 08:28:16 -04:00
|
|
|
db.all("select coreName, locationDesc from Cores where coreId = ?;", coreId, function(err, rows){
|
2015-07-19 09:50:18 -04:00
|
|
|
if(err !== null) {
|
|
|
|
console.log(err);
|
|
|
|
} else {
|
|
|
|
res.render('core-edit', {values: rows}, function(err, html) {
|
|
|
|
if(err !== null) {
|
|
|
|
console.log(err);
|
|
|
|
} else {
|
|
|
|
res.send(html);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2015-07-18 15:13:10 -04:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
app.post('/core/edit/:id', function(req, res){
|
|
|
|
var d = new Date();
|
|
|
|
var coreId = req.params.id;
|
|
|
|
console.log("POST /core/edit/" + coreId + "body: " + JSON.stringify(req.body) + ", " + JSON.stringify(d, 4));
|
|
|
|
if (!req.body) {
|
|
|
|
return res.sendStatus(400);
|
|
|
|
} else {
|
2015-07-30 08:28:16 -04:00
|
|
|
// check existence of row in Cores table, if there update, otherwise insert.
|
|
|
|
var existQry = "SELECT coreId FROM Cores WHERE coreId = ?;"
|
2015-07-30 10:08:09 -04:00
|
|
|
db.get(existQry, coreId, function(err, row){
|
2015-07-30 08:28:16 -04:00
|
|
|
if(err) throw err;
|
2015-07-30 10:08:09 -04:00
|
|
|
console.log(typeof row);
|
|
|
|
console.log(row);
|
2015-07-30 08:28:16 -04:00
|
|
|
if(typeof row == "undefined") {
|
|
|
|
var insStmt = db.prepare("INSERT INTO Cores (coreId, coreName, locationDesc) VALUES (?, ?, ?);");
|
|
|
|
insStmt.run(
|
|
|
|
coreId,
|
|
|
|
req.body.deviceName,
|
|
|
|
req.body.locationDesc
|
|
|
|
);
|
|
|
|
insStmt.finalize();
|
|
|
|
} else {
|
|
|
|
if (req.body.deviceName !== "") {
|
|
|
|
var stmt = db.prepare("UPDATE Cores SET coreName = ? WHERE coreId = ?");
|
|
|
|
stmt.run(
|
|
|
|
req.body.deviceName,
|
|
|
|
coreId
|
|
|
|
);
|
|
|
|
stmt.finalize();
|
|
|
|
}
|
2015-07-18 15:13:10 -04:00
|
|
|
|
2015-07-30 08:28:16 -04:00
|
|
|
if (req.body.locationDesc !== "") {
|
|
|
|
var stmt = db.prepare("UPDATE Cores SET locationDesc = ? WHERE coreId = ?");
|
|
|
|
stmt.run(
|
|
|
|
req.body.locationDesc,
|
|
|
|
coreId
|
|
|
|
);
|
|
|
|
stmt.finalize();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2015-07-18 15:13:10 -04:00
|
|
|
|
2015-07-19 09:50:18 -04:00
|
|
|
res.redirect('https://particle.kaplon.us/');
|
2015-07-18 15:13:10 -04:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2015-07-06 22:08:08 -04:00
|
|
|
app.get('/core/:id', function(req, res){
|
2015-06-16 22:52:06 -04:00
|
|
|
//res.sendFile("/usr/src/app/index.html");
|
2015-06-25 14:05:20 -04:00
|
|
|
//fs.createReadStream('./log.log').pipe(res);
|
2015-07-03 21:38:40 -04:00
|
|
|
var d = new Date();
|
2015-07-07 10:18:41 -04:00
|
|
|
var coreId = req.params.id;
|
|
|
|
console.log("GET /core/" + coreId + ", " + JSON.stringify(d, 4));
|
2015-07-30 10:08:09 -04:00
|
|
|
var coreMsgQry = "SELECT al.coreId, al.published_at, al.status, co.coreName " +
|
|
|
|
"FROM Alerts al left join Cores co on al.coreId = co.coreId " +
|
|
|
|
"WHERE al.coreId = ? ORDER BY al.published_at DESC LIMIT 30;"
|
|
|
|
db.all(coreMsgQry, coreId, function(err, rows){
|
2015-07-07 10:18:41 -04:00
|
|
|
if(err !== null) {
|
|
|
|
console.log(err);
|
|
|
|
} else {
|
2015-07-07 14:16:07 -04:00
|
|
|
//console.log("SELECT coreId, published_at FROM Alerts WHERE coreId = '" + coreId + "' ORDER BY published_at DESC LIMIT 30;");
|
|
|
|
//console.log(rows);
|
2015-07-09 12:33:53 -04:00
|
|
|
|
|
|
|
// Loop over elements in rows array, convert ugly UTC times to pretty local times.
|
|
|
|
rows.forEach(function(row){
|
2015-08-05 14:31:22 -04:00
|
|
|
//var localDtTm = moment.utc(new Date(row.published_at));
|
|
|
|
//localDtTm = moment(localDtTm).tz('America/New_York').format('MM-DD-YYYY HH:mm:ss');
|
|
|
|
//row.published_at = localDtTm;
|
|
|
|
row.pubDate = alertmonUtils.getLocDateFromUTC(row.published_at);
|
|
|
|
row.pubTime = alertmonUtils.getLocTimeFromUTC(row.published_at);
|
2015-07-09 12:33:53 -04:00
|
|
|
});
|
|
|
|
|
2015-07-07 10:18:41 -04:00
|
|
|
res.render('core', {alerts: rows}, function(err, html) {
|
|
|
|
res.send(html);
|
|
|
|
});
|
|
|
|
}
|
2015-06-25 14:05:20 -04:00
|
|
|
});
|
|
|
|
//res.send;
|
2015-06-16 22:52:06 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
app.post('/', function(req, res){
|
|
|
|
var postEvent = req.body.postEvent;
|
|
|
|
var source = req.body.source;
|
|
|
|
console.log(req.body);
|
2015-06-21 14:04:07 -04:00
|
|
|
|
2015-07-14 17:40:23 -04:00
|
|
|
var innerDataJSON = JSON.parse(req.body.data);
|
2015-08-04 19:44:06 -04:00
|
|
|
var status = JSON.stringify(innerDataJSON.status, null, 4).slice(1,-1);
|
|
|
|
var coreid = JSON.stringify(req.body.coreid, null, 4).slice(1,-1);
|
|
|
|
var pubAt = JSON.stringify(req.body.published_at, null, 4).slice(1,-1);
|
2015-07-14 17:40:23 -04:00
|
|
|
var stmt = db.prepare("INSERT INTO Alerts (OrigJSON, coreid, published_at, status) VALUES (?, ?, ?, ?)");
|
2015-07-15 12:47:21 -04:00
|
|
|
stmt.run( // Use .slice to get rid of leading and trailing double quotes.
|
2015-06-22 12:16:56 -04:00
|
|
|
JSON.stringify(req.body, null, 4),
|
2015-08-04 19:44:06 -04:00
|
|
|
coreid,
|
|
|
|
pubAt,
|
|
|
|
status
|
2015-06-22 12:16:56 -04:00
|
|
|
);
|
2015-06-21 14:04:07 -04:00
|
|
|
stmt.finalize();
|
2015-07-03 21:38:40 -04:00
|
|
|
|
2015-07-13 19:19:46 -04:00
|
|
|
// Send emails on alerts only
|
2015-07-14 17:54:08 -04:00
|
|
|
if(status.toLowerCase().indexOf('alert') > -1){
|
2015-08-04 19:44:06 -04:00
|
|
|
mailOptions.text = 'An alert message was received: \n\n';
|
|
|
|
mailOptions.text = mailOptions.text + 'Status message, ' + status + '\n';
|
|
|
|
mailOptions.text = mailOptions.text + 'Published at, ' + pubAt + '\n';
|
|
|
|
mailOptions.text = mailOptions.text + 'From device, ' + coreid + '\n';
|
|
|
|
|
2015-07-13 19:19:46 -04:00
|
|
|
transporter.sendMail(mailOptions, function(error, info){
|
|
|
|
if(error){
|
|
|
|
console.log(error);
|
|
|
|
}else{
|
|
|
|
console.log('Message sent: ' + info.response);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2015-07-03 21:38:40 -04:00
|
|
|
|
2015-06-16 22:52:06 -04:00
|
|
|
//res.send(JSON.stringify(req.body, null, 4));
|
|
|
|
});
|
|
|
|
|
|
|
|
app.listen(3000, function() {
|
|
|
|
console.log("Started on PORT 3000");
|
|
|
|
})
|