overleaf/services/web/scripts/history/downgrade_project.js
Eric Mc Sween cff54eae78 Merge pull request #12575 from overleaf/em-fix-chunk-replace-transaction
Fix history chunk replacement transaction

GitOrigin-RevId: fc0fa8f4a55ae5f402ba87db5e4ac2856fe6627b
2023-04-19 08:03:10 +00:00

81 lines
2 KiB
JavaScript

const VERBOSE_LOGGING = process.env.VERBOSE_LOGGING === 'true'
const DRY_RUN = process.env.DRY_RUN !== 'false'
process.env.MONGO_SOCKET_TIMEOUT =
parseInt(process.env.MONGO_SOCKET_TIMEOUT, 10) || 3600000
const PROJECT_ID = process.env.PROJECT_ID
const { ObjectId } = require('mongodb')
const {
db,
waitForDb,
READ_PREFERENCE_SECONDARY,
} = require('../../app/src/infrastructure/mongodb')
const ProjectHistoryHandler = require('../../app/src/Features/Project/ProjectHistoryHandler')
console.log({
DRY_RUN,
VERBOSE_LOGGING,
PROJECT_ID,
})
let INTERRUPT = false
async function processProject(project) {
if (INTERRUPT) {
return
}
if (!shouldPreserveHistory(project)) {
console.log(
`project ${project._id} does not have preserveHistory:true, skipping`
)
return
}
if (!DRY_RUN) {
await ProjectHistoryHandler.promises.downgradeHistory(project._id)
}
if (VERBOSE_LOGGING) {
console.log(`project ${project._id} downgraded to track-changes`)
}
}
async function shouldPreserveHistory(project) {
return await db.projectHistoryMetaData.findOne(
{
$and: [
{ project_id: { $eq: project._id } },
{ preserveHistory: { $eq: true } },
],
},
{ readPreference: READ_PREFERENCE_SECONDARY }
)
}
async function main() {
if (PROJECT_ID) {
await waitForDb()
const project = await db.projects.findOne({ _id: ObjectId(PROJECT_ID) })
await processProject(project)
} else {
console.log('PROJECT_ID environment value is needed.')
process.exit(1)
}
}
// Upgrading history is not atomic, if we quit out mid-initialisation
// then history could get into a broken state
// Instead, skip any unprocessed projects and exit() at end of the batch.
process.on('SIGINT', function () {
console.log('Caught SIGINT, waiting for in process downgrades to complete')
INTERRUPT = true
})
main()
.then(() => {
console.error('Done.')
process.exit(0)
})
.catch(error => {
console.error({ error })
process.exit(1)
})