diff --git a/services/web/app/src/Features/Project/ProjectDeleter.js b/services/web/app/src/Features/Project/ProjectDeleter.js index bbf5553ae1..362f79fdf3 100644 --- a/services/web/app/src/Features/Project/ProjectDeleter.js +++ b/services/web/app/src/Features/Project/ProjectDeleter.js @@ -7,6 +7,7 @@ const { DeletedProject } = require('../../models/DeletedProject') const { ProjectAuditLogEntry } = require('../../models/ProjectAuditLogEntry') const Errors = require('../Errors/Errors') const logger = require('@overleaf/logger') +const Settings = require('@overleaf/settings') const DocumentUpdaterHandler = require('../DocumentUpdater/DocumentUpdaterHandler') const TagsHandler = require('../Tags/TagsHandler') const ProjectDetailsHandler = require('./ProjectDetailsHandler') @@ -17,11 +18,9 @@ const EditorRealTimeController = require('../Editor/EditorRealTimeController') const HistoryManager = require('../History/HistoryManager') const FilestoreHandler = require('../FileStore/FileStoreHandler') const ChatApiHandler = require('../Chat/ChatApiHandler') -const moment = require('moment') const { promiseMapWithLimit } = require('@overleaf/promise-utils') const { READ_PREFERENCE_SECONDARY } = require('../../infrastructure/mongodb') -const EXPIRE_PROJECTS_AFTER_DAYS = 90 const PROJECT_EXPIRATION_BATCH_SIZE = 10000 module.exports = { @@ -92,7 +91,7 @@ async function expireDeletedProjectsAfterDuration() { const deletedProjects = await DeletedProject.find( { 'deleterData.deletedAt': { - $lt: new Date(moment().subtract(EXPIRE_PROJECTS_AFTER_DAYS, 'days')), + $lt: new Date(Date.now() - Settings.projectHardDeletionDelay), }, project: { $type: 'object' }, }, @@ -106,7 +105,11 @@ async function expireDeletedProjectsAfterDuration() { ) ) logger.info( - { projectCount: projectIds.length }, + { + projectCount: projectIds.length, + retentionPeriodInDays: + Settings.projectHardDeletionDelay / (1000 * 60 * 60 * 24), + }, 'expiring batch of deleted projects' ) try { diff --git a/services/web/app/src/Features/User/UserDeleter.js b/services/web/app/src/Features/User/UserDeleter.js index c8d9891bf9..a1a9fcbe9d 100644 --- a/services/web/app/src/Features/User/UserDeleter.js +++ b/services/web/app/src/Features/User/UserDeleter.js @@ -1,6 +1,6 @@ const { callbackify } = require('util') const logger = require('@overleaf/logger') -const moment = require('moment') +const Settings = require('@overleaf/settings') const { User } = require('../../models/User') const { DeletedUser } = require('../../models/DeletedUser') const { UserAuditLogEntry } = require('../../models/UserAuditLogEntry') @@ -113,10 +113,9 @@ async function expireDeletedUser(userId) { } async function expireDeletedUsersAfterDuration() { - const DURATION = 90 const deletedUsers = await DeletedUser.find({ 'deleterData.deletedAt': { - $lt: new Date(moment().subtract(DURATION, 'days')), + $lt: new Date(Date.now() - Settings.userHardDeletionDelay), }, user: { $type: 'object' }, }).exec() @@ -125,7 +124,11 @@ async function expireDeletedUsersAfterDuration() { return } logger.info( - { deletedUsers: deletedUsers.length, retentionPeriodInDays: DURATION }, + { + deletedUsers: deletedUsers.length, + retentionPeriodInDays: + Settings.userHardDeletionDelay / (1000 * 60 * 60 * 24), + }, 'expiring batch of deleted users older than retention period' ) try { diff --git a/services/web/config/settings.defaults.js b/services/web/config/settings.defaults.js index 4df63ebd7c..3906ead8a0 100644 --- a/services/web/config/settings.defaults.js +++ b/services/web/config/settings.defaults.js @@ -709,6 +709,13 @@ module.exports = { primary_email_check_expiration: 1000 * 60 * 60 * 24 * 90, // 90 days + userHardDeletionDelay: + parseInt(process.env.OVERLEAF_USER_HARD_DELETION_DELAY, 10) || + 1000 * 60 * 60 * 24 * 90, // 90 days + projectHardDeletionDelay: + parseInt(process.env.OVERLEAF_PROJECT_HARD_DELETION_DELAY, 10) || + 1000 * 60 * 60 * 24 * 90, // 90 days + // Maximum JSON size in HTTP requests // We should be able to process twice the max doc length, to allow for // - the doc content