overleaf/services/web/scripts/merge_group_subscription_members.js

105 lines
2.7 KiB
JavaScript
Raw Normal View History

// 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(new ObjectId(target))
const sourceSubscription = await getSubscription(new 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)
})