Merge remote-tracking branch 'origin/master' into develop

This commit is contained in:
Julian Lam
2025-09-15 14:01:08 -04:00
4 changed files with 33 additions and 11 deletions

View File

@@ -136,6 +136,7 @@ Actors.topic = async function (req, res, next) {
let collection;
let pids;
try {
// pids are used in generation of digest only.
([collection, pids] = await Promise.all([
activitypub.helpers.generateCollection({
set: `tid:${req.params.tid}:posts`,
@@ -151,7 +152,6 @@ Actors.topic = async function (req, res, next) {
}
pids.push(mainPid);
pids = pids.map(pid => (utils.isNumber(pid) ? `${nconf.get('url')}/post/${pid}` : pid));
collection.totalItems += 1; // account for mainPid
// Generate digest for ETag
const digest = activitypub.helpers.generateDigest(new Set(pids));
@@ -168,15 +168,18 @@ Actors.topic = async function (req, res, next) {
}
res.set('ETag', digest);
// Convert pids to urls
// Add OP to collection on first (or only) page
if (page || collection.totalItems < perPage) {
collection.orderedItems = collection.orderedItems || [];
if (!page || page === 1) { // add OP to collection
if (!page || page === 1) {
collection.orderedItems.unshift(mainPid);
collection.totalItems += 1;
}
collection.orderedItems = collection.orderedItems.map(pid => (utils.isNumber(pid) ? `${nconf.get('url')}/post/${pid}` : pid));
}
// Convert pids to urls
collection.orderedItems = collection.orderedItems.map(pid => (utils.isNumber(pid) ? `${nconf.get('url')}/post/${pid}` : pid));
const object = {
'@context': 'https://www.w3.org/ns/activitystreams',
id: `${nconf.get('url')}/topic/${req.params.tid}${collection.orderedItems && page ? `?page=${page}` : ''}`,

View File

@@ -166,7 +166,7 @@ actions.buildCSS = async function buildCSS(data) {
};
if (data.minify) {
opts.silenceDeprecations = [
'legacy-js-api', 'mixed-decls', 'color-functions',
'legacy-js-api', 'color-functions',
'global-builtin', 'import',
];
}

View File

@@ -9,6 +9,7 @@ const _ = require('lodash');
const db = require('./database');
const User = require('./user');
const categories = require('./categories');
const posts = require('./posts');
const groups = require('./groups');
const meta = require('./meta');
@@ -84,7 +85,24 @@ Notifications.getMultiple = async function (nids) {
const notifications = await db.getObjects(keys);
const userKeys = notifications.map(n => n && n.from);
const usersData = await User.getUsersFields(userKeys, ['username', 'userslug', 'picture']);
let [usersData, categoriesData] = await Promise.all([
User.getUsersFields(userKeys, ['username', 'userslug', 'picture']),
categories.getCategoriesFields(userKeys, ['cid', 'name', 'slug', 'picture']),
]);
// Merge valid categoriesData into usersData
usersData = usersData.map((userData, idx) => {
const categoryData = categoriesData[idx];
if (!userData.uid && categoryData.cid) {
return {
username: categoryData.slug,
displayname: categoryData.name,
userslug: categoryData.slug,
picture: categoryData.picture,
};
}
return userData;
});
notifications.forEach((notification, index) => {
if (notification) {

View File

@@ -94,7 +94,10 @@ SocketHelpers.sendNotificationToPostOwner = async function (pid, fromuid, comman
return;
}
fromuid = utils.isNumber(fromuid) ? parseInt(fromuid, 10) : fromuid;
const postData = await posts.getPostFields(pid, ['tid', 'uid', 'content']);
const [postData, fromCategory] = await Promise.all([
posts.getPostFields(pid, ['tid', 'uid', 'content']),
!utils.isNumber(fromuid) && categories.exists(fromuid),
]);
const [canRead, isIgnoring] = await Promise.all([
privileges.posts.can('topics:read', pid, postData.uid),
topics.isIgnoring([postData.tid], postData.uid),
@@ -103,19 +106,17 @@ SocketHelpers.sendNotificationToPostOwner = async function (pid, fromuid, comman
return;
}
const [userData, topicTitle, postObj] = await Promise.all([
user.getUserFields(fromuid, ['username']),
fromCategory ? categories.getCategoryFields(fromuid, ['name']) : user.getUserFields(fromuid, ['username']),
topics.getTopicField(postData.tid, 'title'),
posts.parsePost(postData),
]);
const { displayname } = userData;
const title = utils.decodeHTMLEntities(topicTitle);
const titleEscaped = title.replace(/%/g, '&#37;').replace(/,/g, '&#44;');
const notifObj = await notifications.create({
type: command,
bodyShort: `[[${notification}, ${displayname}, ${titleEscaped}]]`,
bodyShort: `[[${notification}, ${userData.displayname || userData.name}, ${titleEscaped}]]`,
bodyLong: postObj.content,
pid: pid,
tid: postData.tid,