diff --git a/services/web/scripts/history/downgrade_project.js b/services/web/scripts/history/downgrade_project.js new file mode 100644 index 0000000000..78ac906273 --- /dev/null +++ b/services/web/scripts/history/downgrade_project.js @@ -0,0 +1,79 @@ +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 { ReadPreference, ObjectId } = require('mongodb') +const { db, waitForDb } = 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} converted and upgraded to full project history` + ) + } +} + +async function shouldPreserveHistory(project) { + return await db.projectHistoryMetaData.findOne( + { + $and: [ + { project_id: { $eq: project._id } }, + { preserveHistory: { $eq: true } }, + ], + }, + { readPreference: ReadPreference.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 upgrades to complete') + INTERRUPT = true +}) + +main() + .then(() => { + console.error('Done.') + process.exit(0) + }) + .catch(error => { + console.error({ error }) + process.exit(1) + })