mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-01 03:26:04 +01:00
fix: #12880, refactored ap controller.list to use buildTopicsSortedSet, moved out poor man's intersect to internal method
This commit is contained in:
@@ -20,6 +20,17 @@ const validSorts = [
|
|||||||
'recently_replied', 'recently_created', 'most_posts', 'most_votes', 'most_views',
|
'recently_replied', 'recently_created', 'most_posts', 'most_votes', 'most_views',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
async function getTids(data) {
|
||||||
|
// Poor man's intersect used instead of getSortedSetIntersect because the zsets are huge
|
||||||
|
const sets = await categories.buildTopicsSortedSet(data);
|
||||||
|
const mainSet = sets.shift();
|
||||||
|
let tids = await db.getSortedSetRevRange(mainSet, 0, 499);
|
||||||
|
let intersection = await Promise.all(sets.map(async set => db.isSortedSetMembers(set, tids)));
|
||||||
|
intersection = intersection.reduce((memo, cur) => memo.map((show, idx) => show && cur[idx]));
|
||||||
|
tids = tids.filter((_, idx) => intersection[idx]);
|
||||||
|
return tids.slice(data.start, data.stop + 1);
|
||||||
|
}
|
||||||
|
|
||||||
controller.list = async function (req, res) {
|
controller.list = async function (req, res) {
|
||||||
if (!req.uid) {
|
if (!req.uid) {
|
||||||
return helpers.redirect(res, '/recent?cid=-1', false);
|
return helpers.redirect(res, '/recent?cid=-1', false);
|
||||||
@@ -30,14 +41,6 @@ controller.list = async function (req, res) {
|
|||||||
const start = Math.max(0, (page - 1) * topicsPerPage);
|
const start = Math.max(0, (page - 1) * topicsPerPage);
|
||||||
const stop = start + topicsPerPage - 1;
|
const stop = start + topicsPerPage - 1;
|
||||||
|
|
||||||
const sortToSet = {
|
|
||||||
recently_replied: `cid:-1:tids`,
|
|
||||||
recently_created: `cid:-1:tids:create`,
|
|
||||||
most_posts: `cid:-1:tids:posts`,
|
|
||||||
most_votes: `cid:-1:tids:votes`,
|
|
||||||
most_views: `cid:-1:tids:views`,
|
|
||||||
};
|
|
||||||
|
|
||||||
const [userPrivileges, tagData, userSettings, rssToken] = await Promise.all([
|
const [userPrivileges, tagData, userSettings, rssToken] = await Promise.all([
|
||||||
privileges.categories.get('-1', req.uid),
|
privileges.categories.get('-1', req.uid),
|
||||||
helpers.getSelectedTag(req.query.tag),
|
helpers.getSelectedTag(req.query.tag),
|
||||||
@@ -45,16 +48,8 @@ controller.list = async function (req, res) {
|
|||||||
user.auth.getFeedToken(req.uid),
|
user.auth.getFeedToken(req.uid),
|
||||||
]);
|
]);
|
||||||
const sort = validSorts.includes(req.query.sort) ? req.query.sort : userSettings.categoryTopicSort;
|
const sort = validSorts.includes(req.query.sort) ? req.query.sort : userSettings.categoryTopicSort;
|
||||||
|
|
||||||
let tids = await db.getSortedSetRevRange(sortToSet[sort], 0, 499);
|
|
||||||
const isMembers = await db.isSortedSetMembers(`uid:${req.uid}:inbox`, tids);
|
|
||||||
tids = tids.filter((tid, idx) => isMembers[idx]);
|
|
||||||
const count = tids.length;
|
|
||||||
tids = tids.slice(start, stop + 1);
|
|
||||||
|
|
||||||
const targetUid = await user.getUidByUserslug(req.query.author);
|
const targetUid = await user.getUidByUserslug(req.query.author);
|
||||||
|
const cidQuery = {
|
||||||
const data = await categories.getCategoryById({
|
|
||||||
uid: req.uid,
|
uid: req.uid,
|
||||||
cid: '-1',
|
cid: '-1',
|
||||||
start: start,
|
start: start,
|
||||||
@@ -64,12 +59,13 @@ controller.list = async function (req, res) {
|
|||||||
query: req.query,
|
query: req.query,
|
||||||
tag: req.query.tag,
|
tag: req.query.tag,
|
||||||
targetUid: targetUid,
|
targetUid: targetUid,
|
||||||
});
|
};
|
||||||
|
const data = await categories.getCategoryById(cidQuery);
|
||||||
data.name = '[[activitypub:world.name]]';
|
data.name = '[[activitypub:world.name]]';
|
||||||
delete data.children;
|
delete data.children;
|
||||||
|
|
||||||
data.topicCount = count;
|
const tids = await getTids(cidQuery);
|
||||||
|
data.topicCount = tids.length;
|
||||||
data.topics = await topics.getTopicsByTids(tids, { uid: req.uid });
|
data.topics = await topics.getTopicsByTids(tids, { uid: req.uid });
|
||||||
topics.calculateTopicIndices(data.topics, start);
|
topics.calculateTopicIndices(data.topics, start);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user