courtsopen/server.js

248 lines
9.0 KiB
JavaScript

var express = require("express");
var hbs = require('express-hbs');
require('handlebars-form-helpers').register(hbs.handlebars);
//var nodemailer = require('nodemailer');
var courtsopenUtils = require('./courtsopenUtils.js');
var fs = require("fs");
var bodyParser = require("body-parser");
var app = express();
var logfile = fs.createWriteStream('./db/log.log', {flags: 'a'});
// Setup email
//var transporter = nodemailer.createTransport({
//service: 'Gmail',
//auth: {
//user: 'alertmonitorfl@gmail.com',
//pass: '6g*hkvVc%91oo3#$'
//}
//});
//var mailOptions = {
//from: 'Alert Monitor <alertmonitorfl@gmail.com>',
//to: 'jody@kaplon.us,don@gettner.com',
//subject: 'Alert received',
//text: 'test alert' // Get custom text later on email generation.
//};
var file = "./db/courtsopen.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) {
// Can't create multiple tables w/one statement, semicolons not allowed.
db.run(
"CREATE TABLE Alerts (" +
"origJSON TEXT," +
"coreId TEXT," +
"status TEXT," +
"published_at TEXT)"
);
db.run(
"CREATE TABLE Cores (" +
"coreId TEXT PRIMARY KEY," +
"coreName TEXT," +
"locationDesc TEXT)"
);
}
});
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.
// 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');
app.get('/', function(req, res){
var d = new Date();
console.log("GET /, " + JSON.stringify(d, 4));
var devIndexQry =
"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 ";
db.all(devIndexQry, function(err, rows){
if(err !== null) {
console.log(err);
} else {
//console.log(rows);
// Loop over elements in rows array, convert ugly UTC times to pretty local times.
rows.forEach(function(row){
row.MaxPubDate = courtsopenUtils.getLocDateFromUTC(row.MaxPub);
row.MaxPubTime = courtsopenUtils.getLocTimeFromUTC(row.MaxPub);
if(row.MaxStatus.toLowerCase().indexOf('alert') > -1){
row.rowClass = 'alert-row';
} else { row.rowClass = 'non-alert-row'; }
});
res.render('index', {cores: rows}, function(err, html) {
if(err !== null) {
console.log(err);
} else {
res.send(html);
}
});
}
});
});
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));
db.all("select coreName, locationDesc from Cores where coreId = ?;", coreId, function(err, rows){
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);
}
});
}
});
});
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 {
// check existence of row in Cores table, if there update, otherwise insert.
var existQry = "SELECT coreId FROM Cores WHERE coreId = ?;"
db.get(existQry, coreId, function(err, row){
if(err) throw err;
console.log(typeof row);
console.log(row);
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();
}
if (req.body.locationDesc !== "") {
var stmt = db.prepare("UPDATE Cores SET locationDesc = ? WHERE coreId = ?");
stmt.run(
req.body.locationDesc,
coreId
);
stmt.finalize();
}
}
});
res.redirect('https://tenniscourtsopen.com/');
}
});
app.get('/core/:id', function(req, res){
//res.sendFile("/usr/src/app/index.html");
//fs.createReadStream('./log.log').pipe(res);
var d = new Date();
var coreId = req.params.id;
console.log("GET /core/" + coreId + ", " + JSON.stringify(d, 4));
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){
if(err !== null) {
console.log(err);
} else {
//console.log("SELECT coreId, published_at FROM Alerts WHERE coreId = '" + coreId + "' ORDER BY published_at DESC LIMIT 30;");
//console.log(rows);
// Loop over elements in rows array, convert ugly UTC times to pretty local times.
rows.forEach(function(row){
row.pubDate = courtsopenUtils.getLocDateFromUTC(row.published_at);
row.pubTime = courtsopenUtils.getLocTimeFromUTC(row.published_at);
if(row.status.toLowerCase().indexOf('alert') > -1){
row.rowClass = 'alert-row';
} else { row.rowClass = 'non-alert-row'; }
});
res.render('core', {alerts: rows}, function(err, html) {
res.send(html);
});
}
});
});
app.post('/', function(req, res){
var postEvent = req.body.postEvent;
var source = req.body.source;
console.log(req.body);
var innerDataJSON = JSON.parse(req.body.data);
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);
var stmt = db.prepare("INSERT INTO Alerts (OrigJSON, coreid, published_at, status) VALUES (?, ?, ?, ?)");
stmt.run(
JSON.stringify(req.body, null, 4),
coreid,
pubAt,
status
);
stmt.finalize();
// Send emails on alerts only
//if(status.toLowerCase().indexOf('alert') > -1){
//mailOptions.text = 'An alert message was received: \n\n';
//mailOptions.text = mailOptions.text + 'Status message, ' + status + '\n';
//mailOptions.text = mailOptions.text + 'Published at, ' + courtsopenUtils.getLocDateFromUTC(pubAt) + ' ' + courtsopenUtils.getLocTimeFromUTC(pubAt) + '\n';
//mailOptions.text = mailOptions.text + 'From device, ' + courtsopenUtils.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 #';
//}
//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);
//}
//});
//});
//}
//res.send(JSON.stringify(req.body, null, 4));
});
app.listen(3000, function() {
console.log("Started on PORT 3000");
})