InactiveProjectManager.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /* eslint-disable
  2. camelcase,
  3. max-len,
  4. */
  5. // TODO: This file was created by bulk-decaffeinate.
  6. // Fix any style issues and re-enable lint.
  7. /*
  8. * decaffeinate suggestions:
  9. * DS102: Remove unnecessary code created because of implicit returns
  10. * DS207: Consider shorter variations of null checks
  11. * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  12. */
  13. let InactiveProjectManager
  14. const OError = require('@overleaf/o-error')
  15. const async = require('async')
  16. const _ = require('underscore')
  17. const logger = require('@overleaf/logger')
  18. const DocstoreManager = require('../Docstore/DocstoreManager')
  19. const ProjectGetter = require('../Project/ProjectGetter')
  20. const ProjectUpdateHandler = require('../Project/ProjectUpdateHandler')
  21. const { Project } = require('../../models/Project')
  22. const { ObjectId } = require('mongodb')
  23. const MILISECONDS_IN_DAY = 86400000
  24. module.exports = InactiveProjectManager = {
  25. reactivateProjectIfRequired(project_id, callback) {
  26. return ProjectGetter.getProject(
  27. project_id,
  28. { active: true },
  29. function (err, project) {
  30. if (err != null) {
  31. OError.tag(err, 'error getting project', {
  32. project_id,
  33. })
  34. return callback(err)
  35. }
  36. logger.log(
  37. { project_id, active: project.active },
  38. 'seeing if need to reactivate project'
  39. )
  40. if (project.active) {
  41. return callback()
  42. }
  43. return DocstoreManager.unarchiveProject(project_id, function (err) {
  44. if (err != null) {
  45. OError.tag(err, 'error reactivating project in docstore', {
  46. project_id,
  47. })
  48. return callback(err)
  49. }
  50. return ProjectUpdateHandler.markAsActive(project_id, callback)
  51. })
  52. }
  53. )
  54. },
  55. deactivateOldProjects(limit, daysOld, callback) {
  56. if (limit == null) {
  57. limit = 10
  58. }
  59. if (daysOld == null) {
  60. daysOld = 360
  61. }
  62. const oldProjectDate = new Date() - MILISECONDS_IN_DAY * daysOld
  63. // use $not $gt to catch non-opened projects where lastOpened is null
  64. Project.find({ lastOpened: { $not: { $gt: oldProjectDate } } })
  65. .where('_id')
  66. .lt(ObjectId.createFromTime(oldProjectDate / 1000))
  67. .where('active')
  68. .equals(true)
  69. .select('_id')
  70. .sort({ _id: 1 })
  71. .limit(limit)
  72. .read('secondary')
  73. .exec(function (err, projects) {
  74. if (err != null) {
  75. logger.err({ err }, 'could not get projects for deactivating')
  76. }
  77. const jobs = _.map(
  78. projects,
  79. project => cb =>
  80. InactiveProjectManager.deactivateProject(
  81. project._id,
  82. function (err) {
  83. if (err) {
  84. logger.err(
  85. { project_id: project._id, err: err },
  86. 'unable to deactivate project'
  87. )
  88. }
  89. cb()
  90. }
  91. )
  92. )
  93. logger.log(
  94. { numberOfProjects: projects && projects.length },
  95. 'deactivating projects'
  96. )
  97. async.series(jobs, function (err) {
  98. if (err != null) {
  99. logger.warn({ err }, 'error deactivating projects')
  100. }
  101. callback(err, projects)
  102. })
  103. })
  104. },
  105. deactivateProject(project_id, callback) {
  106. logger.log({ project_id }, 'deactivating inactive project')
  107. const jobs = [
  108. cb => DocstoreManager.archiveProject(project_id, cb),
  109. cb => ProjectUpdateHandler.markAsInactive(project_id, cb),
  110. ]
  111. return async.series(jobs, function (err) {
  112. if (err != null) {
  113. logger.warn({ err, project_id }, 'error deactivating project')
  114. }
  115. return callback(err)
  116. })
  117. },
  118. }