mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-10-31 11:05:54 +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