diff --git a/lib/db/api.js b/lib/db/api.js index 0d201ac7..bf3f9a94 100644 --- a/lib/db/api.js +++ b/lib/db/api.js @@ -1,10 +1,13 @@ var r = require('rethinkdb') +var Promise = require('bluebird') var db = require('./') var wire = require('../wire') var wireutil = require('../wire/util') -module.exports.saveUserAfterLogin = function(user) { +var dbapi = Object.create(null) + +dbapi.saveUserAfterLogin = function(user) { return db.run(r.table('users').get(user.email).update({ name: user.name , lastLoggedInAt: r.now() @@ -23,11 +26,11 @@ module.exports.saveUserAfterLogin = function(user) { }) } -module.exports.loadUser = function(email) { +dbapi.loadUser = function(email) { return db.run(r.table('users').get(email)) } -module.exports.saveDeviceLog = function(serial, entry) { +dbapi.saveDeviceLog = function(serial, entry) { return db.run(r.table('logs').insert({ serial: entry.serial , timestamp: r.epochTime(entry.timestamp) @@ -38,7 +41,7 @@ module.exports.saveDeviceLog = function(serial, entry) { })) } -module.exports.saveDeviceStatus = function(serial, status) { +dbapi.saveDeviceStatus = function(serial, status) { return db.run(r.table('devices').get(serial).update({ status: status.status , provider: status.provider @@ -58,7 +61,7 @@ module.exports.saveDeviceStatus = function(serial, status) { }) } -module.exports.saveDeviceIdentity = function(serial, identity) { +dbapi.saveDeviceIdentity = function(serial, identity) { return db.run(r.table('devices').get(serial).update({ platform: identity.platform , manufacturer: identity.manufacturer @@ -71,10 +74,24 @@ module.exports.saveDeviceIdentity = function(serial, identity) { })) } -module.exports.loadDevices = function() { +dbapi.loadDevices = function() { return db.run(r.table('devices')) } -module.exports.loadDevice = function(serial) { +dbapi.loadDevice = function(serial) { return db.run(r.table('devices').get(serial)) } + +dbapi.ensureDeviceSaved = function(serial) { + return dbapi.loadDevice(serial) + .then(function(device) { + if (!device) { + return Promise.delay(100).then(function() { + return dbapi.loadDevice(serial) + }) + } + return device + }) +} + +module.exports = dbapi diff --git a/lib/roles/processor.js b/lib/roles/processor.js index d9032c97..00f34ee4 100644 --- a/lib/roles/processor.js +++ b/lib/roles/processor.js @@ -43,7 +43,10 @@ module.exports = function(options) { appDealer.send([channel, data]) }) .on(wire.DevicePokeMessage, function(channel, message) { - devDealer.send([message.channel, wireutil.makeProbeMessage()]) + dbapi.ensureDeviceSaved(message.serial) + .then(function() { + devDealer.send([message.channel, wireutil.makeProbeMessage()]) + }) }) .on(wire.DeviceIdentityMessage, function(channel, message) { dbapi.saveDeviceIdentity(message.serial, message)