|
|
@@ -0,0 +1,92 @@
|
|
|
+const { db, waitForDb } = require('../../app/src/infrastructure/mongodb')
|
|
|
+const minimist = require('minimist')
|
|
|
+
|
|
|
+const argv = minimist(process.argv.slice(2))
|
|
|
+const commit = argv.commit !== undefined
|
|
|
+
|
|
|
+if (!commit) {
|
|
|
+ console.log('DOING DRY RUN. TO SAVE CHANGES PASS --commit')
|
|
|
+}
|
|
|
+
|
|
|
+async function getDupes(commit) {
|
|
|
+ await waitForDb()
|
|
|
+ const entries = await db.splittests.aggregate([
|
|
|
+ {
|
|
|
+ $match: {
|
|
|
+ archived: { $eq: true },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ { $unwind: '$versions' },
|
|
|
+ {
|
|
|
+ $group: {
|
|
|
+ // Group by fields to match on (a,b)
|
|
|
+ _id: {
|
|
|
+ _id: '$_id',
|
|
|
+ name: '$name',
|
|
|
+ creationDate: '$version.creationDate',
|
|
|
+ },
|
|
|
+
|
|
|
+ // Count number of matching docs for the group
|
|
|
+ count: { $sum: 1 },
|
|
|
+
|
|
|
+ // Save the _id for matching docs
|
|
|
+ docs: { $push: '$_id' },
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Limit results to duplicates (more than 1 match)
|
|
|
+ {
|
|
|
+ $match: {
|
|
|
+ count: { $gt: 1 },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ])
|
|
|
+
|
|
|
+ let entry
|
|
|
+ const removed = []
|
|
|
+ while ((entry = await entries.next())) {
|
|
|
+ const name = entry._id.name
|
|
|
+ const test = await db.splittests.findOne({ name })
|
|
|
+
|
|
|
+ if (hasArchiveDupe(test.versions)) {
|
|
|
+ removed.push(test.name)
|
|
|
+ removeLastVersion(test, commit)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ const message = commit
|
|
|
+ ? `removed dupes from ${removed.length} feature flags`
|
|
|
+ : `planning to remove dupes from ${removed.length} feature flags`
|
|
|
+ console.info(message, removed)
|
|
|
+
|
|
|
+ console.log('DONE')
|
|
|
+ process.exit()
|
|
|
+}
|
|
|
+
|
|
|
+function hasArchiveDupe(versions) {
|
|
|
+ const last = versions.length - 1
|
|
|
+ // guard in case we somehow get smthn with only one version here flagged as having a dupe
|
|
|
+ if (last < 2) return false
|
|
|
+ // need to string compare dates, as otherwise will compare the isoDate objects (diff objs so not equal)
|
|
|
+ return (
|
|
|
+ versions[last].createdAt.toString() ===
|
|
|
+ versions[last - 1].createdAt.toString()
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+function removeLastVersion(test, commit) {
|
|
|
+ const name = test.name
|
|
|
+ const numVersions = test.versions.length
|
|
|
+
|
|
|
+ if (name && numVersions > 1) {
|
|
|
+ const lastVersion = test.versions[numVersions - 1].versionNumber
|
|
|
+ console.log(`removing test ${test.name} version ${lastVersion}`)
|
|
|
+ if (commit) {
|
|
|
+ db.splittests.updateOne(
|
|
|
+ { name },
|
|
|
+ { $pull: { versions: { versionNumber: lastVersion } } }
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+getDupes(commit)
|