From fa7437a4456627c26e5c11c25e256217e8933442 Mon Sep 17 00:00:00 2001 From: Simo Kinnunen Date: Tue, 8 Apr 2014 13:48:07 +0900 Subject: [PATCH] Add more advanced filtering to the device tracker. Make the group tracker work properly. --- lib/db/api.js | 2 +- lib/db/tables.js | 6 +- .../components/stf/device/device-service.js | 80 ++++++++++++++----- 3 files changed, 65 insertions(+), 23 deletions(-) diff --git a/lib/db/api.js b/lib/db/api.js index 5783f22e..74401199 100644 --- a/lib/db/api.js +++ b/lib/db/api.js @@ -34,7 +34,7 @@ dbapi.loadUser = function(email) { dbapi.loadGroup = function(email) { return db.run(r.table('devices').getAll(email, { - index: 'ownerEmail' + index: 'owner' })) } diff --git a/lib/db/tables.js b/lib/db/tables.js index cb967f32..46cf5e4d 100644 --- a/lib/db/tables.js +++ b/lib/db/tables.js @@ -1,3 +1,5 @@ +var r = require('rethinkdb') + module.exports = { users: { primaryKey: 'email' @@ -5,8 +7,8 @@ module.exports = { , devices: { primaryKey: 'serial' , indexes: { - ownerEmail: function(device) { - return device('owner')('email') + owner: function(device) { + return r.branch(device('present'), device('owner')('email'), r.literal()) } , lastHeartbeatAt: null } diff --git a/res/app/components/stf/device/device-service.js b/res/app/components/stf/device/device-service.js index f4204a81..0ded8e08 100644 --- a/res/app/components/stf/device/device-service.js +++ b/res/app/components/stf/device/device-service.js @@ -88,34 +88,59 @@ module.exports = function DeviceServiceFactory($rootScope, $http, socket) { } } - scopedSocket.on('device.add', function (data) { + function fetch(data) { + deviceService.load(data.serial) + .then(changeListener) + .catch(function() {}) + } + + function addListener(data) { var device = get(data) if (device) { modify(device, data) } - else if (options.insertPresent) { + else if (options.filter(data)) { insert(data) } - }) + } - scopedSocket.on('device.remove', function (data) { + function removeListener(data) { var device = get(data) if (device) { modify(device, data) - } - }) - - scopedSocket.on('device.change', function (data) { - var device = get(data) - if (device) { - if (options.removeAbsent) { + if (!options.filter(device)) { remove(device) } - else { - modify(device, data) + } + else { + if (options.filter(data)) { + insert(data) + // We've only got partial data + fetch(data) } } - }) + } + + function changeListener(data) { + var device = get(data) + if (device) { + modify(device, data) + if (!options.filter(device)) { + remove(device) + } + } + else { + if (options.filter(data)) { + insert(data) + // We've only got partial data + fetch(data) + } + } + } + + scopedSocket.on('device.add', addListener) + scopedSocket.on('device.remove', removeListener) + scopedSocket.on('device.change', changeListener) this.add = function(device) { remove(device) @@ -127,7 +152,9 @@ module.exports = function DeviceServiceFactory($rootScope, $http, socket) { deviceService.trackAll = function ($scope) { var tracker = new Tracker($scope, { - insertPresent: true + filter: function(device) { + return true + } }) oboe('/api/v1/devices') @@ -140,7 +167,9 @@ module.exports = function DeviceServiceFactory($rootScope, $http, socket) { deviceService.trackGroup = function ($scope) { var tracker = new Tracker($scope, { - removeAbsent: true + filter: function(device) { + return device.using + } }) oboe('/api/v1/group') @@ -151,15 +180,26 @@ module.exports = function DeviceServiceFactory($rootScope, $http, socket) { return tracker } - deviceService.get = function (serial, $scope) { - var tracker = new Tracker($scope, {}) - + deviceService.load = function(serial) { return $http.get('/api/v1/devices/' + serial) .then(function (response) { - tracker.add(response.data.device) return response.data.device }) } + deviceService.get = function (serial, $scope) { + var tracker = new Tracker($scope, { + filter: function(device) { + return device.serial === serial + } + }) + + return deviceService.load(serial) + .then(function(device) { + tracker.add(device) + return device + }) + } + return deviceService }