remove_user_enrollment.mjs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // This script will:
  2. // 1. remove enrollment.managedBy and enrollment.enrolledAt fields from the User record
  3. // 2. remove the user_id from member_ids on the Subscription record
  4. //
  5. // Usage:
  6. // $ node scripts/remove_user_enrollment.mjs --id USER_ID --commit
  7. import minimist from 'minimist'
  8. import { ObjectId } from '../app/src/infrastructure/mongodb.js'
  9. import { User } from '../app/src/models/User.js'
  10. import { Subscription } from '../app/src/models/Subscription.js'
  11. import UserAuditLogHandler from '../app/src/Features/User/UserAuditLogHandler.js'
  12. const argv = minimist(process.argv.slice(2))
  13. const COMMIT = argv.commit !== undefined
  14. if (!COMMIT) {
  15. console.warn('Doing dry run without --commit')
  16. }
  17. const userId = argv.id
  18. if (!userId) throw new Error('missing user ID (use --id)')
  19. async function _handleUser(userId) {
  20. const user = await User.findById(userId, { enrollment: 1 })
  21. if (!user) {
  22. throw new Error(`user ${userId} does not exist`)
  23. }
  24. if (!user.enrollment?.managedBy) {
  25. throw new Error(`user ${userId} has no enrollment`)
  26. }
  27. const subscriptionId = user.enrollment.managedBy
  28. if (COMMIT) {
  29. await Subscription.updateOne(
  30. { _id: subscriptionId },
  31. { $pull: { member_ids: userId } }
  32. )
  33. } else {
  34. console.log(
  35. `Would remove user ${userId} from subscription ${subscriptionId}`
  36. )
  37. }
  38. if (COMMIT) {
  39. await User.updateOne(
  40. { _id: userId },
  41. {
  42. $unset: {
  43. 'enrollment.managedBy': 1,
  44. 'enrollment.enrolledAt': 1,
  45. },
  46. }
  47. )
  48. } else {
  49. console.log(`Would remove enrollment from user ${userId}`)
  50. }
  51. if (COMMIT) {
  52. await UserAuditLogHandler.promises.addEntry(
  53. userId,
  54. 'release-managed-user',
  55. undefined,
  56. undefined,
  57. { script: true, subscriptionId, comment: 'removed by support' }
  58. )
  59. } else {
  60. console.log(
  61. `Would create user audit log "release-managed-user" with comment "removed by support"`
  62. )
  63. }
  64. }
  65. async function processUser(userId) {
  66. console.log('---Starting remove enrollment script---')
  67. console.log(`Will process user: ${userId}`)
  68. if (!ObjectId.isValid(userId)) {
  69. throw new Error(`user ID not valid: ${userId}`)
  70. }
  71. try {
  72. await _handleUser(new ObjectId(userId))
  73. console.log(`User ${userId} processed successfully`)
  74. } catch (error) {
  75. console.log(`Failed to process user ${userId}:`, error)
  76. }
  77. process.exit()
  78. }
  79. await processUser(userId)