remove_duplicate_uids.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. const { db } = require('../../app/js/infrastructure/mongojs')
  2. const DropboxHandler = require('../../modules/dropbox/app/js/DropboxHandler')
  3. const EmailHandler = require('../../app/js/Features/Email/EmailHandler')
  4. const async = require('async')
  5. const minimist = require('minimist')
  6. const argv = minimist(process.argv.slice(2))
  7. const commit = argv.commit !== undefined
  8. if (!commit) {
  9. console.log('DOING DRY RUN. TO SAVE CHANGES PASS --commit')
  10. }
  11. db.users.aggregate(
  12. [
  13. {
  14. $group: {
  15. // group by Dropbox access token uid and count distinct users
  16. _id: '$dropbox.access_token.uid',
  17. count: { $sum: 1 },
  18. _ids: { $addToSet: '$_id' }
  19. }
  20. },
  21. {
  22. $match: {
  23. // select only uids userd more than once
  24. _id: { $ne: null },
  25. count: { $gt: 1 }
  26. }
  27. },
  28. {
  29. $project: {
  30. // filter output
  31. _id: false,
  32. dropbox_uid: '$_id',
  33. _ids: '$_ids'
  34. }
  35. }
  36. ],
  37. { allowDiskUse: true },
  38. function(error, results) {
  39. if (error) throw error
  40. console.log('FOUND ' + results.length + ' DUPLICATES')
  41. async.mapSeries(results, removeDuplicates, function(error) {
  42. if (error) throw error
  43. console.log('DONE')
  44. process.exit()
  45. })
  46. }
  47. )
  48. function removeDuplicates(duplicate, callback) {
  49. async.mapSeries(duplicate._ids, unlinkUser, function(error) {
  50. callback(error)
  51. })
  52. }
  53. function unlinkUser(_id, callback) {
  54. db.users.findOne({ _id: _id }, function(error, user) {
  55. if (error) return callback(error)
  56. console.log('UNLINKING USER ' + _id + ' (' + user.email + ')')
  57. if (!commit) return callback()
  58. DropboxHandler.unlinkAccount(_id, function(error) {
  59. if (error) return callback(error)
  60. EmailHandler.sendEmail(
  61. 'dropboxUnlinkedDuplicate',
  62. { to: user.email },
  63. callback
  64. )
  65. })
  66. })
  67. }