diff --git a/services/web/scripts/merge_group_subscription_members.js b/services/web/scripts/merge_group_subscription_members.js new file mode 100644 index 0000000000..4c640fc027 --- /dev/null +++ b/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) + })