From 277c9b401ad0a3628908251d57c32b5106bf50e4 Mon Sep 17 00:00:00 2001 From: Simo Kinnunen Date: Fri, 7 Feb 2014 11:55:41 +0900 Subject: [PATCH] Make GroupService keep the list of members up to date. --- lib/db/api.js | 6 ++++ lib/db/tables.js | 5 ++++ lib/roles/app.js | 21 ++++++++++++++ res/app/scripts/services/GroupService.js | 36 +++++++++++++++++------- 4 files changed, 58 insertions(+), 10 deletions(-) diff --git a/lib/db/api.js b/lib/db/api.js index ae753523..f09207f7 100644 --- a/lib/db/api.js +++ b/lib/db/api.js @@ -30,6 +30,12 @@ dbapi.loadUser = function(email) { return db.run(r.table('users').get(email)) } +dbapi.loadGroupMembers = function(email) { + return db.run(r.table('devices').getAll(email, { + index: 'ownerEmail' + })('serial')) +} + dbapi.saveDeviceLog = function(serial, entry) { return db.run(r.table('logs').insert({ serial: entry.serial diff --git a/lib/db/tables.js b/lib/db/tables.js index d692d8a5..de66ac90 100644 --- a/lib/db/tables.js +++ b/lib/db/tables.js @@ -4,6 +4,11 @@ module.exports = { } , devices: { primaryKey: 'serial' + , indexes: { + ownerEmail: function(device) { + return device('owner')('email') + } + } } , logs: { primaryKey: 'id' diff --git a/lib/roles/app.js b/lib/roles/app.js index f4cbede5..cff2d22e 100644 --- a/lib/roles/app.js +++ b/lib/roles/app.js @@ -101,6 +101,27 @@ module.exports = function(options) { }) }) + app.get('/api/v1/group', function(req, res) { + dbapi.loadGroupMembers(req.user.email) + .then(function(cursor) { + return Promise.promisify(cursor.toArray, cursor)() + .then(function(list) { + res.json({ + success: true + , group: { + members: list + } + }) + }) + }) + .catch(function(err) { + log.error('Failed to load group: ', err.stack) + res.json(500, { + success: false + }) + }) + }) + app.get('/api/v1/devices', function(req, res) { dbapi.loadDevices() .then(function(cursor) { diff --git a/res/app/scripts/services/GroupService.js b/res/app/scripts/services/GroupService.js index 81c24ed1..371be912 100644 --- a/res/app/scripts/services/GroupService.js +++ b/res/app/scripts/services/GroupService.js @@ -1,9 +1,18 @@ define(['./_module', 'lodash'], function(app, _) { - function GroupServiceFactory($rootScope, socket, userService) { + function GroupServiceFactory($rootScope, $http, socket, userService) { var groupService = { - members: [] } + groupService.group = (function() { + var groupPromise = $http.get('/api/v1/group') + .then(function(response) { + return response.data.group + }) + return function() { + return groupPromise + } + })() + userService.user().then(function(user) { function ownerFilter(listener) { return function(data) { @@ -14,20 +23,26 @@ define(['./_module', 'lodash'], function(app, _) { } socket.on('group.join', ownerFilter(function(data) { - groupService.members.push(data.serial) - console.log('group.join', data) - $rootScope.$digest() + groupService.group().then(function(group) { + group.members.push(data.serial) + console.log('group.join', data) + $rootScope.$digest() + }) })) socket.on('group.leave', ownerFilter(function(data) { - _.pull(groupService.members, data.serial) - console.log('group.leave', data) - $rootScope.$digest() + groupService.group().then(function(group) { + _.pull(group.members, data.serial) + console.log('group.leave', data) + $rootScope.$digest() + }) })) socket.on('device.absent', /* unfiltered */ function(data) { - _.pull(groupService.members, data.serial) - $rootScope.$digest() + groupService.group().then(function(group) { + _.pull(group.members, data.serial) + $rootScope.$digest() + }) }) }) @@ -48,6 +63,7 @@ define(['./_module', 'lodash'], function(app, _) { app.factory('GroupService' , [ '$rootScope' + , '$http' , 'SocketService' , 'UserService' , GroupServiceFactory