overleaf/services/web/scripts/delete-duplicate-splittest-versions/delete_test_dupes.mjs
Jakob Ackermann a7517eefcb Merge pull request #21427 from overleaf/jpa-populate-db-on-import
[web] populate db with collections on import, ahead of waitForDb() call

GitOrigin-RevId: 7eb4cd61c2052187acd9947d7060f54d9822d314
2024-11-01 09:05:15 +00:00

91 lines
2.3 KiB
JavaScript

import { db } from '../../app/src/infrastructure/mongodb.js'
import minimist from '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) {
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)