From 1f7e670c7cf0240ccd49d00e89fa132eb9e287b0 Mon Sep 17 00:00:00 2001 From: Thomas Lynch Date: Sun, 9 Aug 2020 20:08:23 +1000 Subject: [PATCH] modlog records for non-delete actions now link to posts closes #193 --- gulpfile.js | 7 +++-- helpers/addmodlogs.js | 8 +++-- migrations/index.js | 1 + migrations/migration-0.0.10.js | 35 ++++++++++++++++++++++ models/forms/actionhandler.js | 9 ++++-- models/forms/addban.js | 3 +- models/forms/editpost.js | 6 +++- package-lock.json | 51 ++++++++++++++++++++++++++++++-- package.json | 3 +- views/pages/globalmanagelogs.pug | 10 +++++-- views/pages/managelogs.pug | 10 +++++-- views/pages/modlog.pug | 10 +++++-- 12 files changed, 134 insertions(+), 19 deletions(-) create mode 100644 migrations/migration-0.0.10.js diff --git a/gulpfile.js b/gulpfile.js index 53a3b97b..c59cd692 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -2,6 +2,7 @@ const gulp = require('gulp') , fs = require('fs-extra') + , semver = require('semver') , formatSize = require(__dirname+'/helpers/files/formatsize.js') , uploadDirectory = require(__dirname+'/helpers/files/uploadDirectory.js') , configs = require(__dirname+'/configs/main.js') @@ -251,10 +252,12 @@ async function migrate() { '_id': 'version' }).then(res => res ? res.version : '0.0.0'); // 0.0.0 for old versions - if (currentVersion < migrateVersion) { + if (semver.lt(currentVersion, migrateVersion)) { console.log(`Current version: ${currentVersion}`); const migrations = require(__dirname+'/migrations/'); - const migrationVersions = Object.keys(migrations).sort().filter(v => v > currentVersion); + const migrationVersions = Object.keys(migrations) + .sort(semver.compare) + .filter(v => semver.gt(v, currentVersion)); console.log(`Migrations needed: ${currentVersion} -> ${migrationVersions.join(' -> ')}`); for (let ver of migrationVersions) { console.log(`=====\nStarting migration to version ${ver}`); diff --git a/helpers/addmodlogs.js b/helpers/addmodlogs.js index 260b1b58..9984f872 100644 --- a/helpers/addmodlogs.js +++ b/helpers/addmodlogs.js @@ -16,7 +16,8 @@ if (!modlog[post.board]) { //per board actions, all actions combined to one event modlog[post.board] = { - postIds: [], + showLinks: + postLinks: [], actions: modlogActions, date: logDate, showUser: !req.body.hide_name || logUser === 'Unregistered User' ? true : false, @@ -29,7 +30,10 @@ }; } //push each post id - modlog[post.board].postIds.push(post.postId); + modlog[post.board].postLinks.push({ + postId: post.postId, + thread: req.body.move ? req.body.move_to_thread : post.thread, + }) } const modlogDocuments = []; for (let i = 0; i < threadBoards.length; i++) { diff --git a/migrations/index.js b/migrations/index.js index f05e35af..2f6a7dd9 100644 --- a/migrations/index.js +++ b/migrations/index.js @@ -10,4 +10,5 @@ module.exports = { '0.0.7': require(__dirname+'/migration-0.0.7.js'), //sage only email without force anon for some reason '0.0.8': require(__dirname+'/migration-0.0.8.js'), //option to auto reset triggers after hour is over '0.0.9': require(__dirname+'/migration-0.0.9.js'), //ip changes + '0.0.10': require(__dirname+'/migration-0.0.10.js'), //add links to modlog for new logs } diff --git a/migrations/migration-0.0.10.js b/migrations/migration-0.0.10.js new file mode 100644 index 00000000..2ccfcc10 --- /dev/null +++ b/migrations/migration-0.0.10.js @@ -0,0 +1,35 @@ +'use strict'; + +const hashIp = require(__dirname+'/../helpers/haship.js'); + +module.exports = async(db, redis) => { + console.log('update moglog postids to postlinks'); + await db.collection('modlog').updateMany({}, + [{ + $addFields: { + postLinks: [ + { + $arrayToObject: { + $map: { + input: "$postIds", + as: 'postId', + in: { + k: 'postId', + v: '$$postId' + } + } + } + } + ] + } + } + ]); + await db.collection('modlog').updateMany({}, { + '$unset': { + 'postIds': '' + }, + '$set': { + 'showLinks': false + } + }); +}; diff --git a/models/forms/actionhandler.js b/models/forms/actionhandler.js index 4bf5e6dd..c85acf2e 100644 --- a/models/forms/actionhandler.js +++ b/models/forms/actionhandler.js @@ -286,7 +286,8 @@ module.exports = async (req, res, next) => { if (!modlog[post.board]) { //per board actions, all actions combined to one event modlog[post.board] = { - postIds: [], + showLinks: !deleting, + postLinks: [], actions: modlogActions, date: logDate, showUser: !req.body.hide_name || logUser === 'Unregistered User' ? true : false, @@ -298,8 +299,10 @@ module.exports = async (req, res, next) => { } }; } - //push each post id - modlog[post.board].postIds.push(post.postId); + modlog[post.board].postLinks.push({ + postId: post.postId, + thread: req.body.move ? req.body.move_to_thread : post.thread, + }); } const modlogDocuments = []; for (let i = 0; i < threadBoards.length; i++) { diff --git a/models/forms/addban.js b/models/forms/addban.js index 66f80971..aa3281cc 100644 --- a/models/forms/addban.js +++ b/models/forms/addban.js @@ -31,7 +31,8 @@ module.exports = async (req, res, redirect) => { const modlogPromise = Modlogs.insertOne({ 'board': req.params.board || null, - 'postIds': [], + 'showLinks': false, + 'postLinks': [], 'actions': [(req.params.board ? 'Ban' : 'Global Ban')], 'date': actionDate, 'showUser': !req.body.hide_name || res.locals.permLevel >= 4 ? true : false, diff --git a/models/forms/editpost.js b/models/forms/editpost.js index fbe743c8..c4a23372 100644 --- a/models/forms/editpost.js +++ b/models/forms/editpost.js @@ -139,7 +139,11 @@ todo: handle some more situations //add the edit to the modlog await Modlogs.insertOne({ board: board._id, - postIds: [post.postId], + showLinks: true, + postLinks: [{ + postId: post.postId, + thread: post.thread, + }], actions: 'Edit', date: new Date(), showUser: req.body.hide_name ? false : true, diff --git a/package-lock.json b/package-lock.json index 79555f73..d3e5ad66 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,6 +57,13 @@ "semver": "^5.5.0", "shimmer": "^1.2.0", "uuid": "^3.2.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } } }, "@opencensus/propagation-b3": { @@ -78,6 +85,13 @@ "semver": "^5.5.0", "shimmer": "^1.2.0", "uuid": "^3.2.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } } } } @@ -422,6 +436,13 @@ "semver": "^5.3.0", "uglify-js": "^2.8.22", "when": "^3.7.8" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } } }, "acorn": { @@ -820,6 +841,13 @@ "requires": { "semver": "^5.3.0", "shimmer": "^1.1.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } } }, "async-settle": { @@ -5181,6 +5209,11 @@ "iconv-lite": "^0.4.4", "sax": "^1.2.4" } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -5211,6 +5244,11 @@ "requires": { "path-parse": "^1.0.6" } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -6672,6 +6710,13 @@ "requires": { "resolve-from": "^2.0.0", "semver": "^5.1.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } } }, "resolve": { @@ -6793,9 +6838,9 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "semver": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", - "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==" + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" }, "semver-greatest-satisfied-range": { "version": "1.1.0", diff --git a/package.json b/package.json index 8c086c5d..32952887 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jschan", "version": "0.0.1", - "migrateVersion": "0.0.9", + "migrateVersion": "0.0.10", "description": "", "main": "server.js", "dependencies": { @@ -38,6 +38,7 @@ "redlock": "^4.1.0", "sanitize-html": "^1.27.2", "saslprep": "^1.0.3", + "semver": "^7.3.2", "socket.io": "^2.3.0", "socket.io-redis": "^5.2.0", "socks-proxy-agent": "^5.0.0" diff --git a/views/pages/globalmanagelogs.pug b/views/pages/globalmanagelogs.pug index 01da1432..75a06f56 100644 --- a/views/pages/globalmanagelogs.pug +++ b/views/pages/globalmanagelogs.pug @@ -34,7 +34,7 @@ block content th User th IP th Actions - th Post IDs + th Posts th Log Message for log in logs tr @@ -57,7 +57,13 @@ block content | a(href=`?ip=${encodeURIComponent(logIp)}`) [+] td #{log.actions} - td #{log.postIds} + td + if log.showLinks + for postLink in log.postLinks + a(href=`/${board._id}/manage/thread/${postLink.thread || postLink.postId}.html#${postLink.postId}`) >>#{postLink.postId} + | + else + | #{log.postLinks.map(l => l.postId)} td #{log.message || '-'} .pages.mv-5 include ../includes/pages.pug diff --git a/views/pages/managelogs.pug b/views/pages/managelogs.pug index a85c0651..fc350942 100644 --- a/views/pages/managelogs.pug +++ b/views/pages/managelogs.pug @@ -29,7 +29,7 @@ block content th User th IP th Actions - th Post IDs + th Posts th Log Message for log in logs tr @@ -43,7 +43,13 @@ block content - const logIp = permLevel > ipHashPermLevel ? log.ip.single.slice(-10) : log.ip.raw; | #{logIp} td #{log.actions} - td #{log.postIds} + td + if log.showLinks + for postLink in log.postLinks + a(href=`/${board._id}/manage/thread/${postLink.thread || postLink.postId}.html#${postLink.postId}`) >>#{postLink.postId} + | + else + | #{log.postLinks.map(l => l.postId)} td #{log.message || '-'} .pages.mv-5 include ../includes/pages.pug diff --git a/views/pages/modlog.pug b/views/pages/modlog.pug index babbad1a..773db557 100644 --- a/views/pages/modlog.pug +++ b/views/pages/modlog.pug @@ -18,7 +18,7 @@ block content th Date th User th Actions - th Post IDs + th Posts th Log Message for log in logs tr @@ -26,7 +26,13 @@ block content td: time.reltime(datetime=logDate.toISOString()) #{logDate.toLocaleString(undefined, {hour12:false})} td(class=(!log.showUser ? 'em' : '')) #{log.showUser ? log.user : 'Hidden User'} td #{log.actions} - td #{log.postIds} + td + if log.showLinks + for postLink in log.postLinks + a(href=`/${board._id}/thread/${postLink.thread || postLink.postId}.html#${postLink.postId}`) >>#{postLink.postId} + | + else + | #{log.postLinks.map(l => l.postId)} td #{log.message || '-'} hr(size=1) .pages