You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

161 lines
4.3 KiB
JavaScript

'use strict';
var async = require('async');
var db = require('../../database');
var user = require('../../user');
var posts = require('../../posts');
var topics = require('../../topics');
var pagination = require('../../pagination');
var helpers = require('../helpers');
var accountHelpers = require('./helpers');
var postsController = module.exports;
var templateToData = {
'account/bookmarks': {
set: 'bookmarks',
type: 'posts',
noItemsFoundKey: '[[topic:bookmarks.has_no_bookmarks]]',
crumb: '[[user:bookmarks]]',
},
'account/posts': {
set: 'posts',
type: 'posts',
noItemsFoundKey: '[[user:has_no_posts]]',
crumb: '[[global:posts]]',
},
'account/upvoted': {
set: 'upvote',
type: 'posts',
noItemsFoundKey: '[[user:has_no_upvoted_posts]]',
crumb: '[[global:upvoted]]',
},
'account/downvoted': {
set: 'downvote',
type: 'posts',
noItemsFoundKey: '[[user:has_no_downvoted_posts]]',
crumb: '[[global:downvoted]]',
},
'account/best': {
set: 'posts:votes',
type: 'posts',
noItemsFoundKey: '[[user:has_no_voted_posts]]',
crumb: '[[global:best]]',
},
'account/watched': {
set: 'followed_tids',
type: 'topics',
noItemsFoundKey: '[[user:has_no_watched_topics]]',
crumb: '[[user:watched]]',
},
'account/ignored': {
set: 'ignored_tids',
type: 'topics',
noItemsFoundKey: '[[user:has_no_ignored_topics]]',
crumb: '[[user:ignored]]',
},
'account/topics': {
set: 'topics',
type: 'topics',
noItemsFoundKey: '[[user:has_no_topics]]',
crumb: '[[global:topics]]',
},
};
postsController.getBookmarks = function (req, res, next) {
getFromUserSet('account/bookmarks', req, res, next);
};
postsController.getPosts = function (req, res, next) {
getFromUserSet('account/posts', req, res, next);
};
postsController.getUpVotedPosts = function (req, res, next) {
getFromUserSet('account/upvoted', req, res, next);
};
postsController.getDownVotedPosts = function (req, res, next) {
getFromUserSet('account/downvoted', req, res, next);
};
postsController.getBestPosts = function (req, res, next) {
getFromUserSet('account/best', req, res, next);
};
postsController.getWatchedTopics = function (req, res, next) {
getFromUserSet('account/watched', req, res, next);
};
postsController.getIgnoredTopics = function (req, res, next) {
getFromUserSet('account/ignored', req, res, next);
};
postsController.getTopics = function (req, res, next) {
getFromUserSet('account/topics', req, res, next);
};
function getFromUserSet(template, req, res, callback) {
var data = templateToData[template];
data.template = template;
data.method = data.type === 'posts' ? posts.getPostSummariesFromSet : topics.getTopicsFromSet;
var userData;
var itemsPerPage;
var page = Math.max(1, parseInt(req.query.page, 10) || 1);
async.waterfall([
function (next) {
async.parallel({
settings: function (next) {
user.getSettings(req.uid, next);
},
userData: function (next) {
accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, next);
},
}, next);
},
function (results, next) {
if (!results.userData) {
return callback();
}
userData = results.userData;
var setName = 'uid:' + userData.uid + ':' + data.set;
itemsPerPage = (data.template === 'account/topics' || data.template === 'account/watched') ? results.settings.topicsPerPage : results.settings.postsPerPage;
async.parallel({
itemCount: function (next) {
if (results.settings.usePagination) {
db.sortedSetCard(setName, next);
} else {
next(null, 0);
}
},
data: function (next) {
var start = (page - 1) * itemsPerPage;
var stop = start + itemsPerPage - 1;
data.method(setName, req.uid, start, stop, next);
},
}, next);
},
function (results) {
userData[data.type] = results.data[data.type];
userData.nextStart = results.data.nextStart;
var pageCount = Math.ceil(results.itemCount / itemsPerPage);
userData.pagination = pagination.create(page, pageCount);
userData.noItemsFoundKey = data.noItemsFoundKey;
userData.title = '[[pages:' + data.template + ', ' + userData.username + ']]';
userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: '/user/' + userData.userslug }, { text: data.crumb }]);
res.render(data.template, userData);
},
], callback);
}
module.exports = postsController;