Files
NodeBB/src/user/info.js

142 lines
3.8 KiB
JavaScript
Raw Normal View History

2016-07-07 14:33:16 -04:00
'use strict';
var async = require('async');
var _ = require('underscore');
var validator = require('validator');
2016-07-07 14:33:16 -04:00
var db = require('../database');
var posts = require('../posts');
var topics = require('../topics');
2016-07-07 14:33:16 -04:00
module.exports = function (User) {
User.getLatestBanInfo = function (uid, callback) {
// Simply retrieves the last record of the user's ban, even if they've been unbanned since then.
2017-02-17 20:20:42 -07:00
var timestamp;
var expiry;
var reason;
async.waterfall([
async.apply(db.getSortedSetRevRangeWithScores, 'uid:' + uid + ':bans', 0, 0),
function (record, next) {
2016-11-23 11:45:29 -05:00
if (!record.length) {
return next(new Error('no-ban-info'));
}
timestamp = record[0].score;
expiry = record[0].value;
db.getSortedSetRangeByScore('banned:' + uid + ':reasons', 0, -1, timestamp, timestamp, next);
},
function (_reason, next) {
reason = _reason && _reason.length ? _reason[0] : '';
next();
2017-02-17 19:31:21 -07:00
},
], function (err) {
if (err) {
return callback(err);
}
callback(null, {
uid: uid,
timestamp: timestamp,
expiry: parseInt(expiry, 10),
expiry_readable: new Date(parseInt(expiry, 10)).toString().replace(/:/g, '%3A'),
2017-02-17 19:31:21 -07:00
reason: validator.escape(String(reason)),
});
});
};
User.getModerationHistory = function (uid, callback) {
2016-07-07 14:33:16 -04:00
async.waterfall([
function (next) {
2016-07-07 14:33:16 -04:00
async.parallel({
flags: async.apply(db.getSortedSetRevRangeWithScores, 'uid:' + uid + ':flag:pids', 0, 19),
2016-08-31 12:20:47 -04:00
bans: async.apply(db.getSortedSetRevRangeWithScores, 'uid:' + uid + ':bans', 0, 19),
2017-02-17 19:31:21 -07:00
reasons: async.apply(db.getSortedSetRevRangeWithScores, 'banned:' + uid + ':reasons', 0, 19),
2016-07-07 14:33:16 -04:00
}, next);
},
function (data, next) {
getFlagMetadata(data, next);
2017-02-17 19:31:21 -07:00
},
], function (err, data) {
if (err) {
return callback(err);
}
formatBanData(data);
callback(null, data);
2016-07-07 14:33:16 -04:00
});
};
User.getHistory = function (set, callback) {
db.getSortedSetRevRangeWithScores(set, 0, -1, function (err, data) {
if (err) {
return callback(err);
}
callback(null, data.map(function (set) {
2016-09-15 22:20:52 -04:00
set.timestamp = set.score;
set.timestampISO = new Date(set.score).toISOString();
set.value = validator.escape(String(set.value.split(':')[0]));
2016-09-15 22:20:52 -04:00
delete set.score;
return set;
}));
});
};
2016-07-07 14:33:16 -04:00
function getFlagMetadata(data, callback) {
var pids = data.flags.map(function (flagObj) {
2016-07-07 14:33:16 -04:00
return parseInt(flagObj.value, 10);
});
posts.getPostsFields(pids, ['tid'], function (err, postData) {
2016-07-07 14:33:16 -04:00
if (err) {
return callback(err);
}
var tids = postData.map(function (post) {
2016-07-07 14:33:16 -04:00
return post.tid;
});
topics.getTopicsFields(tids, ['title'], function (err, topicData) {
if (err) {
return callback(err);
}
data.flags = data.flags.map(function (flagObj, idx) {
2016-07-07 14:33:16 -04:00
flagObj.pid = flagObj.value;
flagObj.timestamp = flagObj.score;
flagObj.timestampISO = new Date(flagObj.score).toISOString();
flagObj.timestampReadable = new Date(flagObj.score).toString();
delete flagObj.value;
delete flagObj.score;
return _.extend(flagObj, topicData[idx]);
});
callback(null, data);
});
});
}
function formatBanData(data) {
var reasons = data.reasons.reduce(function (memo, cur) {
2017-02-18 02:38:03 -07:00
memo[cur.score] = cur.value;
return memo;
}, {});
2016-08-31 12:20:47 -04:00
data.bans = data.bans.map(function (banObj) {
2016-07-07 14:33:16 -04:00
banObj.until = parseInt(banObj.value, 10);
banObj.untilReadable = new Date(banObj.until).toString();
banObj.timestamp = parseInt(banObj.score, 10);
banObj.timestampReadable = new Date(banObj.score).toString();
banObj.timestampISO = new Date(banObj.score).toISOString();
banObj.reason = validator.escape(String(reasons[banObj.score] || '')) || '[[user:info.banned-no-reason]]';
2016-07-07 14:33:16 -04:00
delete banObj.value;
delete banObj.score;
2016-08-31 12:20:47 -04:00
delete data.reasons;
2016-07-07 14:33:16 -04:00
return banObj;
});
}
};