Files
habitica/website/server/libs/api-v2/firebase.js

84 lines
2.5 KiB
JavaScript

var Firebase = require('firebase');
var nconf = require('nconf');
var isProd = nconf.get('NODE_ENV') === 'production';
var firebaseConfig = nconf.get('FIREBASE');
var firebaseRef;
var isFirebaseEnabled = (nconf.get('NODE_ENV') === 'production') && (firebaseConfig.ENABLED === 'true');
import { TAVERN_ID } from '../../models/group';
// Setup
if(isFirebaseEnabled){
firebaseRef = new Firebase('https://' + firebaseConfig.APP + '.firebaseio.com');
// TODO what happens if an op is sent before client is authenticated?
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 = {};
api.updateGroupData = function(group){
if(!isFirebaseEnabled) return;
// TODO is throw ok? we don't have callbacks
if(!group) throw new Error('group is required.');
// Return in case of tavern (comparison working because we use string for _id)
if(group._id === TAVERN_ID) return;
firebaseRef.child('rooms/' + group._id)
.set({
name: group.name
});
};
api.addUserToGroup = function(groupId, userId){
if(!isFirebaseEnabled) return;
if(!userId || !groupId) throw new Error('groupId, userId are required.');
if(groupId === TAVERN_ID) return;
firebaseRef.child('members/' + groupId + '/' + userId)
.set(true);
firebaseRef.child('users/' + userId + '/rooms/' + groupId)
.set(true);
};
api.removeUserFromGroup = function(groupId, userId){
if(!isFirebaseEnabled) return;
if(!userId || !groupId) throw new Error('groupId, userId are required.');
if(groupId === TAVERN_ID) return;
firebaseRef.child('members/' + groupId + '/' + userId)
.remove();
firebaseRef.child('users/' + userId + '/rooms/' + groupId)
.remove();
};
api.deleteGroup = function(groupId){
if(!isFirebaseEnabled) return;
if(!groupId) throw new Error('groupId is required.');
if(groupId === TAVERN_ID) return;
firebaseRef.child('rooms/' + groupId)
.remove();
// TODO not really necessary as long as we only store room data,
// as empty objects are automatically deleted (/members/... in future...)
firebaseRef.child('members/' + groupId)
.remove();
};
// TODO not really necessary as long as we only store room data,
// as empty objects are automatically deleted
api.deleteUser = function(userId){
if(!isFirebaseEnabled) return;
if(!userId) throw new Error('userId is required.');
firebaseRef.child('users/' + userId)
.remove();
};