diff --git a/install/package.json b/install/package.json index e8521a4fe1..8ff948229b 100644 --- a/install/package.json +++ b/install/package.json @@ -103,10 +103,10 @@ "nodebb-plugin-ntfy": "1.7.4", "nodebb-plugin-spam-be-gone": "2.2.2", "nodebb-rewards-essentials": "1.0.0", - "nodebb-theme-harmony": "1.2.51", + "nodebb-theme-harmony": "1.2.52", "nodebb-theme-lavender": "7.1.8", "nodebb-theme-peace": "2.2.4", - "nodebb-theme-persona": "13.3.16", + "nodebb-theme-persona": "13.3.17", "nodebb-widget-essentials": "7.0.15", "nodemailer": "6.9.13", "nprogress": "0.2.0", diff --git a/public/language/en-GB/flags.json b/public/language/en-GB/flags.json index 996e027833..0a42e3877f 100644 --- a/public/language/en-GB/flags.json +++ b/public/language/en-GB/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/en-GB/user.json b/public/language/en-GB/user.json index cd9b17cd0a..b010898322 100644 --- a/public/language/en-GB/user.json +++ b/public/language/en-GB/user.json @@ -181,6 +181,10 @@ "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", "info.no-ban-history": "This user has never been banned", diff --git a/src/flags.js b/src/flags.js index e3932f3bd8..00bce1d9bd 100644 --- a/src/flags.js +++ b/src/flags.js @@ -914,7 +914,7 @@ Flags.notify = async function (flagObj, uid, notifySelf = false) { }); uids = uids.concat(modUids[0]); } else if (flagObj.type === 'user') { - const targetDisplayname = flagObj.target && flagObj.target.user ? flagObj.target.user.displayname : '[[global:guest]]'; + const targetDisplayname = flagObj.target && flagObj.target.displayname ? flagObj.target.displayname : '[[global:guest]]'; notifObj = await notifications.create({ type: 'new-user-flag', bodyShort: `[[notifications:user-flagged-user, ${displayname}, ${targetDisplayname}]]`, diff --git a/src/user/info.js b/src/user/info.js index 1c62f3f875..ff67dbd3cb 100644 --- a/src/user/info.js +++ b/src/user/info.js @@ -7,6 +7,7 @@ const db = require('../database'); const posts = require('../posts'); const topics = require('../topics'); const utils = require('../utils'); +const Flags = require('../flags'); module.exports = function (User) { User.getLatestBanInfo = async function (uid) { @@ -40,24 +41,11 @@ module.exports = function (User) { ], 0, 19), ]); - // Get pids from flag objects const keys = flags.map(flagObj => `flag:${flagObj.value}`); - const payload = await db.getObjectsFields(keys, ['type', 'targetId']); - - // Only pass on flag ids from posts - flags = payload.reduce((memo, cur, idx) => { - if (cur.type === 'post') { - memo.push({ - value: parseInt(cur.targetId, 10), - score: flags[idx].score, - }); - } - - return memo; - }, []); + const payload = await db.getObjectsFields(keys, ['flagId', 'type', 'targetId', 'datetime']); [flags, bans, mutes] = await Promise.all([ - getFlagMetadata(flags), + getFlagMetadata(payload), formatBanMuteData(bans, '[[user:info.banned-no-reason]]'), formatBanMuteData(mutes, '[[user:info.muted-no-reason]]'), ]); @@ -81,18 +69,23 @@ module.exports = function (User) { }; async function getFlagMetadata(flags) { - const pids = flags.map(flagObj => parseInt(flagObj.value, 10)); + const postFlags = flags.filter(flag => flag && flag.type === 'post'); + const reports = await Promise.all(flags.map(flag => Flags.getReports(flag.flagId))); + + flags.forEach((flag, idx) => { + if (flag) { + flag.timestampISO = new Date(flag.datetime).toISOString(); + flag.reports = reports[idx]; + } + }); + + const pids = postFlags.map(flagObj => parseInt(flagObj.targetId, 10)); const postData = await posts.getPostsFields(pids, ['tid']); const tids = postData.map(post => post.tid); const topicData = await topics.getTopicsFields(tids, ['title']); - flags = flags.map((flagObj, idx) => { - flagObj.pid = flagObj.value; - flagObj.timestamp = flagObj.score; - flagObj.timestampISO = new Date(flagObj.score).toISOString(); - - delete flagObj.value; - delete flagObj.score; + postFlags.forEach((flagObj, idx) => { + flagObj.pid = flagObj.targetId; if (!tids[idx]) { flagObj.targetPurged = true; }