mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-26 08:36:12 +01:00
fix: #13657, fix remote category data inconsistency in sendNotificationToPostOwner
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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, '%').replace(/,/g, ',');
|
||||
|
||||
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,
|
||||
|
||||
Reference in New Issue
Block a user