diff --git a/website/src/controllers/groups.js b/website/src/controllers/groups.js index 126858c6ac..6ce43e2be3 100644 --- a/website/src/controllers/groups.js +++ b/website/src/controllers/groups.js @@ -18,6 +18,7 @@ var isProd = nconf.get('NODE_ENV') === 'production'; var api = module.exports; var pushNotify = require('./pushNotifications'); var analytics = utils.analytics; +var firebase = require('../libs/firebase'); /* ------------------------------------------------------------------------ @@ -190,7 +191,10 @@ api.create = function(req, res, next) { async.waterfall([ function(cb){user.save(cb)}, function(saved,ct,cb){group.save(cb)}, - function(saved,ct,cb){saved.populate('members',nameFields,cb)} + function(saved,ct,cb){ + firebase.addUserToGroup(saved._id, user._id); + saved.populate('members', nameFields, cb); + } ],function(err,saved){ if (err) return next(err); res.json(saved); @@ -207,6 +211,7 @@ api.create = function(req, res, next) { group.save(cb); }, function(saved, count, cb){ + firebase.addUserToGroup(saved._id, user._id); saved.populate('members', nameFields, cb); } ], function(err, populated){ @@ -479,6 +484,8 @@ api.join = function(req, res, next) { group.save(cb); }, function(cb){ + firebase.addUserToGroup(group._id, user._id); + // TODO why query group once again? populateQuery(group.type, Group.findById(group._id)).exec(cb); } ], function(err, results){ diff --git a/website/src/libs/firebase.js b/website/src/libs/firebase.js index 3fc302fccb..958393cf6a 100644 --- a/website/src/libs/firebase.js +++ b/website/src/libs/firebase.js @@ -8,9 +8,37 @@ var firebaseConfig = nconf.get('FIREBASE'); if(isProd){ firebaseRef = new Firebase('https://' + firebaseConfig.APP + '.firebaseio.com'); - firebaseRef.on('value', function(snapshot){ - console.log(snapshot.val()); + firebaseRef.authWithCustomToken(firebaseConfig.SECRET, function(err, authData){ + // TODO it's ok to kill the server here? what if FB is offline? + if(err) throw new Error('Impossible to authenticate Firebase'); }); } -var api = module.exports = {}; \ No newline at end of file +var api = module.exports = {}; + +api.addUserToGroup = function(groupId, userId){ + if(!isProd) return; + + // TODO is throw ok? we don't have callbacks + if(!userId || !groupId) throw new Error('groupId, userId are required.'); + + firebaseRef.child('members/' + groupId + '/' + userId) + .set(true); + + firebaseRef.child('users/' + userId + '/' + groupId) + .set(true); +}; + +api.removeUserFromGroup = function(groupId, userId){ + if(!isProd) return; + + if(!userId || !groupId) throw new Error('groupId, userId are required.'); + + firebaseRef.child('members/' + groupId + '/' + userId) + .set(false); + + firebaseRef.child('users/' + userId + '/' + groupId) + .set(false); +}; + +api.userLeaves \ No newline at end of file diff --git a/website/src/models/group.js b/website/src/models/group.js index 56d64f6ec2..6c57b08168 100644 --- a/website/src/models/group.js +++ b/website/src/models/group.js @@ -5,6 +5,7 @@ var _ = require('lodash'); var async = require('async'); var logging = require('../logging'); var Challenge = require('./../models/challenge').model; +var firebase = require('../libs/firebase'); // NOTE any change to groups' members in MongoDB will have to be run through the API // changes made directly to the db will cause Firebase to get out of sync @@ -444,7 +445,12 @@ GroupSchema.methods.leave = function(user, keep, mainCb){ Group.update({_id:group._id}, update, cb); } } - ], mainCb); + ], function(err){ + if(err) return mainCb(err); + + firebase.removeUserFromGroup(group._id, user._id); + return mainCb(); + }); };