InactiveProjectManager.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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('logger-sharelatex')
  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(projects, project => cb =>
  78. InactiveProjectManager.deactivateProject(project._id, function (err) {
  79. if (err) {
  80. logger.err(
  81. { project_id: project._id, err: err },
  82. 'unable to deactivate project'
  83. )
  84. }
  85. cb()
  86. })
  87. )
  88. logger.log(
  89. { numberOfProjects: projects && projects.length },
  90. 'deactivating projects'
  91. )
  92. async.series(jobs, function (err) {
  93. if (err != null) {
  94. logger.warn({ err }, 'error deactivating projects')
  95. }
  96. callback(err, projects)
  97. })
  98. })
  99. },
  100. deactivateProject(project_id, callback) {
  101. logger.log({ project_id }, 'deactivating inactive project')
  102. const jobs = [
  103. cb => DocstoreManager.archiveProject(project_id, cb),
  104. cb => ProjectUpdateHandler.markAsInactive(project_id, cb),
  105. ]
  106. return async.series(jobs, function (err) {
  107. if (err != null) {
  108. logger.warn({ err, project_id }, 'error deactivating project')
  109. }
  110. return callback(err)
  111. })
  112. },
  113. }