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 ', //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 status, published_at " + "from Alerts " + "order by published_at desc " + "limit 2" 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.pubDate = courtsopenUtils.getLocDateFromUTC(row.published_at); row.pubTime = courtsopenUtils.getLocTimeFromUTC(row.published_at); if(row.status.toLowerCase().indexOf('closed') > -1){ row.statusClass = 'closed'; } else { row.statusClass = 'open'; } }); res.render('index', {values: 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"); })