Files
NodeBB/src/socket.io/topics/infinitescroll.js

135 lines
4.2 KiB
JavaScript
Raw Normal View History

'use strict';
var async = require('async');
2016-08-31 22:50:48 +03:00
var topics = require('../../topics');
const categories = require('../../categories');
var privileges = require('../../privileges');
var meta = require('../../meta');
var utils = require('../../utils');
2016-03-21 17:49:44 +02:00
var social = require('../../social');
module.exports = function (SocketTopics) {
SocketTopics.loadMore = function (socket, data, callback) {
if (!data || !data.tid || !utils.isNumber(data.after) || parseInt(data.after, 10) < 0) {
return callback(new Error('[[error:invalid-data]]'));
}
2016-11-08 18:14:30 +03:00
var userPrivileges;
async.waterfall([
function (next) {
async.parallel({
privileges: function (next) {
privileges.topics.get(data.tid, socket.uid, next);
},
topic: function (next) {
topics.getTopicFields(data.tid, ['postcount', 'deleted'], next);
2017-02-17 19:31:21 -07:00
},
2016-11-08 18:14:30 +03:00
}, next);
},
2016-11-08 18:14:30 +03:00
function (results, next) {
2018-10-25 17:02:59 -04:00
if (!results.privileges['topics:read'] || (results.topic.deleted && !results.privileges.view_deleted)) {
2016-11-08 18:14:30 +03:00
return callback(new Error('[[error:no-privileges]]'));
}
2016-11-08 18:14:30 +03:00
userPrivileges = results.privileges;
var set = data.topicPostSort === 'most_votes' ? 'tid:' + data.tid + ':posts:votes' : 'tid:' + data.tid + ':posts';
2016-11-08 18:14:30 +03:00
var reverse = data.topicPostSort === 'newest_to_oldest' || data.topicPostSort === 'most_votes';
var start = Math.max(0, parseInt(data.after, 10));
var infScrollPostsPerPage = Math.max(0, Math.min(meta.config.postsPerPage || 20, parseInt(data.count, 10) || meta.config.postsPerPage || 20));
if (data.direction === -1) {
start -= (infScrollPostsPerPage + 1);
}
var stop = start + infScrollPostsPerPage - 1;
2016-11-08 18:14:30 +03:00
start = Math.max(0, start);
stop = Math.max(0, stop);
async.parallel({
mainPost: function (next) {
if (start > 0) {
return next();
}
topics.getMainPost(data.tid, socket.uid, next);
},
posts: function (next) {
topics.getTopicPosts(data.tid, set, start, stop, socket.uid, reverse, next);
},
postSharing: function (next) {
social.getActivePostSharing(next);
2017-02-17 19:31:21 -07:00
},
2016-11-08 18:14:30 +03:00
}, next);
},
function (topicData, next) {
if (topicData.mainPost) {
topicData.posts = [topicData.mainPost].concat(topicData.posts);
}
2015-10-06 18:41:39 -04:00
2016-11-08 18:14:30 +03:00
topicData.privileges = userPrivileges;
topicData['reputation:disabled'] = meta.config['reputation:disabled'] === 1;
topicData['downvote:disabled'] = meta.config['downvote:disabled'] === 1;
2015-10-06 18:41:39 -04:00
2016-11-08 18:14:30 +03:00
topics.modifyPostsByPrivilege(topicData, userPrivileges);
next(null, topicData);
2017-02-17 19:31:21 -07:00
},
2016-11-08 18:14:30 +03:00
], callback);
};
SocketTopics.loadMoreSortedTopics = function (socket, data, callback) {
2017-12-08 20:10:37 -05:00
if (!data || !utils.isNumber(data.after) || parseInt(data.after, 10) < 0) {
return callback(new Error('[[error:invalid-data]]'));
}
const { start, stop } = calculateStartStop(data);
2018-10-22 13:07:02 -04:00
const params = {
uid: socket.uid,
2018-06-18 14:37:32 -04:00
start: start,
stop: stop,
filter: data.filter,
2018-10-22 13:07:02 -04:00
query: data.query,
};
if (data.sort === 'unread') {
2018-10-22 13:07:02 -04:00
params.cid = data.cid;
2019-07-19 17:02:25 -04:00
topics.getUnreadTopics(params, callback);
return;
2018-10-22 13:07:02 -04:00
}
params.cids = data.cid;
params.sort = data.sort;
2018-10-22 13:07:02 -04:00
params.term = data.term;
topics.getSortedTopics(params, callback);
};
2017-12-08 20:10:37 -05:00
SocketTopics.loadMoreFromSet = function (socket, data, callback) {
2016-03-14 10:40:24 -04:00
if (!data || !utils.isNumber(data.after) || parseInt(data.after, 10) < 0 || !data.set) {
return callback(new Error('[[error:invalid-data]]'));
}
const { start, stop } = calculateStartStop(data);
topics.getTopicsFromSet(data.set, socket.uid, start, stop, callback);
};
SocketTopics.loadMoreUserTopics = function (socket, data, callback) {
async.waterfall([
function (next) {
categories.getCidsByPrivilege('categories:cid', socket.uid, 'topics:read', next);
},
function (cids, next) {
data.set = cids.map(c => 'cid:' + c + ':uid:' + data.uid + ':tids');
SocketTopics.loadMoreFromSet(socket, data, next);
},
], callback);
};
function calculateStartStop(data) {
var itemsPerPage = Math.min(meta.config.topicsPerPage || 20, parseInt(data.count, 10) || meta.config.topicsPerPage || 20);
var start = Math.max(0, parseInt(data.after, 10));
if (data.direction === -1) {
start -= itemsPerPage;
}
var stop = start + Math.max(0, itemsPerPage - 1);
return { start: Math.max(0, start), stop: Math.max(0, stop) };
}
2017-02-18 02:30:48 -07:00
};