Преглед изворни кода

Merge pull request #11781 from overleaf/tm-merge-group-subscription-members-script

Add script to merge group subscription members

GitOrigin-RevId: 4a3633320624e0c0514ed58cf792f2a921b0867a
Thomas пре 3 година
родитељ
комит
c52799798d
1 измењених фајлова са 104 додато и 0 уклоњено
  1. 104 0
      services/web/scripts/merge_group_subscription_members.js

+ 104 - 0
services/web/scripts/merge_group_subscription_members.js

@@ -0,0 +1,104 @@
+// dry run:
+// node scripts/merge_group_subscription_members \
+//  --target [targetSubscriptionId] --source [sourceSubscriptionId]
+//
+// commit changes:
+// node scripts/merge_group_subscription_members \
+//  --target [targetSubscriptionId] --source [sourceSubscriptionId] --commit
+
+const { db, ObjectId, waitForDb } = require('../app/src/infrastructure/mongodb')
+const SubscriptionUpdater = require('../app/src/Features/Subscription/SubscriptionUpdater')
+const minimist = require('minimist')
+const argv = minimist(process.argv.slice(2), {
+  string: ['target', 'source'],
+  boolean: ['commit'],
+})
+const { target, source, commit } = argv
+
+async function getSubscription(subscriptionId) {
+  const projection = {
+    member_ids: 1,
+    membersLimit: 1,
+    groupPlan: 1,
+    teamName: 1,
+  }
+  return await db.subscriptions.findOne(
+    {
+      _id: subscriptionId,
+    },
+    { projection }
+  )
+}
+
+async function main() {
+  if (!target) {
+    throw new Error('missing --target argument')
+  }
+  if (!source) {
+    throw new Error('missing --source argument')
+  }
+
+  if (!commit) {
+    console.log('Doing dry run without --commit')
+  }
+
+  await waitForDb()
+
+  const targetSubscription = await getSubscription(ObjectId(target))
+  const sourceSubscription = await getSubscription(ObjectId(source))
+
+  if (!targetSubscription) {
+    throw new Error('couldnt find target (to) subscription')
+  }
+  if (!sourceSubscription) {
+    throw new Error('couldnt find source (from) subscription')
+  }
+
+  console.log(
+    `\nTarget/destination subscription (${targetSubscription.member_ids.length} members) is:`,
+    targetSubscription
+  )
+  console.log(
+    `\nSource subscription (${sourceSubscription.member_ids.length} members) is:`,
+    sourceSubscription
+  )
+
+  if (!targetSubscription.groupPlan || !sourceSubscription.groupPlan) {
+    throw new Error('both subscriptions must be group subscriptions')
+  }
+
+  let addCount = 0
+  for (const member of sourceSubscription.member_ids) {
+    const exists = targetSubscription.member_ids.find(m => {
+      return m.toString() === member.toString()
+    })
+    if (!exists) {
+      console.log(`adding ${member} to target ${targetSubscription._id}`)
+      addCount += 1
+      if (commit) {
+        await SubscriptionUpdater.promises.addUserToGroup(
+          targetSubscription._id,
+          member
+        )
+      }
+    } else {
+      console.log(`skipping ${member}, already exists in target`)
+    }
+  }
+
+  console.log(`Added ${addCount} users to target subscription`)
+
+  if (!commit) {
+    console.log('Run again with --commit to make the above changes')
+  }
+}
+
+main()
+  .then(() => {
+    console.error('Done.')
+    process.exit(0)
+  })
+  .catch(error => {
+    console.error({ error })
+    process.exit(1)
+  })