Files
NodeBB/src/controllers/recent.js

132 lines
3.7 KiB
JavaScript
Raw Normal View History

2015-08-17 16:38:05 -04:00
'use strict';
2016-05-13 14:08:50 +03:00
var async = require('async');
2016-01-26 18:13:18 +02:00
var nconf = require('nconf');
2016-04-30 10:47:28 +03:00
2016-05-13 14:08:50 +03:00
var user = require('../user');
var categories = require('../categories');
2016-01-26 18:13:18 +02:00
var topics = require('../topics');
var meta = require('../meta');
var helpers = require('./helpers');
2016-05-13 14:08:50 +03:00
var pagination = require('../pagination');
2019-01-26 23:44:41 -05:00
var privileges = require('../privileges');
2015-08-17 16:38:05 -04:00
2017-08-21 16:51:42 -04:00
var recentController = module.exports;
2015-08-17 16:38:05 -04:00
recentController.get = function (req, res, next) {
2018-06-18 14:37:32 -04:00
async.waterfall([
function (next) {
recentController.getData(req, 'recent', 'recent', next);
},
function (data, next) {
if (!data) {
return next();
}
res.render('recent', data);
},
], next);
};
recentController.getData = function (req, url, sort, callback) {
2016-05-13 14:08:50 +03:00
var page = parseInt(req.query.page, 10) || 1;
var stop = 0;
2018-06-18 14:37:32 -04:00
var term = helpers.terms[req.query.term];
2016-05-13 14:08:50 +03:00
var settings;
2016-11-03 13:06:21 +03:00
var cid = req.query.cid;
2018-06-18 14:37:32 -04:00
var filter = req.query.filter || '';
2016-11-03 13:06:21 +03:00
var categoryData;
2017-09-21 13:50:24 -04:00
var rssToken;
2019-01-26 23:44:41 -05:00
var canPost;
2017-10-19 13:53:05 -04:00
2018-06-18 14:37:32 -04:00
if (!helpers.validFilters[filter] || (!term && req.query.term)) {
2018-06-27 16:14:40 -04:00
return callback(null, null);
2016-11-03 13:06:21 +03:00
}
2018-06-18 14:37:32 -04:00
term = term || 'alltime';
2015-08-17 16:38:05 -04:00
2016-05-13 14:08:50 +03:00
async.waterfall([
function (next) {
async.parallel({
settings: function (next) {
2016-05-13 14:08:50 +03:00
user.getSettings(req.uid, next);
},
categories: function (next) {
2019-03-09 11:16:36 -05:00
const states = [categories.watchStates.watching, categories.watchStates.notwatching];
if (filter === 'watched') {
states.push(categories.watchStates.ignoring);
}
helpers.getCategoriesByStates(req.uid, cid, states, next);
2017-02-17 19:31:21 -07:00
},
2017-09-21 13:50:24 -04:00
rssToken: function (next) {
user.auth.getFeedToken(req.uid, next);
},
2019-01-26 23:44:41 -05:00
canPost: function (next) {
canPostTopic(req.uid, next);
},
2016-05-13 14:08:50 +03:00
}, next);
},
function (results, next) {
2017-09-21 13:50:24 -04:00
rssToken = results.rssToken;
2016-05-13 14:08:50 +03:00
settings = results.settings;
categoryData = results.categories;
2019-01-26 23:44:41 -05:00
canPost = results.canPost;
2016-11-03 18:02:10 +03:00
2016-05-13 14:08:50 +03:00
var start = Math.max(0, (page - 1) * settings.topicsPerPage);
stop = start + settings.topicsPerPage - 1;
2015-08-17 16:38:05 -04:00
2018-06-18 14:37:32 -04:00
topics.getSortedTopics({
cids: cid,
uid: req.uid,
start: start,
stop: stop,
filter: filter,
term: term,
sort: sort,
2018-10-22 13:07:02 -04:00
query: req.query,
2018-06-18 14:37:32 -04:00
}, next);
2017-02-17 19:31:21 -07:00
},
2018-06-18 14:37:32 -04:00
function (data, next) {
2019-01-26 23:44:41 -05:00
data.canPost = canPost;
2017-08-21 16:51:42 -04:00
data.categories = categoryData.categories;
2018-06-18 14:37:32 -04:00
data.allCategoriesUrl = url + helpers.buildQueryString('', filter, '');
2017-08-21 16:51:42 -04:00
data.selectedCategory = categoryData.selectedCategory;
2017-10-30 15:26:12 -04:00
data.selectedCids = categoryData.selectedCids;
data['feeds:disableRSS'] = meta.config['feeds:disableRSS'];
2018-06-18 14:37:32 -04:00
data.rssFeedUrl = nconf.get('relative_path') + '/' + url + '.rss';
2018-01-31 15:20:17 -05:00
if (req.loggedIn) {
2017-09-21 13:50:24 -04:00
data.rssFeedUrl += '?uid=' + req.uid + '&token=' + rssToken;
}
2017-12-06 11:54:08 -05:00
data.title = meta.config.homePageTitle || '[[pages:home]]';
2017-08-21 16:51:42 -04:00
2018-06-18 14:37:32 -04:00
data.filters = helpers.buildFilters(url, filter, req.query);
2019-01-26 23:44:41 -05:00
data.selectedFilter = data.filters.find(filter => filter && filter.selected);
2018-06-18 14:37:32 -04:00
data.terms = helpers.buildTerms(url, term, req.query);
2019-01-26 23:44:41 -05:00
data.selectedTerm = data.terms.find(term => term && term.selected);
2017-08-21 16:51:42 -04:00
var pageCount = Math.max(1, Math.ceil(data.topicCount / settings.topicsPerPage));
data.pagination = pagination.create(page, pageCount, req.query);
2018-06-18 14:37:32 -04:00
if (req.originalUrl.startsWith(nconf.get('relative_path') + '/api/' + url) || req.originalUrl.startsWith(nconf.get('relative_path') + '/' + url)) {
data.title = '[[pages:' + url + ']]';
data.breadcrumbs = helpers.buildBreadcrumbs([{ text: '[[' + url + ':title]]' }]);
2017-08-21 16:51:42 -04:00
}
2018-06-18 14:37:32 -04:00
next(null, data);
2017-08-21 16:51:42 -04:00
},
2018-06-18 14:37:32 -04:00
], callback);
2015-08-17 16:38:05 -04:00
};
2019-01-26 23:44:41 -05:00
function canPostTopic(uid, callback) {
async.waterfall([
function (next) {
categories.getAllCidsFromSet('categories:cid', next);
},
function (cids, next) {
privileges.categories.filterCids('topics:create', cids, uid, next);
},
function (cids, next) {
next(null, cids.length > 0);
},
], callback);
}