'use strict'; var async = require('async'); var _ = require('underscore'); var db = require('../database'); var posts = require('../posts'); var topics = require('../topics'); module.exports = function(User) { User.getModerationHistory = function(uid, callback) { async.waterfall([ function(next) { async.parallel({ flags: async.apply(db.getSortedSetRevRangeWithScores, 'uid:' + uid + ':flag:pids', 0, 19), bans: async.apply(db.getSortedSetRevRangeWithScores, 'uid:' + uid + ':bans', 0, 19), reasons: async.apply(db.getSortedSetRevRangeWithScores, 'banned:' + uid + ':reasons', 0, 19) }, next); }, function(data, next) { getFlagMetadata(data, next); } ], function(err, data) { if (err) { return callback(err); } formatBanData(data); callback(null, data); }); }; function getFlagMetadata(data, callback) { var pids = data.flags.map(function(flagObj) { return parseInt(flagObj.value, 10); }); posts.getPostsFields(pids, ['tid'], function(err, postData) { if (err) { return callback(err); } var tids = postData.map(function(post) { return post.tid; }); topics.getTopicsFields(tids, ['title'], function(err, topicData) { if (err) { return callback(err); } data.flags = data.flags.map(function(flagObj, idx) { 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) { memo[cur.score] = cur.value; return memo; }, {}); data.bans = data.bans.map(function(banObj) { 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 = reasons[banObj.score] || '[[user:info.banned-no-reason]]'; delete banObj.value; delete banObj.score; delete data.reasons; return banObj; }); } };