feat: closes #12490, show profile flags on account info page

This commit is contained in:
Barış Soner Uşaklı
2024-04-23 12:39:51 -04:00
parent 18a843bc1e
commit b429045ff6
5 changed files with 24 additions and 27 deletions

View File

@@ -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",

View File

@@ -90,6 +90,6 @@
"bulk-actions": "Bulk Actions",
"bulk-resolve": "Resolve Flag(s)",
"bulk-success": "%1 flags updated",
"flagged-timeago-readable": "Flagged <span class=\"timeago\" title=\"%1\"></span> (%2)",
"flagged-timeago": "Flagged <span class=\"timeago\" title=\"%1\"></span>",
"auto-flagged": "[Auto Flagged] Received %1 downvotes."
}

View File

@@ -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",

View File

@@ -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}]]`,

View File

@@ -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;
}