Merge pull request #25743 from overleaf/bg-deactivate-projects-script

add deactivate projects script

GitOrigin-RevId: 5acf4b980d8980457930ee488571362da2a8014c
This commit is contained in:
Brian Gough
2025-05-20 09:47:19 +01:00
committed by Copybot
parent 1354465562
commit efd55ffe97
3 changed files with 261 additions and 35 deletions
@@ -11,6 +11,27 @@ const { callbackifyAll } = require('@overleaf/promise-utils')
const Metrics = require('@overleaf/metrics')
const MILISECONDS_IN_DAY = 86400000
function findInactiveProjects(limit, daysOld) {
const oldProjectDate = new Date() - MILISECONDS_IN_DAY * daysOld
try {
// use $not $gt to catch non-opened projects where lastOpened is null
// return a cursor instead of executing the query
return Project.find({
lastOpened: { $not: { $gt: oldProjectDate } },
})
.where('active')
.equals(true)
.select(['_id', 'lastOpened'])
.limit(limit)
.read(READ_PREFERENCE_SECONDARY)
.cursor()
} catch (err) {
logger.err({ err }, 'could not get projects for deactivating')
throw err // Re-throw the error to be handled by the caller
}
}
const InactiveProjectManager = {
async reactivateProjectIfRequired(projectId) {
let project
@@ -53,30 +74,13 @@ const InactiveProjectManager = {
if (daysOld == null) {
daysOld = 360
}
const oldProjectDate = new Date() - MILISECONDS_IN_DAY * daysOld
let projects
try {
// use $not $gt to catch non-opened projects where lastOpened is null
projects = await Project.find({
lastOpened: { $not: { $gt: oldProjectDate } },
})
.where('active')
.equals(true)
.select('_id')
.limit(limit)
.read(READ_PREFERENCE_SECONDARY)
.exec()
} catch (err) {
logger.err({ err }, 'could not get projects for deactivating')
}
logger.debug('deactivating projects')
logger.debug(
{ numberOfProjects: projects && projects.length },
'deactivating projects'
)
const processedProjects = []
for (const project of projects) {
for await (const project of findInactiveProjects(limit, daysOld)) {
processedProjects.push(project)
try {
await InactiveProjectManager.deactivateProject(project._id)
} catch (err) {
@@ -87,7 +91,12 @@ const InactiveProjectManager = {
}
}
return projects
logger.debug(
{ numberOfProjects: processedProjects.length },
'finished deactivating projects'
)
return processedProjects
},
async deactivateProject(projectId) {
@@ -126,4 +135,5 @@ const InactiveProjectManager = {
module.exports = {
...callbackifyAll(InactiveProjectManager),
promises: InactiveProjectManager,
findInactiveProjects,
}