HttpController.coffee 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. UpdatesManager = require "./UpdatesManager"
  2. DiffManager = require "./DiffManager"
  3. PackManager = require "./PackManager"
  4. RestoreManager = require "./RestoreManager"
  5. logger = require "logger-sharelatex"
  6. HealthChecker = require "./HealthChecker"
  7. _ = require "underscore"
  8. module.exports = HttpController =
  9. flushDoc: (req, res, next = (error) ->) ->
  10. doc_id = req.params.doc_id
  11. project_id = req.params.project_id
  12. logger.log project_id: project_id, doc_id: doc_id, "compressing doc history"
  13. UpdatesManager.processUncompressedUpdatesWithLock project_id, doc_id, (error) ->
  14. return next(error) if error?
  15. res.send 204
  16. flushProject: (req, res, next = (error) ->) ->
  17. project_id = req.params.project_id
  18. logger.log project_id: project_id, "compressing project history"
  19. UpdatesManager.processUncompressedUpdatesForProject project_id, (error) ->
  20. return next(error) if error?
  21. res.send 204
  22. flushAll: (req, res, next = (error) ->) ->
  23. # limit on projects to flush or -1 for all (default)
  24. limit = if req.query.limit? then parseInt(req.query.limit, 10) else -1
  25. logger.log {limit: limit}, "flushing all projects"
  26. UpdatesManager.flushAll limit, (error, result) ->
  27. return next(error) if error?
  28. {failed, succeeded, all} = result
  29. status = "#{succeeded.length} succeeded, #{failed.length} failed"
  30. if limit == 0
  31. res.status(200).send "#{status}\nwould flush:\n#{all.join('\n')}\n"
  32. else if failed.length > 0
  33. logger.log {failed: failed, succeeded: succeeded}, "error flushing projects"
  34. res.status(500).send "#{status}\nfailed to flush:\n#{failed.join('\n')}\n"
  35. else
  36. res.status(200).send "#{status}\nflushed #{succeeded.length} projects of #{all.length}\n"
  37. checkDanglingUpdates: (req, res, next = (error) ->) ->
  38. logger.log "checking dangling updates"
  39. UpdatesManager.getDanglingUpdates (error, result) ->
  40. return next(error) if error?
  41. if result.length > 0
  42. logger.log {dangling: result}, "found dangling updates"
  43. res.status(500).send "dangling updates:\n#{result.join('\n')}\n"
  44. else
  45. res.status(200).send "no dangling updates found\n"
  46. checkDoc: (req, res, next = (error) ->) ->
  47. doc_id = req.params.doc_id
  48. project_id = req.params.project_id
  49. logger.log project_id: project_id, doc_id: doc_id, "checking doc history"
  50. DiffManager.getDocumentBeforeVersion project_id, doc_id, 1, (error, document, rewoundUpdates) ->
  51. return next(error) if error?
  52. broken = []
  53. for update in rewoundUpdates
  54. for op in update.op when op.broken is true
  55. broken.push op
  56. if broken.length > 0
  57. res.send broken
  58. else
  59. res.send 204
  60. getDiff: (req, res, next = (error) ->) ->
  61. doc_id = req.params.doc_id
  62. project_id = req.params.project_id
  63. if req.query.from?
  64. from = parseInt(req.query.from, 10)
  65. else
  66. from = null
  67. if req.query.to?
  68. to = parseInt(req.query.to, 10)
  69. else
  70. to = null
  71. logger.log {project_id, doc_id, from, to}, "getting diff"
  72. DiffManager.getDiff project_id, doc_id, from, to, (error, diff) ->
  73. return next(error) if error?
  74. res.json {diff: diff}
  75. getUpdates: (req, res, next = (error) ->) ->
  76. project_id = req.params.project_id
  77. if req.query.before?
  78. before = parseInt(req.query.before, 10)
  79. if req.query.min_count?
  80. min_count = parseInt(req.query.min_count, 10)
  81. UpdatesManager.getSummarizedProjectUpdates project_id, before: before, min_count: min_count, (error, updates, nextBeforeTimestamp) ->
  82. return next(error) if error?
  83. res.json {
  84. updates: updates
  85. nextBeforeTimestamp: nextBeforeTimestamp
  86. }
  87. restore: (req, res, next = (error) ->) ->
  88. {doc_id, project_id, version} = req.params
  89. user_id = req.headers["x-user-id"]
  90. version = parseInt(version, 10)
  91. RestoreManager.restoreToBeforeVersion project_id, doc_id, version, user_id, (error) ->
  92. return next(error) if error?
  93. res.send 204
  94. pushDocHistory: (req, res, next = (error) ->) ->
  95. project_id = req.params.project_id
  96. doc_id = req.params.doc_id
  97. logger.log {project_id, doc_id}, "pushing all finalised changes to s3"
  98. PackManager.pushOldPacks project_id, doc_id, (error) ->
  99. return next(error) if error?
  100. res.send 204
  101. pullDocHistory: (req, res, next = (error) ->) ->
  102. project_id = req.params.project_id
  103. doc_id = req.params.doc_id
  104. logger.log {project_id, doc_id}, "pulling all packs from s3"
  105. PackManager.pullOldPacks project_id, doc_id, (error) ->
  106. return next(error) if error?
  107. res.send 204
  108. healthCheck: (req, res)->
  109. HealthChecker.check (err)->
  110. if err?
  111. logger.err err:err, "error performing health check"
  112. res.send 500
  113. else
  114. res.send 200
  115. checkLock: (req, res)->
  116. HealthChecker.checkLock (err) ->
  117. if err?
  118. logger.err err:err, "error performing lock check"
  119. res.send 500
  120. else
  121. res.send 200