UNPKG

nightscout

Version:

Nightscout acts as a web-based CGM (Continuous Glucose Monitor) to allow multiple caregivers to remotely view a patients glucose data in realtime.

143 lines (108 loc) 3.23 kB
'use strict'; var moment = require('moment'); var find_options = require('./query'); function storage (collection, ctx) { function create (statuses, fn) { if (!Array.isArray(statuses)) { statuses = [statuses]; } const r = []; let errorOccurred = false; for (let i = 0; i < statuses.length; i++) { const obj = statuses[i]; if (errorOccurred) return; // Normalize all dates to UTC const d = moment(obj.created_at).isValid() ? moment.parseZone(obj.created_at) : moment(); obj.created_at = d.toISOString(); obj.utcOffset = d.utcOffset(); api().insertOne(obj, function(err, results) { if (err !== null && err.message) { console.log('Error inserting the device status object', err.message); errorOccurred = true; fn(err.message, null); return; } if (!err) { if (!obj._id) obj._id = results.insertedIds[0]._id; r.push(obj); ctx.bus.emit('data-update', { type: 'devicestatus' , op: 'update' , changes: ctx.ddata.processRawDataForRuntime([obj]) }); // Last object! Return results if (i == statuses.length - 1) { fn(null, r); ctx.bus.emit('data-received'); } } }); }; } function last (fn) { return list({ count: 1 }, function(err, entries) { if (entries && entries.length > 0) { fn(err, entries[0]); } else { fn(err, null); } }); } function query_for (opts) { return find_options(opts, storage.queryOpts); } function list (opts, fn) { // these functions, find, sort, and limit, are used to // dynamically configure the request, based on the options we've // been given // determine sort options function sort () { return opts && opts.sort || { created_at: -1 }; } // configure the limit portion of the current query function limit () { if (opts && opts.count) { return this.limit(parseInt(opts.count)); } return this; } // handle all the results function toArray (err, entries) { fn(err, entries); } // now just stitch them all together limit.call(api() .find(query_for(opts)) .sort(sort()) ).toArray(toArray); } function remove (opts, fn) { function removed (err, stat) { ctx.bus.emit('data-update', { type: 'devicestatus' , op: 'remove' , count: stat.result.n , changes: opts.find._id }); fn(err, stat); } return api().remove( query_for(opts), removed); } function api () { return ctx.store.collection(collection); } api.list = list; api.create = create; api.query_for = query_for; api.last = last; api.remove = remove; api.aggregate = require('./aggregate')({}, api); api.indexedFields = [ 'created_at' , 'NSCLIENT_ID' ]; return api; } storage.queryOpts = { dateField: 'created_at' }; module.exports = storage;