regenerate_duplicate_referral_ids.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. const WRITE_CONCURRENCY = parseInt(process.env.WRITE_CONCURRENCY, 10) || 10
  2. const logger = require('logger-sharelatex')
  3. const { db, waitForDb } = require('../app/src/infrastructure/mongodb')
  4. const { promiseMapWithLimit } = require('../app/src/util/promises')
  5. const TokenGenerator = require('../app/src/Features/TokenGenerator/TokenGenerator')
  6. const UserUpdater = require('../app/src/Features/User/UserUpdater')
  7. async function main() {
  8. logger.info({}, 'Regenerating duplicate referral IDs')
  9. await waitForDb()
  10. const duplicates = await db.users
  11. .aggregate(
  12. [
  13. { $match: { referal_id: { $exists: true } } },
  14. { $group: { _id: '$referal_id', count: { $sum: 1 } } },
  15. { $match: { count: { $gt: 1 } } }
  16. ],
  17. { allowDiskUse: true, readPreference: 'secondary' }
  18. )
  19. .maxTimeMS(600000)
  20. const duplicateReferralIds = []
  21. let duplicate
  22. while ((duplicate = await duplicates.next())) {
  23. duplicateReferralIds.push(duplicate._id)
  24. }
  25. logger.info(
  26. {},
  27. `Found ${duplicateReferralIds.length} duplicate referral ID to regenerate`
  28. )
  29. await promiseMapWithLimit(
  30. WRITE_CONCURRENCY,
  31. duplicateReferralIds,
  32. async referralId => {
  33. const users = await db.users
  34. .find({
  35. referal_id: referralId
  36. })
  37. .toArray()
  38. try {
  39. for (const user of users) {
  40. const newReferralId = TokenGenerator.generateReferralId()
  41. await UserUpdater.promises.updateUser(user._id, {
  42. $set: {
  43. referal_id: newReferralId
  44. }
  45. })
  46. }
  47. } catch (error) {
  48. console.error(
  49. { err: error },
  50. `Failed to generate new referral ID for duplicate ID: ${referralId}`
  51. )
  52. }
  53. }
  54. )
  55. }
  56. main()
  57. .then(() => {
  58. process.exit(0)
  59. })
  60. .catch(error => {
  61. console.error({ error })
  62. process.exit(1)
  63. })