UserDeleter.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /* eslint-disable
  2. camelcase,
  3. handle-callback-err,
  4. max-len,
  5. no-unused-vars,
  6. standard/no-callback-literal,
  7. */
  8. // TODO: This file was created by bulk-decaffeinate.
  9. // Fix any style issues and re-enable lint.
  10. /*
  11. * decaffeinate suggestions:
  12. * DS102: Remove unnecessary code created because of implicit returns
  13. * DS207: Consider shorter variations of null checks
  14. * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  15. */
  16. let UserDeleter
  17. const { User } = require('../../models/User')
  18. const NewsletterManager = require('../Newsletter/NewsletterManager')
  19. const ProjectDeleter = require('../Project/ProjectDeleter')
  20. const logger = require('logger-sharelatex')
  21. const SubscriptionHandler = require('../Subscription/SubscriptionHandler')
  22. const SubscriptionUpdater = require('../Subscription/SubscriptionUpdater')
  23. const SubscriptionLocator = require('../Subscription/SubscriptionLocator')
  24. const UserMembershipsHandler = require('../UserMembership/UserMembershipsHandler')
  25. const async = require('async')
  26. const InstitutionsAPI = require('../Institutions/InstitutionsAPI')
  27. const Errors = require('../Errors/Errors')
  28. const { db, ObjectId } = require('../../infrastructure/mongojs')
  29. module.exports = UserDeleter = {
  30. softDeleteUserForMigration(user_id, callback) {
  31. if (callback == null) {
  32. callback = function(err) {}
  33. }
  34. if (user_id == null) {
  35. logger.warn('user_id is null when trying to delete user')
  36. return callback(new Error('no user_id'))
  37. }
  38. return User.findById(user_id, function(err, user) {
  39. if (err != null) {
  40. return callback(err)
  41. }
  42. if (user == null) {
  43. return callback(new Errors.NotFoundError('user not found'))
  44. }
  45. return async.series(
  46. [
  47. cb => UserDeleter._ensureCanDeleteUser(user, cb),
  48. cb => UserDeleter._cleanupUser(user, cb),
  49. cb => ProjectDeleter.deleteUsersProjects(user._id, cb),
  50. function(cb) {
  51. user.deletedAt = new Date()
  52. return db.usersDeletedByMigration.insert(user, cb)
  53. },
  54. cb => user.remove(cb)
  55. ],
  56. callback
  57. )
  58. })
  59. },
  60. deleteUser(user_id, callback) {
  61. if (callback == null) {
  62. callback = function() {}
  63. }
  64. if (user_id == null) {
  65. logger.warn('user_id is null when trying to delete user')
  66. return callback(new Error('no user_id'))
  67. }
  68. return User.findById(user_id, function(err, user) {
  69. if (err != null) {
  70. return callback(err)
  71. }
  72. logger.log({ user }, 'deleting user')
  73. return async.series(
  74. [
  75. cb => UserDeleter._ensureCanDeleteUser(user, cb),
  76. cb => UserDeleter._cleanupUser(user, cb),
  77. cb => ProjectDeleter.deleteUsersProjects(user._id, cb),
  78. cb => user.remove(cb)
  79. ],
  80. function(err) {
  81. if (err != null) {
  82. logger.warn(
  83. { err, user_id },
  84. 'something went wrong deleteing the user'
  85. )
  86. }
  87. return callback(err)
  88. }
  89. )
  90. })
  91. },
  92. _cleanupUser(user, callback) {
  93. if (user == null) {
  94. return callback(new Error('no user supplied'))
  95. }
  96. return async.series(
  97. [
  98. cb =>
  99. NewsletterManager.unsubscribe(user, function(err) {
  100. logger.err('Failed to unsubscribe user from newsletter', {
  101. user_id: user._id,
  102. error: err
  103. })
  104. return cb()
  105. }),
  106. cb => SubscriptionHandler.cancelSubscription(user, cb),
  107. cb => InstitutionsAPI.deleteAffiliations(user._id, cb),
  108. cb => SubscriptionUpdater.removeUserFromAllGroups(user._id, cb),
  109. cb => UserMembershipsHandler.removeUserFromAllEntities(user._id, cb)
  110. ],
  111. callback
  112. )
  113. },
  114. _ensureCanDeleteUser(user, callback) {
  115. return SubscriptionLocator.getUsersSubscription(user, function(
  116. error,
  117. subscription
  118. ) {
  119. if (subscription != null) {
  120. if (!error) {
  121. error = new Errors.SubscriptionAdminDeletionError()
  122. }
  123. }
  124. return callback(error)
  125. })
  126. }
  127. }