diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index ad24c08a78..a3959633c8 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,5 +1,3 @@ -// For format details, see https://aka.ms/devcontainer.json. For config options, see the -// README at: https://github.com/devcontainers/templates/tree/main/src/javascript-node { "name": "NodeBB", "build": { diff --git a/src/posts/category.js b/src/posts/category.js index b87342a89f..aba16d1854 100644 --- a/src/posts/category.js +++ b/src/posts/category.js @@ -1,7 +1,5 @@ - 'use strict'; - const _ = require('lodash'); const db = require('../database'); @@ -11,36 +9,39 @@ const activitypub = require('../activitypub'); module.exports = function (Posts) { Posts.getCidByPid = async function (pid) { const tid = await Posts.getPostField(pid, 'tid'); + if (!tid && activitypub.helpers.isUri(pid)) { return -1; // fediverse pseudo-category } - - return await topics.getTopicField(tid, 'cid'); + return topics.getTopicField(tid, 'cid'); }; Posts.getCidsByPids = async function (pids) { const postData = await Posts.getPostsFields(pids, ['tid']); - const tids = _.uniq(postData.map(post => post && post.tid).filter(Boolean)); + const tids = _.uniq(postData.map(p => p && p.tid).filter(Boolean)); const topicData = await topics.getTopicsFields(tids, ['cid']); const tidToTopic = _.zipObject(tids, topicData); - const cids = postData.map(post => tidToTopic[post.tid] && tidToTopic[post.tid].cid); - return cids; + + // guard against null posts + return postData.map(p => (p && tidToTopic[p.tid] && tidToTopic[p.tid].cid) || undefined); }; Posts.filterPidsByCid = async function (pids, cid) { - if (!cid) { - return pids; - } + + if (!cid) return pids; if (!Array.isArray(cid) || cid.length === 1) { - return await filterPidsBySingleCid(pids, cid); + return filterPidsBySingleCid(pids, cid); } + const pidsArr = await Promise.all(cid.map(c => Posts.filterPidsByCid(pids, c))); return _.union(...pidsArr); }; async function filterPidsBySingleCid(pids, cid) { - const isMembers = await db.isSortedSetMembers(`cid:${parseInt(cid, 10)}:pids`, pids); + const cidNum = parseInt(Array.isArray(cid) ? cid[0] : cid, 10); + const key = `cid:${cidNum}:pids`; + const isMembers = await db.isSortedSetMembers(key, pids); return pids.filter((pid, index) => pid && isMembers[index]); } -}; +}; \ No newline at end of file