diff --git a/src/flags.js b/src/flags.js index 5c8d45d2b6..465ec29048 100644 --- a/src/flags.js +++ b/src/flags.js @@ -363,27 +363,30 @@ Flags.create = async function (type, id, uid, reason, timestamp) { }; Flags.getReports = async function (flagId) { - const [reports, reporterUids] = await Promise.all([ - db.getSortedSetRevRangeWithScores(`flag:${flagId}:reports`, 0, -1), - db.getSortedSetRevRange(`flag:${flagId}:reporters`, 0, -1), - ]); + const payload = await db.getSortedSetRevRangeWithScores(`flag:${flagId}:reports`, 0, -1); + const [reports, uids] = payload.reduce(function (memo, cur) { + const value = cur.value.split(';'); + memo[1].push(value.shift()); + cur.value = value.join(';'); + memo[0].push(cur); + + return memo; + }, [[], []]); await Promise.all(reports.map(async (report, idx) => { report.timestamp = report.score; report.timestampISO = new Date(report.score).toISOString(); delete report.score; - report.reporter = await user.getUserFields(reporterUids[idx], ['username', 'userslug', 'picture', 'reputation']); + report.reporter = await user.getUserFields(uids[idx], ['username', 'userslug', 'picture', 'reputation']); })); return reports; }; Flags.addReport = async function (flagId, type, id, uid, reason, timestamp) { - // adds to reporters/report zsets await db.sortedSetAddBulk([ [`flags:byReporter:${uid}`, timestamp, flagId], - [`flag:${flagId}:reports`, timestamp, reason], - [`flag:${flagId}:reporters`, timestamp, uid], + [`flag:${flagId}:reports`, timestamp, [uid, reason].join(';')], ['flags:hash', flagId, [type, id, uid].join(':')], ]); diff --git a/src/upgrades/1.14.3/consolidate_flags.js b/src/upgrades/1.15.0/consolidate_flags.js similarity index 100% rename from src/upgrades/1.14.3/consolidate_flags.js rename to src/upgrades/1.15.0/consolidate_flags.js diff --git a/src/upgrades/1.15.0/remove_flag_reporters_zset.js b/src/upgrades/1.15.0/remove_flag_reporters_zset.js new file mode 100644 index 0000000000..3b3724da7e --- /dev/null +++ b/src/upgrades/1.15.0/remove_flag_reporters_zset.js @@ -0,0 +1,33 @@ +'use strict'; + +const db = require('../../database'); +const batch = require('../../batch'); + +module.exports = { + name: 'Remove flag reporters sorted set', + timestamp: Date.UTC(2020, 6, 31), + method: async function () { + const progress = this.progress; + progress.total = await db.sortedSetCard('flags:datetime'); + + await batch.processSortedSet('flags:datetime', async (flagIds) => { + await Promise.all(flagIds.map(async (flagId) => { + const [reports, reporterUids] = await Promise.all([ + db.getSortedSetRevRangeWithScores(`flag:${flagId}:reports`, 0, -1), + db.getSortedSetRevRange(`flag:${flagId}:reporters`, 0, -1), + ]); + + const values = reports.reduce((memo, cur, idx) => { + memo.push([`flag:${flagId}:reports`, cur.score, [(reporterUids[idx] || 0), cur.value].join(';')]); + return memo; + }, []); + + await db.delete(`flag:${flagId}:reports`); + await db.sortedSetAddBulk(values); + })); + }, { + batch: 500, + progress: progress, + }); + }, +}; diff --git a/src/upgrades/1.14.3/track_flags_by_target.js b/src/upgrades/1.15.0/track_flags_by_target.js similarity index 100% rename from src/upgrades/1.14.3/track_flags_by_target.js rename to src/upgrades/1.15.0/track_flags_by_target.js