ProjectManager.coffee 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. RedisManager = require "./RedisManager"
  2. DocumentManager = require "./DocumentManager"
  3. async = require "async"
  4. logger = require "logger-sharelatex"
  5. Metrics = require "./Metrics"
  6. module.exports = ProjectManager =
  7. flushProjectWithLocks: (project_id, _callback = (error) ->) ->
  8. timer = new Metrics.Timer("projectManager.flushProjectWithLocks")
  9. callback = (args...) ->
  10. timer.done()
  11. _callback(args...)
  12. RedisManager.getDocIdsInProject project_id, (error, doc_ids) ->
  13. return callback(error) if error?
  14. jobs = []
  15. errors = []
  16. for doc_id in (doc_ids or [])
  17. do (doc_id) ->
  18. jobs.push (callback) ->
  19. DocumentManager.flushDocIfLoadedWithLock project_id, doc_id, (error) ->
  20. if error?
  21. logger.error err: error, project_id: project_id, doc_id: doc_id, "error flushing doc"
  22. errors.push(error)
  23. callback()
  24. logger.log project_id: project_id, doc_ids: doc_ids, "flushing docs"
  25. async.series jobs, () ->
  26. if errors.length > 0
  27. callback new Error("Errors flushing docs. See log for details")
  28. else
  29. callback(null)
  30. flushAndDeleteProjectWithLocks: (project_id, _callback = (error) ->) ->
  31. timer = new Metrics.Timer("projectManager.flushAndDeleteProjectWithLocks")
  32. callback = (args...) ->
  33. timer.done()
  34. _callback(args...)
  35. RedisManager.getDocIdsInProject project_id, (error, doc_ids) ->
  36. return callback(error) if error?
  37. jobs = []
  38. errors = []
  39. for doc_id in (doc_ids or [])
  40. do (doc_id) ->
  41. jobs.push (callback) ->
  42. DocumentManager.flushAndDeleteDocWithLock project_id, doc_id, (error) ->
  43. if error?
  44. logger.error err: error, project_id: project_id, doc_id: doc_id, "error deleting doc"
  45. errors.push(error)
  46. callback()
  47. logger.log project_id: project_id, doc_ids: doc_ids, "deleting docs"
  48. async.series jobs, () ->
  49. if errors.length > 0
  50. callback new Error("Errors deleting docs. See log for details")
  51. else
  52. callback(null)
  53. setTrackChangesWithLocks: (project_id, track_changes_on, _callback = (error) ->) ->
  54. timer = new Metrics.Timer("projectManager.toggleTrackChangesWithLocks")
  55. callback = (args...) ->
  56. timer.done()
  57. _callback(args...)
  58. RedisManager.getDocIdsInProject project_id, (error, doc_ids) ->
  59. return callback(error) if error?
  60. jobs = []
  61. errors = []
  62. for doc_id in (doc_ids or [])
  63. do (doc_id) ->
  64. jobs.push (callback) ->
  65. DocumentManager.setTrackChangesWithLock project_id, doc_id, track_changes_on, (error) ->
  66. if error?
  67. logger.error {err: error, project_id, doc_ids, track_changes_on}, "error toggle track changes for doc"
  68. errors.push(error)
  69. callback()
  70. # TODO: If no docs, turn on track changes in Mongo manually
  71. logger.log {project_id, doc_ids, track_changes_on}, "toggling track changes for docs"
  72. async.series jobs, () ->
  73. if errors.length > 0
  74. callback new Error("Errors toggling track changes for docs. See log for details")
  75. else
  76. callback(null)