diff --git a/services/web/app/src/Features/InactiveData/InactiveProjectManager.js b/services/web/app/src/Features/InactiveData/InactiveProjectManager.js index cdbcfd888b..818fe70c08 100644 --- a/services/web/app/src/Features/InactiveData/InactiveProjectManager.js +++ b/services/web/app/src/Features/InactiveData/InactiveProjectManager.js @@ -5,7 +5,6 @@ const DocumentUpdaterHandler = require('../DocumentUpdater/DocumentUpdaterHandle const ProjectGetter = require('../Project/ProjectGetter') const ProjectUpdateHandler = require('../Project/ProjectUpdateHandler') const { Project } = require('../../models/Project') -const { ObjectId } = require('mongodb-legacy') const Modules = require('../../infrastructure/Modules') const { READ_PREFERENCE_SECONDARY } = require('../../infrastructure/mongodb') const { callbackifyAll } = require('@overleaf/promise-utils') @@ -62,8 +61,6 @@ const InactiveProjectManager = { projects = await Project.find({ lastOpened: { $not: { $gt: oldProjectDate } }, }) - .where('_id') - .lt(ObjectId.createFromTime(oldProjectDate / 1000)) .where('active') .equals(true) .select('_id') diff --git a/services/web/migrations/20250320161029_update_inactive_project_index.mjs b/services/web/migrations/20250320161029_update_inactive_project_index.mjs new file mode 100644 index 0000000000..a505f9075d --- /dev/null +++ b/services/web/migrations/20250320161029_update_inactive_project_index.mjs @@ -0,0 +1,64 @@ +/* eslint-disable no-unused-vars */ + +import Helpers from './lib/helpers.mjs' + +const tags = ['server-ce', 'server-pro', 'saas'] + +const oldIndex = { + key: { + lastOpened: 1, + }, + name: 'lastOpened_1', +} + +const newIndex = { + key: { + lastOpened: 1, + }, + name: 'active_true_lastOpened_1', + partialFilterExpression: { active: true }, +} + +const tmpIndex = { + key: { lastOpened: 1, dummyField: 1 }, + name: 'lastOpened_tmp', +} + +const migrate = async client => { + const { db } = client + + // Create a temporary index so that projects are not left unindexed while we + // drop the index and recreate it. + await Helpers.addIndexesToCollection(db.projects, [tmpIndex]) + + // Drop and recreate the index with different options + await Helpers.dropIndexesFromCollection(db.projects, [oldIndex]) + await Helpers.addIndexesToCollection(db.projects, [newIndex]) + + // Drop the temporary index + await Helpers.dropIndexesFromCollection(db.projects, [tmpIndex]) +} + +const rollback = async client => { + const { db } = client + + try { + // Create a temporary index so that projects are not left unindexed while we + // drop the index and recreate it. + await Helpers.addIndexesToCollection(db.projects, [tmpIndex]) + + // Drop and recreate the index with different options + await Helpers.dropIndexesFromCollection(db.projects, [newIndex]) + await Helpers.addIndexesToCollection(db.projects, [oldIndex]) + + // Drop the temporary index + await Helpers.dropIndexesFromCollection(db.projects, [tmpIndex]) + } catch (err) { + console.error('Something went wrong rolling back the migrations', err) + } +} +export default { + tags, + migrate, + rollback, +}