diff --git a/bin/post-devicestatus.sh b/bin/post-devicestatus.sh new file mode 100755 index 00000000..e53c0782 --- /dev/null +++ b/bin/post-devicestatus.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +curl -H "Content-Type: application/json" -XPOST 'http://localhost:1337/api/v1/devicestatus/' -d '{ + "uploaderBattery": 55 +}' diff --git a/env.js b/env.js index 7e001aad..c851aaa7 100644 --- a/env.js +++ b/env.js @@ -27,6 +27,8 @@ function config ( ) { env.mongo_collection = process.env.CUSTOMCONNSTR_mongo_collection || process.env.MONGO_COLLECTION || 'entries'; env.settings_collection = process.env.CUSTOMCONNSTR_mongo_settings_collection || 'settings'; env.treatments_collection = process.env.CUSTOMCONNSTR_mongo_treatments_collection || 'treatments'; + env.devicestatus_collection = process.env.CUSTOMCONNSTR_mongo_devicestatus_collection || 'devicestatus'; + var shasum = crypto.createHash('sha1'); var useSecret = (process.env.API_SECRET && process.env.API_SECRET.length > 0); env.api_secret = null; diff --git a/lib/api/devicestatus/index.js b/lib/api/devicestatus/index.js new file mode 100644 index 00000000..af67dc7b --- /dev/null +++ b/lib/api/devicestatus/index.js @@ -0,0 +1,47 @@ +'use strict'; + +var consts = require('../../constants'); + +function configure (app, wares, devicestatus) { + var express = require('express'), + api = express.Router( ); + + // invoke common middleware + api.use(wares.sendJSONStatus); + // text body types get handled as raw buffer stream + api.use(wares.bodyParser.raw( )); + // json body types get handled as parsed json + api.use(wares.bodyParser.json( )); + // also support url-encoded content-type + api.use(wares.bodyParser.urlencoded({ extended: true })); + + // List settings available + api.get('/devicestatus/', function(req, res) { + devicestatus.list(function (err, profiles) { + return res.json(profiles); + }); + }); + + function config_authed (app, api, wares, devicestatus) { + + api.post('/devicestatus/', /*TODO: auth disabled for quick UI testing... wares.verifyAuthorization, */ function(req, res) { + var obj = req.body; + devicestatus.create(obj, function (err, created) { + if (err) + res.sendJSONStatus(res, consts.HTTP_INTERNAL_ERROR, 'Mongo Error', err); + else + res.json(created); + }); + }); + + } + + if (app.enabled('api') || true /*TODO: auth disabled for quick UI testing...*/) { + config_authed(app, api, wares, devicestatus); + } + + return api; +} + +module.exports = configure; + diff --git a/lib/api/index.js b/lib/api/index.js index 323eff38..a1e05466 100644 --- a/lib/api/index.js +++ b/lib/api/index.js @@ -1,6 +1,6 @@ 'use strict'; -function create (env, entries, settings, treatments) { +function create (env, entries, settings, treatments, devicestatus) { var express = require('express'), app = express( ) ; @@ -30,6 +30,7 @@ function create (env, entries, settings, treatments) { app.use('/', require('./entries/')(app, wares, entries)); app.use('/', require('./settings/')(app, wares, settings)); app.use('/', require('./treatments/')(app, wares, treatments)); + app.use('/', require('./devicestatus/')(app, wares, devicestatus)); // Status app.use('/', require('./status')(app, wares)); diff --git a/lib/devicestatus.js b/lib/devicestatus.js new file mode 100644 index 00000000..eeaffb55 --- /dev/null +++ b/lib/devicestatus.js @@ -0,0 +1,34 @@ +'use strict'; + +function configure (collection, storage) { + + function create (obj, fn) { + obj.created_at = (new Date( )).toISOString( ); + api( ).insert(obj, function (err, doc) { + fn(null, doc); + }); + } + + function tail(fn) { + return api( ).find({ }).sort({created_at: -1}).limit(1).toArray(function(err, entries) { + if (entries && entries.length > 0) + fn(err, entries[0]); + else + fn(err, null); + }); + } + + function list (fn) { + return api( ).find({ }).sort({created_at: -1}).toArray(fn); + } + + function api ( ) { + return storage.pool.db.collection(collection); + } + + api.list = list; + api.create = create; + api.tail = tail; + return api; +} +module.exports = configure; diff --git a/lib/pebble.js b/lib/pebble.js index 2eaef9c7..2dc7f7fe 100644 --- a/lib/pebble.js +++ b/lib/pebble.js @@ -22,6 +22,7 @@ function directionToTrend (direction) { function pebble (req, res) { var FORTY_MINUTES = 2400000; var cgmData = [ ]; + var uploaderBattery; function requestMetric() { var units = req.query.units; @@ -60,6 +61,7 @@ function pebble (req, res) { // obj.y = element.sgv; // obj.x = element.date; obj.datetime = element.date; + obj.battery = "" + uploaderBattery; // obj.date = element.date.toString( ); cgmData.push(obj); } @@ -70,11 +72,20 @@ function pebble (req, res) { res.end( ); // collection.db.close(); } - req.entries.list({count: 2}, get_latest); + req.devicestatus.tail(function(err, value) { + if (!err && value) { + uploaderBattery = value.uploaderBattery; + } else { + console.error("req.devicestatus.tail", err); + } + + req.entries.list({count: 2}, get_latest); + }); } -function configure (entries) { +function configure (entries, devicestatus) { function middle (req, res, next) { req.entries = entries; + req.devicestatus = devicestatus; next( ); } return [middle, pebble]; diff --git a/server.js b/server.js index d9281689..282e9e6b 100644 --- a/server.js +++ b/server.js @@ -33,7 +33,8 @@ var pushover = require('./lib/pushover')(env); var entries = require('./lib/entries')(env.mongo_collection, store); var settings = require('./lib/settings')(env.settings_collection, store); var treatments = require('./lib/treatments')(env.treatments_collection, store, pushover); -var api = require('./lib/api/')(env, entries, settings, treatments); +var devicestatus = require('./lib/devicestatus')(env.devicestatus_collection, store); +var api = require('./lib/api/')(env, entries, settings, treatments, devicestatus); var pebble = require('./lib/pebble'); /////////////////////////////////////////////////// @@ -53,7 +54,7 @@ app.enable('trust proxy'); // Allows req.secure test on heroku https connections app.use('/api/v1', api); // pebble data -app.get('/pebble', pebble(entries)); +app.get('/pebble', pebble(entries, devicestatus)); //app.get('/package.json', software);