diff --git a/services/web/scripts/remove_duplicate_v1_ids.js b/services/web/scripts/remove_duplicate_v1_ids.js new file mode 100644 index 0000000000..f45c741a0d --- /dev/null +++ b/services/web/scripts/remove_duplicate_v1_ids.js @@ -0,0 +1,59 @@ +const { db } = require('../app/js/infrastructure/mongojs') +const async = require('async') +const minimist = require('minimist') + +const argv = minimist(process.argv.slice(2)) +const commit = argv.commit !== undefined + +if (!commit) { + console.log('DOING DRY RUN. TO SAVE CHANGES PASS --commit') +} + +db.users.aggregate( + [ + { $match: { 'overleaf.id': { $exists: true } } }, + { $group: { _id: '$overleaf.id', count: { $sum: 1 } } }, + { $match: { count: { $gt: 1 } } } + ], + { allowDiskUse: true }, + function(err, results) { + if (err) throw err + console.log('FOUND ' + results.length + ' DUPLICATES') + async.mapSeries(results, removeDuplicates, function(err) { + if (err) throw err + console.log('DONE') + process.exit() + }) + } +) + +function removeDuplicates(duplicate, callback) { + db.users.findOne({ 'overleaf.id': duplicate._id }, function(err, keepUser) { + if (err) throw err + console.log('KEEPING USER ' + keepUser._id + ' FOR OL ' + duplicate._id) + db.users.find( + { 'overleaf.id': duplicate._id, _id: { $ne: keepUser._id } }, + function(err, duplicateUsers) { + if (err) throw err + async.mapSeries( + duplicateUsers, + function(user, cb) { + console.log( + 'UNLINKING USER ' + user._id + ' FOR OL ' + duplicate._id + ) + if (!commit) return cb() + db.users.update( + { _id: user._id }, + { $unset: { 'overleaf.id': '' } }, + cb + ) + }, + function(err) { + if (err) throw err + callback() + } + ) + } + ) + }) +}