DocArchiveManager.coffee 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. MongoManager = require "./MongoManager"
  2. MongoAWS = require "./MongoAWS"
  3. LockManager = require "./LockManager"
  4. DocstoreHandler = require "./DocstoreHandler"
  5. logger = require "logger-sharelatex"
  6. _ = require "underscore"
  7. async = require "async"
  8. settings = require("settings-sharelatex")
  9. module.exports = DocArchiveManager =
  10. archiveAllDocsChanges: (project_id, callback = (error, docs) ->) ->
  11. DocstoreHandler.getAllDocs project_id, (error, docs) ->
  12. if error?
  13. return callback(error)
  14. else if !docs?
  15. return callback new Error("No docs for project #{project_id}")
  16. jobs = _.map docs, (doc) ->
  17. (cb)-> DocArchiveManager.archiveDocChangesWithLock project_id, doc._id, cb
  18. async.series jobs, callback
  19. archiveDocChangesWithLock: (project_id, doc_id, callback = (error) ->) ->
  20. job = (releaseLock) ->
  21. DocArchiveManager.archiveDocChanges project_id, doc_id, releaseLock
  22. LockManager.runWithLock("HistoryLock:#{doc_id}", job, callback)
  23. archiveDocChanges: (project_id, doc_id, callback)->
  24. MongoManager.getDocChangesCount doc_id, (error, count) ->
  25. return callback(error) if error?
  26. if count == 0
  27. logger.log {project_id, doc_id}, "document history is empty, not archiving"
  28. return callback()
  29. else if count == 1
  30. logger.log {project_id, doc_id}, "document history only has one entry, not archiving"
  31. return callback()
  32. else
  33. MongoManager.getArchivedDocChanges doc_id, (error, count) ->
  34. return callback(error) if error?
  35. if count != 0
  36. logger.log {project_id, doc_id}, "document history contains archived entries, not archiving"
  37. return callback()
  38. MongoManager.getLastCompressedUpdate doc_id, (error, update) ->
  39. return callback(error) if error?
  40. MongoManager.markDocHistoryAsArchiveInProgress doc_id, update, (error) ->
  41. return callback(error) if error?
  42. MongoAWS.archiveDocHistory project_id, doc_id, update, (error) ->
  43. if error?
  44. MongoManager.clearDocHistoryAsArchiveInProgress doc_id, update, (err) ->
  45. return callback(err) if err?
  46. callback(error)
  47. else
  48. logger.log doc_id:doc_id, project_id:project_id, "exported document to S3"
  49. MongoManager.markDocHistoryAsArchived doc_id, update, (error) ->
  50. return callback(error) if error?
  51. callback()
  52. unArchiveAllDocsChanges: (project_id, callback = (error, docs) ->) ->
  53. DocstoreHandler.getAllDocs project_id, (error, docs) ->
  54. if error?
  55. return callback(error)
  56. else if !docs?
  57. return callback new Error("No docs for project #{project_id}")
  58. jobs = _.map docs, (doc) ->
  59. (cb)-> DocArchiveManager.unArchiveDocChangesWithLock project_id, doc._id, cb
  60. async.parallelLimit jobs, 4, callback
  61. unArchiveDocChangesWithLock: (project_id, doc_id, callback = (error) ->) ->
  62. job = (releaseLock) ->
  63. DocArchiveManager.unArchiveDocChanges project_id, doc_id, releaseLock
  64. LockManager.runWithLock("HistoryLock:#{doc_id}", job, callback)
  65. unArchiveDocChanges: (project_id, doc_id, callback)->
  66. MongoManager.getArchivedDocChanges doc_id, (error, count) ->
  67. return callback(error) if error?
  68. if count == 0
  69. return callback()
  70. else
  71. MongoAWS.unArchiveDocHistory project_id, doc_id, (error) ->
  72. return callback(error) if error?
  73. logger.log doc_id:doc_id, project_id:project_id, "imported document from S3"
  74. MongoManager.markDocHistoryAsUnarchived doc_id, (error) ->
  75. return callback(error) if error?
  76. callback()