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-08-07 11:20:22 -04:00
text : 'test alert' // Get custom text later on email generation.
2015-06-27 16:43:53 -04:00
} ;
2015-06-21 14:04:07 -04:00
2015-08-13 12:34:19 -04:00
var file = "./db/alertmon.db" ;
2015-06-21 14:04:07 -04:00
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-08-24 13:40:41 -04:00
"published_at TEXT)"
) ;
db . run (
2015-07-30 12:52:25 -04:00
"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-08-08 09:47:21 -04:00
"select al.coreId, max(co.coreName) as coreName, max(co.locationDesc) as locationDesc, mpub.MaxPub, al.status as MaxStatus " +
"from Alerts al " +
"inner join (select coreId, max(published_at) as MaxPub from Alerts group by coreId) mpub on al.coreId = mpub.coreId and al.published_at = mpub.MaxPub " +
"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-08-08 09:47:21 -04:00
if ( row . MaxStatus . toLowerCase ( ) . indexOf ( 'alert' ) > - 1 ) {
row . rowClass = 'alert-row' ;
} else { row . rowClass = 'non-alert-row' ; }
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-08-07 11:20:22 -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
row . pubDate = alertmonUtils . getLocDateFromUTC ( row . published _at ) ;
row . pubTime = alertmonUtils . getLocTimeFromUTC ( row . published _at ) ;
2015-08-07 11:20:22 -04:00
if ( row . status . toLowerCase ( ) . indexOf ( 'alert' ) > - 1 ) {
2015-08-07 12:00:08 -04:00
row . rowClass = 'alert-row' ;
} else { row . rowClass = 'non-alert-row' ; }
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
} ) ;
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-08-07 11:20:22 -04:00
stmt . run (
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' ;
2015-08-05 14:46:33 -04:00
mailOptions . text = mailOptions . text + 'Published at, ' + alertmonUtils . getLocDateFromUTC ( pubAt ) + ' ' + alertmonUtils . getLocTimeFromUTC ( pubAt ) + '\n' ;
2015-08-07 11:20:22 -04:00
//mailOptions.text = mailOptions.text + 'From device, ' + alertmonUtils.getCoreNameFromCoreId(db, coreid) + '\n';
var nameQry = 'SELECT coreName FROM Cores WHERE coreId = ?;'
db . get ( nameQry , coreid , function ( err , row ) {
if ( ( err ) || ( typeof row == undefined ) ) {
// Don't care about this error or empty result set, still need to send email.
row . coreName = '# No Name #' ;
2015-07-13 19:19:46 -04:00
}
2015-08-07 11:20:22 -04:00
mailOptions . text = mailOptions . text + 'From device, ' + row . coreName + '\n' ;
transporter . sendMail ( mailOptions , function ( error , info ) {
if ( error ) {
console . log ( error ) ;
} else {
console . log ( 'Message sent: ' + info . response ) ;
}
} ) ;
2015-07-13 19:19:46 -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" ) ;
} )