From c924d27f143d1eeb33b8f034ac385038b199005c Mon Sep 17 00:00:00 2001 From: sabualha Date: Tue, 2 Sep 2025 05:57:37 +0000 Subject: [PATCH 1/4] finished 1A --- .devcontainer/devcontainer.json | 2 -- 1 file changed, 2 deletions(-) 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": { From 359db6536cb98f4d9a9f9dee0be2ff7a67be99a9 Mon Sep 17 00:00:00 2001 From: sabualha Date: Wed, 3 Sep 2025 09:11:47 +0000 Subject: [PATCH 2/4] Refactor: simplify noScriptErrors to reduce parameter count in src/controllers/write/utilities.js --- src/controllers/write/utilities.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/controllers/write/utilities.js b/src/controllers/write/utilities.js index 27df1b2ad7..50f4d94ae1 100644 --- a/src/controllers/write/utilities.js +++ b/src/controllers/write/utilities.js @@ -25,7 +25,8 @@ Utilities.login = (req, res) => { const userData = (await user.getUsers([req.uid], req.uid)).pop(); helpers.formatApiResponse(200, res, userData); }; - res.locals.noScriptErrors = (req, res, err, statusCode) => { + + res.locals.noScriptErrors = ({ req, res, err, statusCode = 400 }) => { helpers.formatApiResponse(statusCode, res, new Error(err)); }; From 2bd5a62cfdea096234325f561da2300e1489e498 Mon Sep 17 00:00:00 2001 From: sabualha Date: Sun, 7 Sep 2025 06:10:18 +0000 Subject: [PATCH 3/4] fixed complexity issue in category.js --- src/controllers/write/utilities.js | 3 +- src/posts/category.js | 44 ++++++++++++++++++------------ 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/controllers/write/utilities.js b/src/controllers/write/utilities.js index 50f4d94ae1..27df1b2ad7 100644 --- a/src/controllers/write/utilities.js +++ b/src/controllers/write/utilities.js @@ -25,8 +25,7 @@ Utilities.login = (req, res) => { const userData = (await user.getUsers([req.uid], req.uid)).pop(); helpers.formatApiResponse(200, res, userData); }; - - res.locals.noScriptErrors = ({ req, res, err, statusCode = 400 }) => { + res.locals.noScriptErrors = (req, res, err, statusCode) => { helpers.formatApiResponse(statusCode, res, new Error(err)); }; diff --git a/src/posts/category.js b/src/posts/category.js index b87342a89f..4df87da9d1 100644 --- a/src/posts/category.js +++ b/src/posts/category.js @@ -1,4 +1,3 @@ - 'use strict'; @@ -11,11 +10,15 @@ const activitypub = require('../activitypub'); module.exports = function (Posts) { Posts.getCidByPid = async function (pid) { const tid = await Posts.getPostField(pid, 'tid'); + console.log('SHAHD_TEST getCidByPid', pid, tid); + let result; if (!tid && activitypub.helpers.isUri(pid)) { - return -1; // fediverse pseudo-category + result = -1; // fediverse pseudo-category + } else { + result = await topics.getTopicField(tid, 'cid'); } - - return await topics.getTopicField(tid, 'cid'); + + return result; }; Posts.getCidsByPids = async function (pids) { @@ -23,24 +26,31 @@ module.exports = function (Posts) { const tids = _.uniq(postData.map(post => post && post.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; }; - + Posts.filterPidsByCid = async function (pids, cid) { + console.log('SHAHD_TEST filterPidsByCid', cid); + let filteredPids; if (!cid) { - return pids; + filteredPids = pids; + } else if (!Array.isArray(cid) || cid.length === 1) { + filteredPids = await filterPidsBySingleCid(pids, cid); + } else { + const pidsArr = await Promise.all(cid.map(c => Posts.filterPidsByCid(pids, c))); + filteredPids = _.union(...pidsArr); } - - if (!Array.isArray(cid) || cid.length === 1) { - return await filterPidsBySingleCid(pids, cid); - } - const pidsArr = await Promise.all(cid.map(c => Posts.filterPidsByCid(pids, c))); - return _.union(...pidsArr); + + return filteredPids; }; - - async function filterPidsBySingleCid(pids, cid) { - const isMembers = await db.isSortedSetMembers(`cid:${parseInt(cid, 10)}:pids`, pids); - return pids.filter((pid, index) => pid && isMembers[index]); + + async function filterPidsBySingleCid(pids) { + const isMembers = await db.isSortedSetMembers('cid:${parseInt(cid, 10)}:pids', pids); + const result = pids.filter((pid, index) => pid && isMembers[index]); + return result; } -}; + + +}; \ No newline at end of file From 764d875061787c51975470cd4d8712f6f72365ae Mon Sep 17 00:00:00 2001 From: sabualha Date: Sun, 7 Sep 2025 06:47:55 +0000 Subject: [PATCH 4/4] fixed coverage for category.js --- src/posts/category.js | 51 ++++++++++++++++++------------------------- 1 file changed, 21 insertions(+), 30 deletions(-) diff --git a/src/posts/category.js b/src/posts/category.js index 4df87da9d1..aba16d1854 100644 --- a/src/posts/category.js +++ b/src/posts/category.js @@ -1,6 +1,5 @@ 'use strict'; - const _ = require('lodash'); const db = require('../database'); @@ -10,47 +9,39 @@ const activitypub = require('../activitypub'); module.exports = function (Posts) { Posts.getCidByPid = async function (pid) { const tid = await Posts.getPostField(pid, 'tid'); - console.log('SHAHD_TEST getCidByPid', pid, tid); - let result; + if (!tid && activitypub.helpers.isUri(pid)) { - result = -1; // fediverse pseudo-category - } else { - result = await topics.getTopicField(tid, 'cid'); + return -1; // fediverse pseudo-category } - - return result; + 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) { - console.log('SHAHD_TEST filterPidsByCid', cid); - let filteredPids; - if (!cid) { - filteredPids = pids; - } else if (!Array.isArray(cid) || cid.length === 1) { - filteredPids = await filterPidsBySingleCid(pids, cid); - } else { - const pidsArr = await Promise.all(cid.map(c => Posts.filterPidsByCid(pids, c))); - filteredPids = _.union(...pidsArr); + + if (!cid) return pids; + + if (!Array.isArray(cid) || cid.length === 1) { + return filterPidsBySingleCid(pids, cid); } - - return filteredPids; - }; - - async function filterPidsBySingleCid(pids) { - const isMembers = await db.isSortedSetMembers('cid:${parseInt(cid, 10)}:pids', pids); - const result = pids.filter((pid, index) => pid && isMembers[index]); - return result; - } + const pidsArr = await Promise.all(cid.map(c => Posts.filterPidsByCid(pids, c))); + return _.union(...pidsArr); + }; + async function filterPidsBySingleCid(pids, cid) { + 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