From 495dd9016d0159338b66ccfb70cd19df3309c4ed Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Fri, 4 Nov 2022 10:02:35 +0000 Subject: [PATCH] Merge pull request #10290 from overleaf/bg-clear-feedbacks-collection add script to clear old messages from mongo feedbacks collection GitOrigin-RevId: a4986f432a12e801f41ff9bdf11b8771ef2b601f --- .../web/app/src/infrastructure/mongodb.js | 1 + .../web/scripts/clear_feedback_collection.js | 41 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 services/web/scripts/clear_feedback_collection.js diff --git a/services/web/app/src/infrastructure/mongodb.js b/services/web/app/src/infrastructure/mongodb.js index ccfe50ed3e..124d109e39 100644 --- a/services/web/app/src/infrastructure/mongodb.js +++ b/services/web/app/src/infrastructure/mongodb.js @@ -45,6 +45,7 @@ async function setupDb() { db.docOps = internalDb.collection('docOps') db.docSnapshots = internalDb.collection('docSnapshots') db.docs = internalDb.collection('docs') + db.feedbacks = internalDb.collection('feedbacks') db.githubSyncEntityVersions = internalDb.collection( 'githubSyncEntityVersions' ) diff --git a/services/web/scripts/clear_feedback_collection.js b/services/web/scripts/clear_feedback_collection.js new file mode 100644 index 0000000000..6cba848e84 --- /dev/null +++ b/services/web/scripts/clear_feedback_collection.js @@ -0,0 +1,41 @@ +/* Clear feedback collection before a cutoff date + * + * Usage + * node scripts/clear_feedback_collection.js 2022-11-01 # dry run mode + * DRY_RUN=false node scripts/clear_feedback_collection.js 2022-11-01 # deletion mode + */ + +const { db, ObjectId, waitForDb } = require('../app/src/infrastructure/mongodb') + +const runScript = async (timestamp, dryRun) => { + await waitForDb() + const t = new Date(timestamp) + if (isNaN(t)) { + throw new Error('invalid date ' + timestamp) + } + const cutoffId = ObjectId.createFromTime(t / 1000) + console.log('deleting all feedback entries before', t, '=>', cutoffId) + const cursor = db.feedbacks.find({ _id: { $lt: cutoffId } }) + for await (const entry of cursor) { + console.log('deleting', entry._id) + if (dryRun) { + console.log('skipping in dry run mode') + continue + } + await db.feedbacks.deleteOne({ _id: entry._id }) + } +} + +if (!module.parent) { + // we are in the root module, which means that we're running as a script + const timestamp = process.env.CUTOFF_TIMESTAMP || process.argv[2] + const dryRun = process.env.DRY_RUN !== 'false' + runScript(timestamp, dryRun) + .then(() => process.exit()) + .catch(err => { + console.error(err) + process.exit(1) + }) +} + +module.exports = runScript