Files
NodeBB/src/user.js

259 lines
7.0 KiB
JavaScript
Raw Normal View History

2014-02-26 21:04:20 -05:00
'use strict';
2014-09-19 15:54:13 -04:00
var async = require('async'),
2013-12-01 16:21:19 -05:00
plugins = require('./plugins'),
2013-12-02 17:10:26 -05:00
db = require('./database'),
2015-02-12 12:23:13 -05:00
topics = require('./topics'),
2015-09-25 17:08:00 -04:00
privileges = require('./privileges'),
2015-04-01 15:22:56 -04:00
utils = require('../public/src/utils');
2013-11-22 14:08:02 -05:00
(function(User) {
2014-02-26 21:04:20 -05: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');
2015-09-25 17:08:00 -04:00
require('./user/data')(User);
2014-05-11 11:45:20 -04:00
require('./user/auth')(User);
2014-03-17 21:47:37 -04:00
require('./user/create')(User);
require('./user/posts')(User);
2015-09-25 17:08:00 -04:00
require('./user/categories')(User);
require('./user/follow')(User);
require('./user/profile')(User);
require('./user/admin')(User);
require('./user/delete')(User);
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);
2015-04-13 15:01:38 -04:00
require('./user/picture')(User);
2015-06-27 21:26:19 -04:00
require('./user/approval')(User);
2015-06-28 21:54:21 -04:00
require('./user/invite')(User);
2015-10-09 17:52:55 -04:00
require('./user/password')(User);
2013-08-23 13:14:36 -04: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();
if (err || userData.status === 'offline' || now - parseInt(userData.lastonline, 10) < 300000) {
2014-06-08 16:06:42 -04:00
return callback(err);
}
2014-11-28 14:25:11 -05:00
User.setUserField(uid, 'lastonline', now, callback);
});
};
User.updateOnlineUsers = function(uid, callback) {
callback = callback || function() {};
2015-02-12 12:23:13 -05:00
var now = Date.now();
async.waterfall([
function(next) {
db.sortedSetScore('users:online', uid, next);
},
function(userOnlineTime, next) {
if (now - parseInt(userOnlineTime, 10) < 300000) {
return callback();
}
2015-03-14 23:00:24 -04:00
db.sortedSetAdd('users:online', now, uid, next);
2015-02-12 12:23:13 -05:00
},
function(next) {
topics.pushUnreadCount(uid);
plugins.fireHook('action:user.online', {uid: uid, timestamp: now});
2015-02-12 12:23:13 -05:00
next();
}
], callback);
2014-11-28 20:36:11 -05: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();
2016-03-09 22:15:03 +02:00
db.getSortedSetRevRangeByScore(set, start, count, '+inf', 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
}
};
User.getUsersFromSet = function(set, uid, start, stop, callback) {
2014-03-19 21:32:13 -04:00
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, uid, next);
2014-03-19 21:32:13 -04:00
}
], callback);
};
User.getUsers = function(uids, uid, callback) {
var fields = ['uid', 'username', 'userslug', 'picture', 'status', 'banned', 'joindate', 'postcount', 'reputation', 'email:confirmed', 'lastonline'];
2014-08-06 12:39:14 -04:00
2015-11-05 15:53:54 -05:00
async.waterfall([
function (next) {
plugins.fireHook('filter:users.addFields', {fields: fields}, next);
},
function (data, next) {
data.fields = data.fields.filter(function(field, index, array) {
return array.indexOf(field) === index;
});
2015-11-05 15:53:54 -05:00
async.parallel({
userData: function(next) {
User.getUsersFields(uids, data.fields, next);
},
isAdmin: function(next) {
User.isAdministrator(uids, next);
}
}, next);
},
function (results, next) {
results.userData.forEach(function(user, index) {
if (user) {
user.status = User.getStatus(user);
user.joindateISO = utils.toISOString(user.joindate);
user.administrator = results.isAdmin[index];
user.banned = parseInt(user.banned, 10) === 1;
user['email:confirmed'] = parseInt(user['email:confirmed'], 10) === 1;
2016-01-14 18:43:00 +02:00
user.lastonlineISO = utils.toISOString(user.lastonline) || user.joindateISO;
2015-01-28 10:30:18 -05:00
}
});
2015-11-05 15:53:54 -05:00
plugins.fireHook('filter:userlist.get', {users: results.userData, uid: uid}, next);
},
function (data, next) {
next(null, data.users);
}
], callback);
};
User.getStatus = function(userData) {
var isOnline = Date.now() - parseInt(userData.lastonline, 10) < 300000;
return isOnline ? (userData.status || 'online') : 'offline';
};
User.isOnline = function(uid, callback) {
2015-12-16 11:15:43 +02:00
if (Array.isArray(uid)) {
db.sortedSetScores('users:online', uid, function(err, lastonline) {
if (err) {
return callback(err);
}
var now = Date.now();
var isOnline = uid.map(function(uid, index) {
return now - lastonline[index] < 300000;
});
callback(null, isOnline);
});
} else {
db.sortedSetScore('users:online', uid, function(err, lastonline) {
if (err) {
return callback(err);
}
var isOnline = Date.now() - parseInt(lastonline, 10) < 300000;
callback(null, isOnline);
});
}
2015-01-12 15:57:45 -05:00
};
2015-10-02 16:27:14 -04:00
User.exists = function(uid, callback) {
db.isSortedSetMember('users:joindate', uid, callback);
};
User.existsBySlug = 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);
});
2015-10-09 17:52:55 -04:00
};
2013-07-05 16:37:45 -05:00
2013-10-30 18:31:36 -04:00
User.getUidByUsername = function(username, callback) {
2014-12-01 17:59:38 -05:00
if (!username) {
2015-06-19 00:31:47 -04:00
return callback(null, 0);
2014-12-01 17:59:38 -05:00
}
db.sortedSetScore('username:uid', username, callback);
};
2015-03-14 23:00:24 -04:00
User.getUidsByUsernames = function(usernames, callback) {
db.sortedSetScores('username:uid', usernames, callback);
2015-03-14 23:00:24 -04:00
};
2013-10-30 18:31:36 -04:00
User.getUidByUserslug = function(userslug, callback) {
2014-12-01 17:59:38 -05:00
if (!userslug) {
2015-06-19 00:31:47 -04:00
return callback(null, 0);
2014-12-01 17:59:38 -05:00
}
db.sortedSetScore('userslug:uid', userslug, callback);
};
2013-06-24 14:33:53 -04:00
2013-10-30 18:31:36 -04:00
User.getUsernamesByUids = function(uids, callback) {
2015-09-25 17:38:58 -04:00
User.getUsersFields(uids, ['username'], function(err, users) {
if (err) {
return callback(err);
}
users = users.map(function(user) {
return user.username;
});
2013-07-05 18:19:55 -04:00
callback(null, users);
});
};
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) {
db.sortedSetScore('email:uid', email.toLowerCase(), callback);
};
2014-03-17 15:38:06 -04:00
User.getUsernameByEmail = function(email, callback) {
db.sortedSetScore('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) {
2015-09-25 17:08:00 -04:00
privileges.users.isModerator(uid, cid, callback);
};
User.isAdministrator = function(uid, callback) {
2015-09-25 17:08:00 -04:00
privileges.users.isAdministrator(uid, callback);
2014-08-29 15:57:20 -04:00
};
2016-01-25 13:36:10 +02:00
User.isGlobalModerator = function(uid, callback) {
privileges.users.isGlobalModerator(uid, callback);
};
2016-02-03 18:21:34 +02:00
User.isAdminOrGlobalMod = function(uid, callback) {
async.parallel({
isAdmin: async.apply(User.isAdministrator, uid),
isGlobalMod: async.apply(User.isGlobalModerator, uid)
}, function(err, results) {
callback(err, results ? (results.isAdmin || results.isGlobalMod) : false);
});
};
2015-10-09 17:52:55 -04:00
User.isAdminOrSelf = function(callerUid, uid, callback) {
if (parseInt(callerUid, 10) === parseInt(uid, 10)) {
return callback();
}
User.isAdministrator(callerUid, function(err, isAdmin) {
if (err || !isAdmin) {
return callback(err || new Error('[[error:no-privileges]]'));
}
callback();
});
};
2014-02-11 23:38:25 -05:00
}(exports));