mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-02 12:05:57 +01:00
user refactor
This commit is contained in:
@@ -5,5 +5,6 @@ var privileges = {};
|
||||
require('./privileges/categories')(privileges);
|
||||
require('./privileges/topics')(privileges);
|
||||
require('./privileges/posts')(privileges);
|
||||
require('./privileges/users')(privileges);
|
||||
|
||||
module.exports = privileges;
|
||||
124
src/privileges/users.js
Normal file
124
src/privileges/users.js
Normal file
@@ -0,0 +1,124 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
var async = require('async'),
|
||||
winston = require('winston'),
|
||||
|
||||
db = require('../database'),
|
||||
topics = require('../topics'),
|
||||
user = require('../user'),
|
||||
helpers = require('./helpers'),
|
||||
groups = require('../groups'),
|
||||
categories = require('../categories'),
|
||||
plugins = require('../plugins');
|
||||
|
||||
module.exports = function(privileges) {
|
||||
|
||||
privileges.users = {};
|
||||
|
||||
privileges.users.isAdministrator = function(uid, callback) {
|
||||
if (Array.isArray(uid)) {
|
||||
groups.isMembers(uid, 'administrators', callback);
|
||||
} else {
|
||||
groups.isMember(uid, 'administrators', callback);
|
||||
}
|
||||
};
|
||||
|
||||
privileges.users.isModerator = function(uid, cid, callback) {
|
||||
if (Array.isArray(cid)) {
|
||||
isModeratorOfCategories(cid, uid, callback);
|
||||
} else {
|
||||
if (Array.isArray(uid)) {
|
||||
isModeratorsOfCategory(cid, uid, callback);
|
||||
} else {
|
||||
isModeratorOfCategory(cid, uid, callback);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function isModeratorOfCategories(cids, uid, callback) {
|
||||
if (!parseInt(uid, 10)) {
|
||||
return filterIsModerator(null, cids.map(function() {return false;}));
|
||||
}
|
||||
|
||||
var uniqueCids = cids.filter(function(cid, index, array) {
|
||||
return array.indexOf(cid) === index;
|
||||
});
|
||||
|
||||
var groupNames = uniqueCids.map(function(cid) {
|
||||
return 'cid:' + cid + ':privileges:mods'; // At some point we should *probably* change this to "moderate" as well
|
||||
}),
|
||||
groupListNames = uniqueCids.map(function(cid) {
|
||||
return 'cid:' + cid + ':privileges:groups:moderate';
|
||||
});
|
||||
|
||||
async.parallel({
|
||||
user: async.apply(groups.isMemberOfGroups, uid, groupNames),
|
||||
group: async.apply(groups.isMemberOfGroupsList, uid, groupListNames)
|
||||
}, function(err, checks) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
var isMembers = checks.user.map(function(isMember, idx) {
|
||||
return isMember || checks.group[idx];
|
||||
}),
|
||||
map = {};
|
||||
|
||||
uniqueCids.forEach(function(cid, index) {
|
||||
map[cid] = isMembers[index];
|
||||
});
|
||||
|
||||
var isModerator = cids.map(function(cid) {
|
||||
return map[cid];
|
||||
});
|
||||
|
||||
filterIsModerator(cids, uid, isModerator, callback);
|
||||
});
|
||||
}
|
||||
|
||||
function isModeratorsOfCategory(cid, uids, callback) {
|
||||
async.parallel([
|
||||
async.apply(groups.isMembers, uids, 'cid:' + cid + ':privileges:mods'),
|
||||
async.apply(groups.isMembersOfGroupList, uids, 'cid:' + cid + ':privileges:groups:moderate')
|
||||
], function(err, checks) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
var isModerator = checks[0].map(function(isMember, idx) {
|
||||
return isMember || checks[1][idx];
|
||||
});
|
||||
|
||||
filterIsModerator(cid, uids, isModerator, callback);
|
||||
});
|
||||
}
|
||||
|
||||
function isModeratorOfCategory(cid, uid, callback) {
|
||||
async.parallel([
|
||||
async.apply(groups.isMember, uid, 'cid:' + cid + ':privileges:mods'),
|
||||
async.apply(groups.isMemberOfGroupList, uid, 'cid:' + cid + ':privileges:groups:moderate')
|
||||
], function(err, checks) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
var isModerator = checks[0] || checks[1];
|
||||
filterIsModerator(cid, uid, isModerator, callback);
|
||||
});
|
||||
}
|
||||
|
||||
function filterIsModerator(cid, uid, isModerator, callback) {
|
||||
plugins.fireHook('filter:user.isModerator', {uid: uid, cid: cid, isModerator: isModerator}, function(err, data) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
if (Array.isArray(uid) && !Array.isArray(data.isModerator) || Array.isArray(cid) && !Array.isArray(data.isModerator)) {
|
||||
return callback(new Error('filter:user.isModerator - i/o mismatch'));
|
||||
}
|
||||
|
||||
callback(null, data.isModerator);
|
||||
});
|
||||
}
|
||||
|
||||
};
|
||||
283
src/user.js
283
src/user.js
@@ -11,6 +11,7 @@ var async = require('async'),
|
||||
topics = require('./topics'),
|
||||
groups = require('./groups'),
|
||||
Password = require('./password'),
|
||||
privileges = require('./privileges'),
|
||||
utils = require('../public/src/utils');
|
||||
|
||||
(function(User) {
|
||||
@@ -20,9 +21,11 @@ var async = require('async'),
|
||||
User.reset = require('./user/reset');
|
||||
User.digest = require('./user/digest');
|
||||
|
||||
require('./user/data')(User);
|
||||
require('./user/auth')(User);
|
||||
require('./user/create')(User);
|
||||
require('./user/posts')(User);
|
||||
require('./user/categories')(User);
|
||||
require('./user/follow')(User);
|
||||
require('./user/profile')(User);
|
||||
require('./user/admin')(User);
|
||||
@@ -34,113 +37,6 @@ var async = require('async'),
|
||||
require('./user/approval')(User);
|
||||
require('./user/invite')(User);
|
||||
|
||||
User.getUserField = function(uid, field, callback) {
|
||||
User.getUserFields(uid, [field], function(err, user) {
|
||||
callback(err, user ? user[field] : null);
|
||||
});
|
||||
};
|
||||
|
||||
User.getUserFields = function(uid, fields, callback) {
|
||||
User.getMultipleUserFields([uid], fields, function(err, users) {
|
||||
callback(err, users ? users[0] : null);
|
||||
});
|
||||
};
|
||||
|
||||
User.getMultipleUserFields = function(uids, fields, callback) {
|
||||
var fieldsToRemove = [];
|
||||
function addField(field) {
|
||||
if (fields.indexOf(field) === -1) {
|
||||
fields.push(field);
|
||||
fieldsToRemove.push(field);
|
||||
}
|
||||
}
|
||||
|
||||
if (!Array.isArray(uids) || !uids.length) {
|
||||
return callback(null, []);
|
||||
}
|
||||
|
||||
var keys = uids.map(function(uid) {
|
||||
return 'user:' + uid;
|
||||
});
|
||||
|
||||
if (fields.indexOf('uid') === -1) {
|
||||
fields.push('uid');
|
||||
}
|
||||
|
||||
if (fields.indexOf('picture') !== -1) {
|
||||
addField('email');
|
||||
addField('gravatarpicture');
|
||||
addField('uploadedpicture');
|
||||
}
|
||||
|
||||
db.getObjectsFields(keys, fields, function(err, users) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
modifyUserData(users, fieldsToRemove, callback);
|
||||
});
|
||||
};
|
||||
|
||||
User.getUserData = function(uid, callback) {
|
||||
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) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
modifyUserData(users, [], callback);
|
||||
});
|
||||
};
|
||||
|
||||
function modifyUserData(users, fieldsToRemove, callback) {
|
||||
users.forEach(function(user) {
|
||||
if (!user) {
|
||||
return;
|
||||
}
|
||||
|
||||
user.username = validator.escape(user.username);
|
||||
|
||||
if (user.password) {
|
||||
user.password = undefined;
|
||||
}
|
||||
|
||||
if (!parseInt(user.uid, 10)) {
|
||||
user.uid = 0;
|
||||
user.username = '[[global:guest]]';
|
||||
user.userslug = '';
|
||||
user.picture = User.createGravatarURLFromEmail('');
|
||||
}
|
||||
|
||||
if (user.picture) {
|
||||
if (user.picture === user.uploadedpicture) {
|
||||
user.picture = user.uploadedpicture = user.picture.startsWith('http') ? user.picture : nconf.get('relative_path') + user.picture;
|
||||
} else {
|
||||
user.picture = User.createGravatarURLFromEmail(user.email);
|
||||
}
|
||||
}
|
||||
|
||||
for(var i=0; i<fieldsToRemove.length; ++i) {
|
||||
user[fieldsToRemove[i]] = undefined;
|
||||
}
|
||||
});
|
||||
|
||||
plugins.fireHook('filter:users.get', users, callback);
|
||||
}
|
||||
|
||||
User.updateLastOnlineTime = function(uid, callback) {
|
||||
callback = callback || function() {};
|
||||
User.getUserFields(uid, ['status', 'lastonline'], function(err, userData) {
|
||||
@@ -175,56 +71,6 @@ var async = require('async'),
|
||||
], callback);
|
||||
};
|
||||
|
||||
User.setUserField = function(uid, field, value, callback) {
|
||||
callback = callback || function() {};
|
||||
db.setObjectField('user:' + uid, field, value, function(err) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
plugins.fireHook('action:user.set', {uid: uid, field: field, value: value, type: 'set'});
|
||||
callback();
|
||||
});
|
||||
};
|
||||
|
||||
User.setUserFields = function(uid, data, callback) {
|
||||
callback = callback || function() {};
|
||||
db.setObject('user:' + uid, data, function(err) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
for (var field in data) {
|
||||
if (data.hasOwnProperty(field)) {
|
||||
plugins.fireHook('action:user.set', {uid: uid, field: field, value: data[field], type: 'set'});
|
||||
}
|
||||
}
|
||||
callback();
|
||||
});
|
||||
};
|
||||
|
||||
User.incrementUserFieldBy = function(uid, field, value, callback) {
|
||||
callback = callback || function() {};
|
||||
db.incrObjectFieldBy('user:' + uid, field, value, function(err, value) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
plugins.fireHook('action:user.set', {uid: uid, field: field, value: value, type: 'increment'});
|
||||
|
||||
callback(null, value);
|
||||
});
|
||||
};
|
||||
|
||||
User.decrementUserFieldBy = function(uid, field, value, callback) {
|
||||
callback = callback || function() {};
|
||||
db.incrObjectFieldBy('user:' + uid, field, -value, function(err, value) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
plugins.fireHook('action:user.set', {uid: uid, field: field, value: value, type: 'decrement'});
|
||||
|
||||
callback(null, value);
|
||||
});
|
||||
};
|
||||
|
||||
User.getUidsFromSet = function(set, start, stop, callback) {
|
||||
if (set === 'users:online') {
|
||||
var count = parseInt(stop, 10) === -1 ? stop : stop - start + 1;
|
||||
@@ -322,13 +168,6 @@ var async = require('async'),
|
||||
Password.hash(nconf.get('bcrypt_rounds') || 12, password, callback);
|
||||
};
|
||||
|
||||
User.addTopicIdToUser = function(uid, tid, timestamp, callback) {
|
||||
async.parallel([
|
||||
async.apply(db.sortedSetAdd, 'uid:' + uid + ':topics', timestamp, tid),
|
||||
async.apply(User.incrementUserFieldBy, uid, 'topiccount', 1)
|
||||
], callback);
|
||||
};
|
||||
|
||||
User.exists = function(userslug, callback) {
|
||||
User.getUidByUserslug(userslug, function(err, exists) {
|
||||
callback(err, !! exists);
|
||||
@@ -392,123 +231,11 @@ var async = require('async'),
|
||||
};
|
||||
|
||||
User.isModerator = function(uid, cid, callback) {
|
||||
function filterIsModerator(err, isModerator) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
plugins.fireHook('filter:user.isModerator', {uid: uid, cid:cid, isModerator: isModerator}, function(err, data) {
|
||||
if (Array.isArray(uid) && !Array.isArray(data.isModerator) || Array.isArray(cid) && !Array.isArray(data.isModerator)) {
|
||||
return callback(new Error('filter:user.isModerator - i/o mismatch'));
|
||||
}
|
||||
|
||||
callback(err, data.isModerator);
|
||||
});
|
||||
}
|
||||
|
||||
if (Array.isArray(cid)) {
|
||||
if (!parseInt(uid, 10)) {
|
||||
return filterIsModerator(null, cid.map(function() {return false;}));
|
||||
}
|
||||
var uniqueCids = cid.filter(function(cid, index, array) {
|
||||
return array.indexOf(cid) === index;
|
||||
});
|
||||
|
||||
var groupNames = uniqueCids.map(function(cid) {
|
||||
return 'cid:' + cid + ':privileges:mods'; // At some point we should *probably* change this to "moderate" as well
|
||||
}),
|
||||
groupListNames = uniqueCids.map(function(cid) {
|
||||
return 'cid:' + cid + ':privileges:groups:moderate';
|
||||
});
|
||||
|
||||
async.parallel({
|
||||
user: async.apply(groups.isMemberOfGroups, uid, groupNames),
|
||||
group: async.apply(groups.isMemberOfGroupsList, uid, groupListNames)
|
||||
}, function(err, checks) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
var isMembers = checks.user.map(function(isMember, idx) {
|
||||
return isMember || checks.group[idx];
|
||||
}),
|
||||
map = {};
|
||||
|
||||
uniqueCids.forEach(function(cid, index) {
|
||||
map[cid] = isMembers[index];
|
||||
});
|
||||
|
||||
filterIsModerator(null, cid.map(function(cid) {
|
||||
return map[cid];
|
||||
}));
|
||||
});
|
||||
} else {
|
||||
if (Array.isArray(uid)) {
|
||||
async.parallel([
|
||||
async.apply(groups.isMembers, uid, 'cid:' + cid + ':privileges:mods'),
|
||||
async.apply(groups.isMembersOfGroupList, uid, 'cid:' + cid + ':privileges:groups:moderate')
|
||||
], function(err, checks) {
|
||||
var isModerator = checks[0].map(function(isMember, idx) {
|
||||
return isMember || checks[1][idx];
|
||||
});
|
||||
filterIsModerator(null, isModerator);
|
||||
});
|
||||
} else {
|
||||
async.parallel([
|
||||
async.apply(groups.isMember, uid, 'cid:' + cid + ':privileges:mods'),
|
||||
async.apply(groups.isMemberOfGroupList, uid, 'cid:' + cid + ':privileges:groups:moderate')
|
||||
], function(err, checks) {
|
||||
var isModerator = checks[0] || checks[1];
|
||||
filterIsModerator(null, isModerator);
|
||||
});
|
||||
}
|
||||
}
|
||||
privileges.users.isModerator(uid, cid, callback);
|
||||
};
|
||||
|
||||
User.isAdministrator = function(uid, callback) {
|
||||
if (Array.isArray(uid)) {
|
||||
groups.isMembers(uid, 'administrators', callback);
|
||||
} else {
|
||||
groups.isMember(uid, 'administrators', callback);
|
||||
}
|
||||
};
|
||||
|
||||
User.getIgnoredCategories = function(uid, callback) {
|
||||
db.getSortedSetRange('uid:' + uid + ':ignored:cids', 0, -1, callback);
|
||||
};
|
||||
|
||||
User.getWatchedCategories = function(uid, callback) {
|
||||
async.parallel({
|
||||
ignored: function(next) {
|
||||
User.getIgnoredCategories(uid, next);
|
||||
},
|
||||
all: function(next) {
|
||||
db.getSortedSetRange('categories:cid', 0, -1, next);
|
||||
}
|
||||
}, function(err, results) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
var watched = results.all.filter(function(cid) {
|
||||
return cid && results.ignored.indexOf(cid) === -1;
|
||||
});
|
||||
callback(null, watched);
|
||||
});
|
||||
};
|
||||
|
||||
User.ignoreCategory = function(uid, cid, callback) {
|
||||
if (!uid) {
|
||||
return callback();
|
||||
}
|
||||
db.sortedSetAdd('uid:' + uid + ':ignored:cids', Date.now(), cid, callback);
|
||||
};
|
||||
|
||||
User.watchCategory = function(uid, cid, callback) {
|
||||
if (!uid) {
|
||||
return callback();
|
||||
}
|
||||
db.sortedSetRemove('uid:' + uid + ':ignored:cids', cid, callback);
|
||||
privileges.users.isAdministrator(uid, callback);
|
||||
};
|
||||
|
||||
|
||||
|
||||
46
src/user/categories.js
Normal file
46
src/user/categories.js
Normal file
@@ -0,0 +1,46 @@
|
||||
'use strict';
|
||||
|
||||
var async = require('async');
|
||||
|
||||
var db = require('../database');
|
||||
|
||||
module.exports = function(User) {
|
||||
|
||||
User.getIgnoredCategories = function(uid, callback) {
|
||||
db.getSortedSetRange('uid:' + uid + ':ignored:cids', 0, -1, callback);
|
||||
};
|
||||
|
||||
User.getWatchedCategories = function(uid, callback) {
|
||||
async.parallel({
|
||||
ignored: function(next) {
|
||||
User.getIgnoredCategories(uid, next);
|
||||
},
|
||||
all: function(next) {
|
||||
db.getSortedSetRange('categories:cid', 0, -1, next);
|
||||
}
|
||||
}, function(err, results) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
var watched = results.all.filter(function(cid) {
|
||||
return cid && results.ignored.indexOf(cid) === -1;
|
||||
});
|
||||
callback(null, watched);
|
||||
});
|
||||
};
|
||||
|
||||
User.ignoreCategory = function(uid, cid, callback) {
|
||||
if (!uid) {
|
||||
return callback();
|
||||
}
|
||||
db.sortedSetAdd('uid:' + uid + ':ignored:cids', Date.now(), cid, callback);
|
||||
};
|
||||
|
||||
User.watchCategory = function(uid, cid, callback) {
|
||||
if (!uid) {
|
||||
return callback();
|
||||
}
|
||||
db.sortedSetRemove('uid:' + uid + ':ignored:cids', cid, callback);
|
||||
};
|
||||
};
|
||||
174
src/user/data.js
Normal file
174
src/user/data.js
Normal file
@@ -0,0 +1,174 @@
|
||||
'use strict';
|
||||
|
||||
var validator = require('validator');
|
||||
var nconf = require('nconf');
|
||||
var winston = require('winston');
|
||||
|
||||
var db = require('../database');
|
||||
var plugins = require('../plugins');
|
||||
|
||||
module.exports = function(User) {
|
||||
|
||||
User.getUserField = function(uid, field, callback) {
|
||||
User.getUserFields(uid, [field], function(err, user) {
|
||||
callback(err, user ? user[field] : null);
|
||||
});
|
||||
};
|
||||
|
||||
User.getUserFields = function(uid, fields, callback) {
|
||||
User.getMultipleUserFields([uid], fields, function(err, users) {
|
||||
callback(err, users ? users[0] : null);
|
||||
});
|
||||
};
|
||||
|
||||
User.getUsersFields = function(uids, fields, callback) {
|
||||
var fieldsToRemove = [];
|
||||
function addField(field) {
|
||||
if (fields.indexOf(field) === -1) {
|
||||
fields.push(field);
|
||||
fieldsToRemove.push(field);
|
||||
}
|
||||
}
|
||||
|
||||
if (!Array.isArray(uids) || !uids.length) {
|
||||
return callback(null, []);
|
||||
}
|
||||
|
||||
var keys = uids.map(function(uid) {
|
||||
return 'user:' + uid;
|
||||
});
|
||||
|
||||
if (fields.indexOf('uid') === -1) {
|
||||
fields.push('uid');
|
||||
}
|
||||
|
||||
if (fields.indexOf('picture') !== -1) {
|
||||
addField('email');
|
||||
addField('gravatarpicture');
|
||||
addField('uploadedpicture');
|
||||
}
|
||||
|
||||
db.getObjectsFields(keys, fields, function(err, users) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
modifyUserData(users, fieldsToRemove, callback);
|
||||
});
|
||||
};
|
||||
|
||||
User.getMultipleUserFields = function(uids, fields, callback) {
|
||||
winston.warn('[deprecated] User.getMultipleUserFields is deprecated please use User.getUsersFields');
|
||||
User.getUsersFields(uids, fields, callback);
|
||||
};
|
||||
|
||||
User.getUserData = function(uid, callback) {
|
||||
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) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
modifyUserData(users, [], callback);
|
||||
});
|
||||
};
|
||||
|
||||
function modifyUserData(users, fieldsToRemove, callback) {
|
||||
users.forEach(function(user) {
|
||||
if (!user) {
|
||||
return;
|
||||
}
|
||||
|
||||
user.username = validator.escape(user.username);
|
||||
|
||||
if (user.password) {
|
||||
user.password = undefined;
|
||||
}
|
||||
|
||||
if (!parseInt(user.uid, 10)) {
|
||||
user.uid = 0;
|
||||
user.username = '[[global:guest]]';
|
||||
user.userslug = '';
|
||||
user.picture = User.createGravatarURLFromEmail('');
|
||||
}
|
||||
|
||||
if (user.picture) {
|
||||
if (user.picture === user.uploadedpicture) {
|
||||
user.picture = user.uploadedpicture = user.picture.startsWith('http') ? user.picture : nconf.get('relative_path') + user.picture;
|
||||
} else {
|
||||
user.picture = User.createGravatarURLFromEmail(user.email);
|
||||
}
|
||||
}
|
||||
|
||||
for(var i=0; i<fieldsToRemove.length; ++i) {
|
||||
user[fieldsToRemove[i]] = undefined;
|
||||
}
|
||||
});
|
||||
|
||||
plugins.fireHook('filter:users.get', users, callback);
|
||||
}
|
||||
|
||||
User.setUserField = function(uid, field, value, callback) {
|
||||
callback = callback || function() {};
|
||||
db.setObjectField('user:' + uid, field, value, function(err) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
plugins.fireHook('action:user.set', {uid: uid, field: field, value: value, type: 'set'});
|
||||
callback();
|
||||
});
|
||||
};
|
||||
|
||||
User.setUserFields = function(uid, data, callback) {
|
||||
callback = callback || function() {};
|
||||
db.setObject('user:' + uid, data, function(err) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
for (var field in data) {
|
||||
if (data.hasOwnProperty(field)) {
|
||||
plugins.fireHook('action:user.set', {uid: uid, field: field, value: data[field], type: 'set'});
|
||||
}
|
||||
}
|
||||
callback();
|
||||
});
|
||||
};
|
||||
|
||||
User.incrementUserFieldBy = function(uid, field, value, callback) {
|
||||
callback = callback || function() {};
|
||||
db.incrObjectFieldBy('user:' + uid, field, value, function(err, value) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
plugins.fireHook('action:user.set', {uid: uid, field: field, value: value, type: 'increment'});
|
||||
|
||||
callback(null, value);
|
||||
});
|
||||
};
|
||||
|
||||
User.decrementUserFieldBy = function(uid, field, value, callback) {
|
||||
callback = callback || function() {};
|
||||
db.incrObjectFieldBy('user:' + uid, field, -value, function(err, value) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
plugins.fireHook('action:user.set', {uid: uid, field: field, value: value, type: 'decrement'});
|
||||
|
||||
callback(null, value);
|
||||
});
|
||||
};
|
||||
|
||||
};
|
||||
@@ -80,6 +80,13 @@ module.exports = function(User) {
|
||||
db.sortedSetAdd('uid:' + uid + ':posts', timestamp, pid, callback);
|
||||
};
|
||||
|
||||
User.addTopicIdToUser = function(uid, tid, timestamp, callback) {
|
||||
async.parallel([
|
||||
async.apply(db.sortedSetAdd, 'uid:' + uid + ':topics', timestamp, tid),
|
||||
async.apply(User.incrementUserFieldBy, uid, 'topiccount', 1)
|
||||
], callback);
|
||||
};
|
||||
|
||||
User.incrementUserPostCountBy = function(uid, value, callback) {
|
||||
callback = callback || function() {};
|
||||
User.incrementUserFieldBy(uid, 'postcount', value, function(err, newpostcount) {
|
||||
|
||||
Reference in New Issue
Block a user