|
|
@@ -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)
|
|
|
+ })
|