2014-02-26 21:04:20 -05:00
|
|
|
'use strict';
|
|
|
|
|
|
2014-09-19 15:54:13 -04:00
|
|
|
var async = require('async'),
|
2013-09-17 15:38:50 -04:00
|
|
|
nconf = require('nconf'),
|
2013-11-30 13:13:18 -05:00
|
|
|
gravatar = require('gravatar'),
|
2013-12-01 16:21:19 -05:00
|
|
|
|
2013-12-01 10:52:50 -05:00
|
|
|
plugins = require('./plugins'),
|
2013-12-02 17:10:26 -05:00
|
|
|
db = require('./database'),
|
2013-11-18 16:22:43 -05:00
|
|
|
meta = require('./meta'),
|
2013-12-02 19:40:11 -05:00
|
|
|
groups = require('./groups'),
|
2014-08-12 21:41:23 -04:00
|
|
|
Password = require('./password');
|
2013-11-22 14:08:02 -05:00
|
|
|
|
2013-05-09 01:04:15 -04:00
|
|
|
(function(User) {
|
2014-02-26 21:04:20 -05:00
|
|
|
|
2014-03-12 20:53:42 -04:00
|
|
|
User.email = require('./user/email');
|
|
|
|
|
User.notifications = require('./user/notifications');
|
|
|
|
|
User.reset = require('./user/reset');
|
2014-11-17 13:37:07 -05:00
|
|
|
User.digest = require('./user/digest');
|
2014-03-12 20:53:42 -04:00
|
|
|
|
2014-05-11 11:45:20 -04:00
|
|
|
require('./user/auth')(User);
|
2014-03-17 21:47:37 -04:00
|
|
|
require('./user/create')(User);
|
2014-11-14 21:47:24 -05:00
|
|
|
require('./user/posts')(User);
|
2014-03-12 20:53:42 -04:00
|
|
|
require('./user/follow')(User);
|
|
|
|
|
require('./user/profile')(User);
|
|
|
|
|
require('./user/admin')(User);
|
2014-03-15 15:09:54 -04:00
|
|
|
require('./user/delete')(User);
|
2014-03-12 20:53:42 -04:00
|
|
|
require('./user/settings')(User);
|
2014-03-12 22:11:48 -04:00
|
|
|
require('./user/search')(User);
|
2014-03-18 15:35:48 -04:00
|
|
|
require('./user/jobs')(User);
|
2013-08-23 13:14:36 -04:00
|
|
|
|
2013-05-09 01:04:15 -04:00
|
|
|
User.getUserField = function(uid, field, callback) {
|
2014-05-04 17:26:56 -04:00
|
|
|
User.getUserFields(uid, [field], function(err, user) {
|
|
|
|
|
callback(err, user ? user[field] : null);
|
|
|
|
|
});
|
2013-11-04 01:57:58 +02:00
|
|
|
};
|
2013-07-05 16:37:45 -05:00
|
|
|
|
2013-05-09 01:04:15 -04:00
|
|
|
User.getUserFields = function(uid, fields, callback) {
|
2014-05-04 17:26:56 -04:00
|
|
|
User.getMultipleUserFields([uid], fields, function(err, users) {
|
|
|
|
|
callback(err, users ? users[0] : null);
|
|
|
|
|
});
|
2013-11-04 01:57:58 +02:00
|
|
|
};
|
2013-05-09 01:04:15 -04:00
|
|
|
|
|
|
|
|
User.getMultipleUserFields = function(uids, fields, callback) {
|
2014-05-04 17:26:56 -04:00
|
|
|
var fieldsToRemove = [];
|
|
|
|
|
function addField(field) {
|
|
|
|
|
if (fields.indexOf(field) === -1) {
|
|
|
|
|
fields.push(field);
|
|
|
|
|
fieldsToRemove.push(field);
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-03-11 03:39:41 -04:00
|
|
|
|
|
|
|
|
if (!Array.isArray(uids) || !uids.length) {
|
2013-09-11 12:49:54 -04:00
|
|
|
return callback(null, []);
|
2013-05-16 13:13:46 -04:00
|
|
|
}
|
|
|
|
|
|
2014-03-11 03:39:41 -04:00
|
|
|
var keys = uids.map(function(uid) {
|
|
|
|
|
return 'user:' + uid;
|
|
|
|
|
});
|
2013-07-05 19:08:59 -04:00
|
|
|
|
2014-11-19 10:38:43 -05:00
|
|
|
if (fields.indexOf('uid') === -1) {
|
|
|
|
|
fields.push('uid');
|
|
|
|
|
}
|
2014-05-04 17:26:56 -04:00
|
|
|
|
|
|
|
|
if (fields.indexOf('picture') !== -1) {
|
|
|
|
|
addField('email');
|
|
|
|
|
addField('gravatarpicture');
|
|
|
|
|
addField('uploadedpicture');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
db.getObjectsFields(keys, fields, function(err, users) {
|
|
|
|
|
if (err) {
|
|
|
|
|
return callback(err);
|
|
|
|
|
}
|
2014-08-26 15:55:17 -04:00
|
|
|
|
|
|
|
|
modifyUserData(users, fieldsToRemove, callback);
|
2014-05-04 17:26:56 -04:00
|
|
|
});
|
2013-11-04 01:57:58 +02:00
|
|
|
};
|
2013-05-09 01:04:15 -04:00
|
|
|
|
|
|
|
|
User.getUserData = function(uid, callback) {
|
2014-03-11 03:39:41 -04:00
|
|
|
User.getUsersData([uid], function(err, users) {
|
|
|
|
|
callback(err, users ? users[0] : null);
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
User.getUsersData = function(uids, callback) {
|
|
|
|
|
|
|
|
|
|
if (!Array.isArray(uids) || !uids.length) {
|
|
|
|
|
return callback(null, []);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var keys = uids.map(function(uid) {
|
|
|
|
|
return 'user:' + uid;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
db.getObjects(keys, function(err, users) {
|
|
|
|
|
if (err) {
|
2013-12-02 17:10:26 -05:00
|
|
|
return callback(err);
|
|
|
|
|
}
|
2013-09-11 13:02:55 -04:00
|
|
|
|
2014-08-26 15:55:17 -04:00
|
|
|
modifyUserData(users, [], callback);
|
2014-05-04 17:26:56 -04:00
|
|
|
});
|
|
|
|
|
};
|
2014-03-12 16:11:33 -04:00
|
|
|
|
2014-08-26 15:55:17 -04:00
|
|
|
function modifyUserData(users, fieldsToRemove, callback) {
|
2014-05-04 17:26:56 -04:00
|
|
|
users.forEach(function(user) {
|
|
|
|
|
if (!user) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (user.password) {
|
2014-11-05 23:58:46 -05:00
|
|
|
user.password = undefined;
|
2014-05-04 17:26:56 -04:00
|
|
|
}
|
|
|
|
|
|
2014-05-10 18:41:28 -04:00
|
|
|
if (!parseInt(user.uid, 10)) {
|
2014-09-20 18:07:46 -04:00
|
|
|
user.uid = 0;
|
2014-05-04 17:26:56 -04:00
|
|
|
user.username = '[[global:guest]]';
|
|
|
|
|
user.userslug = '';
|
2014-10-03 15:28:46 -04:00
|
|
|
user.picture = User.createGravatarURLFromEmail('');
|
2014-05-04 17:26:56 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (user.picture) {
|
|
|
|
|
if (user.picture === user.uploadedpicture) {
|
2014-05-30 15:22:52 -04:00
|
|
|
user.picture = user.picture.indexOf('http') === -1 ? nconf.get('relative_path') + user.picture : user.picture;
|
2014-05-04 17:26:56 -04:00
|
|
|
} else {
|
|
|
|
|
user.picture = User.createGravatarURLFromEmail(user.email);
|
2014-03-06 15:32:06 -05:00
|
|
|
}
|
2014-05-04 17:26:56 -04:00
|
|
|
}
|
2014-03-11 03:39:41 -04:00
|
|
|
|
2014-05-04 17:26:56 -04:00
|
|
|
for(var i=0; i<fieldsToRemove.length; ++i) {
|
|
|
|
|
user[fieldsToRemove[i]] = undefined;
|
|
|
|
|
}
|
2013-05-09 01:04:15 -04:00
|
|
|
});
|
2014-08-26 15:55:17 -04:00
|
|
|
|
|
|
|
|
plugins.fireHook('filter:users.get', users, callback);
|
2014-05-04 17:26:56 -04:00
|
|
|
}
|
2013-05-09 01:04:15 -04:00
|
|
|
|
2014-02-12 17:16:16 -05:00
|
|
|
User.updateLastOnlineTime = function(uid, callback) {
|
2014-06-08 16:06:42 -04:00
|
|
|
callback = callback || function() {};
|
2014-09-16 11:06:10 -04:00
|
|
|
User.getUserFields(uid, ['status', 'lastonline'], function(err, userData) {
|
2014-11-28 14:25:11 -05:00
|
|
|
var now = Date.now();
|
2014-11-28 20:31:47 -05:00
|
|
|
if (err || userData.status === 'offline' || now - parseInt(userData.lastonline, 10) < 300000) {
|
2014-06-08 16:06:42 -04:00
|
|
|
return callback(err);
|
2014-02-12 17:16:16 -05:00
|
|
|
}
|
|
|
|
|
|
2014-11-28 14:25:11 -05:00
|
|
|
User.setUserField(uid, 'lastonline', now, callback);
|
2014-02-12 17:16:16 -05:00
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
2014-11-28 20:31:47 -05:00
|
|
|
User.updateOnlineUsers = function(uid, callback) {
|
|
|
|
|
callback = callback || function() {};
|
|
|
|
|
db.sortedSetScore('users:online', uid, function(err, score) {
|
|
|
|
|
var now = Date.now();
|
|
|
|
|
if (err || now - parseInt(score, 10) < 300000) {
|
|
|
|
|
return callback(err);
|
|
|
|
|
}
|
|
|
|
|
db.sortedSetAdd('users:online', now, uid, callback);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2013-08-14 13:32:07 -04:00
|
|
|
User.setUserField = function(uid, field, value, callback) {
|
2014-11-08 14:38:56 -05:00
|
|
|
plugins.fireHook('action:user.set', {field: field, value: value, type: 'set'});
|
2013-12-02 19:40:11 -05:00
|
|
|
db.setObjectField('user:' + uid, field, value, callback);
|
2013-11-04 01:57:58 +02:00
|
|
|
};
|
2013-05-09 01:04:15 -04:00
|
|
|
|
2013-11-27 15:02:09 -05:00
|
|
|
User.setUserFields = function(uid, data, callback) {
|
2014-05-01 14:37:26 -04:00
|
|
|
for (var field in data) {
|
|
|
|
|
if (data.hasOwnProperty(field)) {
|
2014-11-08 14:38:56 -05:00
|
|
|
plugins.fireHook('action:user.set', {field: field, value: data[field], type: 'set'});
|
2014-05-01 14:37:26 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2013-12-02 19:40:11 -05:00
|
|
|
db.setObject('user:' + uid, data, callback);
|
2013-11-04 01:57:58 +02:00
|
|
|
};
|
2013-07-24 13:12:56 -04:00
|
|
|
|
2013-08-12 14:32:56 -04:00
|
|
|
User.incrementUserFieldBy = function(uid, field, value, callback) {
|
2014-11-08 14:38:56 -05:00
|
|
|
callback = callback || function() {};
|
2014-05-01 14:30:53 -04:00
|
|
|
db.incrObjectFieldBy('user:' + uid, field, value, function(err, value) {
|
2014-11-08 14:38:56 -05:00
|
|
|
if (err) {
|
|
|
|
|
return callback(err);
|
2014-05-01 14:30:53 -04:00
|
|
|
}
|
2014-11-08 14:38:56 -05:00
|
|
|
plugins.fireHook('action:user.set', {field: field, value: value, type: 'increment'});
|
|
|
|
|
|
|
|
|
|
callback(null, value);
|
2014-05-01 14:30:53 -04:00
|
|
|
});
|
2013-11-04 01:57:58 +02:00
|
|
|
};
|
2013-05-09 01:04:15 -04:00
|
|
|
|
2013-08-12 14:32:56 -04:00
|
|
|
User.decrementUserFieldBy = function(uid, field, value, callback) {
|
2014-11-08 14:38:56 -05:00
|
|
|
callback = callback || function() {};
|
2014-05-01 14:30:53 -04:00
|
|
|
db.incrObjectFieldBy('user:' + uid, field, -value, function(err, value) {
|
2014-11-08 14:38:56 -05:00
|
|
|
if (err) {
|
|
|
|
|
return callback(err);
|
2014-05-01 14:30:53 -04:00
|
|
|
}
|
2014-11-19 11:02:28 -05:00
|
|
|
plugins.fireHook('action:user.set', {field: field, value: value, type: 'decrement'});
|
2014-11-08 14:38:56 -05:00
|
|
|
|
|
|
|
|
callback(null, value);
|
2014-05-01 14:30:53 -04:00
|
|
|
});
|
2013-11-04 01:57:58 +02:00
|
|
|
};
|
2013-07-19 10:59:24 -04:00
|
|
|
|
2014-11-28 14:25:11 -05:00
|
|
|
User.getUidsFromSet = function(set, start, stop, callback) {
|
|
|
|
|
if (set === 'users:online') {
|
|
|
|
|
var count = parseInt(stop, 10) === -1 ? stop : stop - start + 1;
|
|
|
|
|
var now = Date.now();
|
2014-11-28 14:30:43 -05:00
|
|
|
db.getSortedSetRevRangeByScore(set, start, count, now, now - 300000, callback);
|
2014-11-28 14:25:11 -05:00
|
|
|
} else {
|
2014-11-28 14:30:43 -05:00
|
|
|
db.getSortedSetRevRange(set, start, stop, callback);
|
2014-11-28 14:25:11 -05:00
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2014-03-19 21:32:13 -04:00
|
|
|
User.getUsersFromSet = function(set, start, stop, callback) {
|
|
|
|
|
async.waterfall([
|
|
|
|
|
function(next) {
|
2014-11-28 14:25:11 -05:00
|
|
|
User.getUidsFromSet(set, start, stop, next);
|
2014-03-19 21:32:13 -04:00
|
|
|
},
|
|
|
|
|
function(uids, next) {
|
|
|
|
|
User.getUsers(uids, next);
|
|
|
|
|
}
|
|
|
|
|
], callback);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
User.getUsers = function(uids, callback) {
|
2014-08-06 12:39:14 -04:00
|
|
|
async.parallel({
|
|
|
|
|
userData: function(next) {
|
2014-10-06 13:11:12 -04:00
|
|
|
User.getMultipleUserFields(uids, ['uid', 'username', 'userslug', 'picture', 'status', 'banned', 'postcount', 'reputation', 'email:confirmed'], next);
|
2014-08-06 12:39:14 -04:00
|
|
|
},
|
|
|
|
|
isAdmin: function(next) {
|
|
|
|
|
User.isAdministrator(uids, next);
|
|
|
|
|
},
|
|
|
|
|
isOnline: function(next) {
|
2014-10-13 22:25:34 -04:00
|
|
|
require('./socket.io').isUsersOnline(uids, next);
|
2013-08-12 14:32:56 -04:00
|
|
|
}
|
2014-08-06 12:39:14 -04:00
|
|
|
}, function(err, results) {
|
2014-03-19 21:32:13 -04:00
|
|
|
if (err) {
|
|
|
|
|
return callback(err);
|
2014-03-12 20:53:42 -04:00
|
|
|
}
|
2014-03-19 21:32:13 -04:00
|
|
|
|
2014-08-06 12:39:14 -04:00
|
|
|
results.userData.forEach(function(user, index) {
|
|
|
|
|
if (!user) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
user.status = !user.status ? 'online' : user.status;
|
|
|
|
|
user.status = !results.isOnline[index] ? 'offline' : user.status;
|
|
|
|
|
user.administrator = results.isAdmin[index];
|
|
|
|
|
user.banned = parseInt(user.banned, 10) === 1;
|
2014-10-06 13:11:12 -04:00
|
|
|
user['email:confirmed'] = parseInt(user['email:confirmed'], 10) === 1;
|
2014-08-06 12:39:14 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
callback(err, results.userData);
|
2014-03-19 21:32:13 -04:00
|
|
|
});
|
2013-11-04 01:57:58 +02:00
|
|
|
};
|
2013-05-09 01:04:15 -04:00
|
|
|
|
|
|
|
|
User.createGravatarURLFromEmail = function(email) {
|
2014-05-11 19:39:52 -04:00
|
|
|
var customGravatarDefaultImage = meta.config.customGravatarDefaultImage;
|
|
|
|
|
if (customGravatarDefaultImage && customGravatarDefaultImage.indexOf('http') === -1) {
|
|
|
|
|
customGravatarDefaultImage = nconf.get('url') + meta.config.customGravatarDefaultImage;
|
|
|
|
|
}
|
2014-04-26 15:53:00 -04:00
|
|
|
|
2013-07-12 16:23:35 -04:00
|
|
|
var options = {
|
2014-08-13 18:25:26 -04:00
|
|
|
size: parseInt(meta.config.profileImageDimension, 10) || 128,
|
2014-05-22 11:42:37 -04:00
|
|
|
default: customGravatarDefaultImage || meta.config.defaultGravatarImage || 'identicon',
|
2013-07-12 16:23:35 -04:00
|
|
|
rating: 'pg'
|
2014-01-25 12:05:48 -05:00
|
|
|
};
|
2013-08-23 13:14:36 -04:00
|
|
|
|
2013-07-05 15:55:58 -05:00
|
|
|
if (!email) {
|
2013-07-12 16:23:35 -04:00
|
|
|
email = '';
|
2013-07-05 15:55:58 -05:00
|
|
|
}
|
2013-07-12 16:23:35 -04:00
|
|
|
|
2014-01-25 12:05:48 -05:00
|
|
|
return gravatar.url(email, options, true);
|
2013-11-04 01:57:58 +02:00
|
|
|
};
|
2013-05-09 01:04:15 -04:00
|
|
|
|
|
|
|
|
User.hashPassword = function(password, callback) {
|
2013-09-17 13:09:37 -04:00
|
|
|
if (!password) {
|
2014-03-17 21:47:37 -04:00
|
|
|
return callback(null, password);
|
2013-05-09 01:04:15 -04:00
|
|
|
}
|
2013-07-05 15:55:58 -05:00
|
|
|
|
2014-08-12 21:41:23 -04:00
|
|
|
Password.hash(nconf.get('bcrypt_rounds'), password, callback);
|
2014-02-26 21:04:20 -05:00
|
|
|
};
|
2014-01-07 14:01:32 -05:00
|
|
|
|
2014-09-19 14:25:43 -04:00
|
|
|
User.addTopicIdToUser = function(uid, tid, timestamp, callback) {
|
|
|
|
|
db.sortedSetAdd('uid:' + uid + ':topics', timestamp, tid, callback);
|
2013-11-04 01:57:58 +02:00
|
|
|
};
|
2013-07-02 16:24:13 -04:00
|
|
|
|
2013-06-24 16:16:50 -04:00
|
|
|
User.exists = function(userslug, callback) {
|
2013-10-30 18:31:36 -04:00
|
|
|
User.getUidByUserslug(userslug, function(err, exists) {
|
2014-01-16 16:50:41 -05:00
|
|
|
callback(err, !! exists);
|
2013-05-09 01:04:15 -04:00
|
|
|
});
|
2013-11-04 01:57:58 +02:00
|
|
|
};
|
2013-07-05 16:37:45 -05:00
|
|
|
|
2013-10-30 18:31:36 -04:00
|
|
|
User.getUidByUsername = function(username, callback) {
|
2013-12-02 19:40:11 -05:00
|
|
|
db.getObjectField('username:uid', username, callback);
|
2013-11-04 01:57:58 +02:00
|
|
|
};
|
2013-05-09 01:04:15 -04:00
|
|
|
|
2013-10-30 18:31:36 -04:00
|
|
|
User.getUidByUserslug = function(userslug, callback) {
|
2013-12-02 19:40:11 -05:00
|
|
|
db.getObjectField('userslug:uid', userslug, callback);
|
2013-11-04 01:57:58 +02:00
|
|
|
};
|
2013-06-24 14:33:53 -04:00
|
|
|
|
2013-10-30 18:31:36 -04:00
|
|
|
User.getUsernamesByUids = function(uids, callback) {
|
2014-03-11 03:39:41 -04:00
|
|
|
User.getMultipleUserFields(uids, ['username'], function(err, users) {
|
|
|
|
|
if (err) {
|
|
|
|
|
return callback(err);
|
|
|
|
|
}
|
2013-05-17 13:28:34 -04:00
|
|
|
|
2014-03-11 03:39:41 -04:00
|
|
|
users = users.map(function(user) {
|
|
|
|
|
return user.username;
|
|
|
|
|
});
|
2013-07-05 18:19:55 -04:00
|
|
|
|
2014-03-11 03:39:41 -04:00
|
|
|
callback(null, users);
|
|
|
|
|
});
|
2013-11-04 01:57:58 +02:00
|
|
|
};
|
2013-05-09 01:04:15 -04:00
|
|
|
|
2014-01-27 12:19:25 -05:00
|
|
|
User.getUsernameByUserslug = function(slug, callback) {
|
|
|
|
|
async.waterfall([
|
|
|
|
|
function(next) {
|
|
|
|
|
User.getUidByUserslug(slug, next);
|
|
|
|
|
},
|
|
|
|
|
function(uid, next) {
|
|
|
|
|
User.getUserField(uid, 'username', next);
|
|
|
|
|
}
|
|
|
|
|
], callback);
|
|
|
|
|
};
|
|
|
|
|
|
2013-10-30 18:31:36 -04:00
|
|
|
User.getUidByEmail = function(email, callback) {
|
2014-06-10 13:35:31 -04:00
|
|
|
db.getObjectField('email:uid', email.toLowerCase(), callback);
|
2013-11-04 01:57:58 +02:00
|
|
|
};
|
2013-05-09 01:04:15 -04:00
|
|
|
|
2014-03-17 15:38:06 -04:00
|
|
|
User.getUsernameByEmail = function(email, callback) {
|
2014-06-10 13:35:31 -04:00
|
|
|
db.getObjectField('email:uid', email.toLowerCase(), function(err, uid) {
|
2014-03-17 15:46:53 -04:00
|
|
|
if (err) {
|
|
|
|
|
return callback(err);
|
|
|
|
|
}
|
2014-03-17 15:38:06 -04:00
|
|
|
User.getUserField(uid, 'username', callback);
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
2013-05-16 12:49:39 -04:00
|
|
|
User.isModerator = function(uid, cid, callback) {
|
2014-06-28 14:59:01 -04:00
|
|
|
if (Array.isArray(cid)) {
|
2014-11-04 19:05:55 -05:00
|
|
|
if (!parseInt(uid, 10)) {
|
|
|
|
|
return callback(null, cid.map(function() {return false;}));
|
|
|
|
|
}
|
2014-10-09 19:53:10 -04:00
|
|
|
var uniqueCids = cid.filter(function(cid, index, array) {
|
|
|
|
|
return array.indexOf(cid) === index;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var groupNames = uniqueCids.map(function(cid) {
|
2014-06-28 14:59:01 -04:00
|
|
|
return 'cid:' + cid + ':privileges:mods';
|
|
|
|
|
});
|
2014-10-09 19:53:10 -04:00
|
|
|
|
|
|
|
|
groups.isMemberOfGroups(uid, groupNames, function(err, isMembers) {
|
|
|
|
|
if (err) {
|
|
|
|
|
return callback(err);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var map = {};
|
|
|
|
|
uniqueCids.forEach(function(cid, index) {
|
|
|
|
|
map[cid] = isMembers[index];
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
callback(null, cid.map(function(cid) {
|
|
|
|
|
return map[cid];
|
|
|
|
|
}));
|
|
|
|
|
});
|
2014-06-28 14:59:01 -04:00
|
|
|
} else {
|
2014-09-09 15:19:57 -04:00
|
|
|
if (Array.isArray(uid)) {
|
|
|
|
|
groups.isMembers(uid, 'cid:' + cid + ':privileges:mods', callback);
|
|
|
|
|
} else {
|
|
|
|
|
groups.isMember(uid, 'cid:' + cid + ':privileges:mods', callback);
|
|
|
|
|
}
|
2014-06-28 14:59:01 -04:00
|
|
|
}
|
2013-11-04 01:57:58 +02:00
|
|
|
};
|
2013-05-17 21:14:58 -04:00
|
|
|
|
|
|
|
|
User.isAdministrator = function(uid, callback) {
|
2014-08-06 12:39:14 -04:00
|
|
|
if (Array.isArray(uid)) {
|
|
|
|
|
groups.isMembers(uid, 'administrators', callback);
|
|
|
|
|
} else {
|
|
|
|
|
groups.isMember(uid, 'administrators', callback);
|
|
|
|
|
}
|
2013-11-04 01:57:58 +02:00
|
|
|
};
|
2013-06-20 14:45:38 -04:00
|
|
|
|
2014-08-29 15:57:20 -04:00
|
|
|
User.getIgnoredCategories = function(uid, callback) {
|
|
|
|
|
db.getSortedSetRange('uid:' + uid + ':ignored:cids', 0, -1, callback);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
User.ignoreCategory = function(uid, cid, callback) {
|
2014-08-29 17:55:44 -04:00
|
|
|
if (!uid) {
|
|
|
|
|
return callback();
|
|
|
|
|
}
|
2014-08-29 15:57:20 -04:00
|
|
|
db.sortedSetAdd('uid:' + uid + ':ignored:cids', Date.now(), cid, callback);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
User.watchCategory = function(uid, cid, callback) {
|
2014-08-29 17:55:44 -04:00
|
|
|
if (!uid) {
|
|
|
|
|
return callback();
|
|
|
|
|
}
|
2014-08-29 15:57:20 -04:00
|
|
|
db.sortedSetRemove('uid:' + uid + ':ignored:cids', cid, callback);
|
|
|
|
|
};
|
|
|
|
|
|
2014-02-11 23:38:25 -05:00
|
|
|
|
2013-11-30 13:13:18 -05:00
|
|
|
}(exports));
|