backfill_migration_soft_deletions.js 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. const { DeletedProject } = require('../app/src/models/DeletedProject')
  2. const { DeletedUser } = require('../app/src/models/DeletedUser')
  3. const { db } = require('../app/src/infrastructure/mongojs')
  4. const pLimit = require('p-limit')
  5. const CONCURRENCY = 10
  6. function getCollectionContents(collection) {
  7. return new Promise((resolve, reject) => {
  8. collection.find({}).toArray((error, contents) => {
  9. if (error) {
  10. reject(error)
  11. } else {
  12. resolve(contents)
  13. }
  14. })
  15. })
  16. }
  17. function deleteCollectionItem(collection, id) {
  18. return new Promise((resolve, reject) => {
  19. collection.remove({ _id: id }, error => {
  20. if (error) {
  21. reject(error)
  22. } else {
  23. resolve()
  24. }
  25. })
  26. })
  27. }
  28. async function backfillUser(user) {
  29. await DeletedUser.create({
  30. user: user,
  31. deleterData: {
  32. deletedAt: new Date(),
  33. deletedUserId: user._id,
  34. deletedUserLastLoggedIn: user.lastLoggedIn,
  35. deletedUserSignUpDate: user.signUpDate,
  36. deletedUserLoginCount: user.loginCount,
  37. deletedUserReferralId: user.referal_id,
  38. deletedUserReferredUsers: user.refered_users,
  39. deletedUserReferredUserCount: user.refered_user_count,
  40. deletedUserOverleafId: user.overleaf ? user.overleaf.id : undefined
  41. }
  42. })
  43. await deleteCollectionItem(db.usersDeletedByMigration, user._id)
  44. }
  45. async function backfillProject(project) {
  46. await DeletedProject.create({
  47. project: project,
  48. deleterData: {
  49. deletedAt: new Date(),
  50. deletedProjectId: project._id,
  51. deletedProjectOwnerId: project.owner_ref,
  52. deletedProjectCollaboratorIds: project.collaberator_refs,
  53. deletedProjectReadOnlyIds: project.readOnly_refs,
  54. deletedProjectReadWriteTokenAccessIds:
  55. project.tokenAccessReadAndWrite_refs,
  56. deletedProjectReadOnlyTokenAccessIds: project.tokenAccessReadOnly_refs,
  57. deletedProjectReadWriteToken: project.tokens
  58. ? project.tokens.readAndWrite
  59. : undefined,
  60. deletedProjectReadOnlyToken: project.tokens
  61. ? project.tokens.readOnly
  62. : undefined,
  63. deletedProjectLastUpdatedAt: project.lastUpdated
  64. }
  65. })
  66. await deleteCollectionItem(db.projectsDeletedByMigration, project._id)
  67. }
  68. async function backfillUsers() {
  69. const limit = pLimit(CONCURRENCY)
  70. const migrationUsers = await getCollectionContents(db.usersDeletedByMigration)
  71. console.log('Found ' + migrationUsers.length + ' users')
  72. await Promise.all(migrationUsers.map(user => limit(() => backfillUser(user))))
  73. }
  74. async function backfillProjects() {
  75. const limit = pLimit(CONCURRENCY)
  76. const migrationProjects = await getCollectionContents(
  77. db.projectsDeletedByMigration
  78. )
  79. console.log('Found ' + migrationProjects.length + ' projects')
  80. await Promise.all(
  81. migrationProjects.map(project => limit(() => backfillProject(project)))
  82. )
  83. }
  84. Promise.all([backfillProjects(), backfillUsers()]).then(() => {
  85. console.log('Finished')
  86. process.exit(0)
  87. })