docs: function updateUser(userId, userData, callback) {
          return collection.findOne({_id: userId, type: {$ne: CONSTANTS.ORGANIZATION}, disabled: {$ne: true}})
              .then(function (oldUserData) {
                  if (!oldUserData) {
                      return Q.reject(new Error('no such user [' + userId + ']'));
                  }
  
                  oldUserData.email = userData.email || oldUserData.email;
  
  
                  if (userData.hasOwnProperty('data')) {
                      if (UTIL.isTrueObject(userData.data)) {
                          oldUserData.data = userData.data;
                      } else {
                          throw new Error('supplied userData.data is not an object [' + userData.data + ']');
                      }
                  }
  
                  if (userData.hasOwnProperty('settings')) {
                      if (UTIL.isTrueObject(userData.settings)) {
                          oldUserData.settings = userData.settings;
                      } else {
                          throw new Error('supplied userData.settings is not an object [' + userData.settings + ']');
                      }
                  }
  
                  if (userData.hasOwnProperty('canCreate')) {
                      oldUserData.canCreate = userData.canCreate === 'true' || userData.canCreate === true;
                  }
  
                  if (userData.hasOwnProperty('siteAdmin')) {
                      oldUserData.siteAdmin = userData.siteAdmin === 'true' || userData.siteAdmin === true;
                  }
  
                  oldUserData.displayName = userData.displayName || oldUserData.displayName;
  
                  if (userData.password) {
                      return Q.ninvoke(bcrypt, 'hash', userData.password, gmeConfig.authentication.salts)
                          .then(function (hash) {
                              oldUserData.passwordHash = hash;
                              return collection.updateOne({_id: userId}, oldUserData, {upsert: true});
                          });
                  } else {
                      return collection.updateOne({_id: userId}, oldUserData, {upsert: true});
                  }
              })
              .then(function () {
                  return getUser(userId);
              })
              .nodeify(callback);
      }