|
|
@@ -0,0 +1,53 @@
|
|
|
+import {
|
|
|
+ db,
|
|
|
+ READ_PREFERENCE_SECONDARY,
|
|
|
+} from '../app/src/infrastructure/mongodb.js'
|
|
|
+import parseArgs from 'minimist'
|
|
|
+
|
|
|
+async function _removeFeatureFromAllUsers(feature, commit) {
|
|
|
+ let removals = 0
|
|
|
+ const query = {}
|
|
|
+ query[`features.${feature}`] = true
|
|
|
+ const usersWithFeature = db.users.find(query, {
|
|
|
+ readPreference: READ_PREFERENCE_SECONDARY,
|
|
|
+ })
|
|
|
+
|
|
|
+ const update = {}
|
|
|
+ update[`features.${feature}`] = false
|
|
|
+ while (await usersWithFeature.hasNext()) {
|
|
|
+ const user = await usersWithFeature.next()
|
|
|
+ if (commit) {
|
|
|
+ await db.users.findOneAndUpdate({ _id: user._id }, { $set: update })
|
|
|
+ }
|
|
|
+ removals++
|
|
|
+ }
|
|
|
+ console.log(`removed ${feature} from ${removals} users`)
|
|
|
+ if (!commit) {
|
|
|
+ console.log(
|
|
|
+ 'this was a dry run, pass --commit to remove features from users'
|
|
|
+ )
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+async function main() {
|
|
|
+ const argv = parseArgs(process.argv.slice(2), {
|
|
|
+ string: ['feature'],
|
|
|
+ boolean: ['commit'],
|
|
|
+ unknown: function (arg) {
|
|
|
+ console.error('unrecognised argument', arg)
|
|
|
+ process.exit(1)
|
|
|
+ },
|
|
|
+ })
|
|
|
+ const feature = argv.feature
|
|
|
+ const commit = argv.commit || false
|
|
|
+ await _removeFeatureFromAllUsers(feature, commit)
|
|
|
+}
|
|
|
+
|
|
|
+try {
|
|
|
+ await main()
|
|
|
+ console.log('Done')
|
|
|
+ process.exit(0)
|
|
|
+} catch (error) {
|
|
|
+ console.error(error)
|
|
|
+ process.exit(1)
|
|
|
+}
|