HttpController.coffee 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. DocumentManager = require "./DocumentManager"
  2. ProjectManager = require "./ProjectManager"
  3. Errors = require "./Errors"
  4. logger = require "logger-sharelatex"
  5. Metrics = require "./Metrics"
  6. TWO_MEGABYTES = 2 * 1024 * 1024
  7. module.exports = HttpController =
  8. getDoc: (req, res, next = (error) ->) ->
  9. doc_id = req.params.doc_id
  10. project_id = req.params.project_id
  11. logger.log project_id: project_id, doc_id: doc_id, "getting doc via http"
  12. timer = new Metrics.Timer("http.getDoc")
  13. if req.query?.fromVersion?
  14. fromVersion = parseInt(req.query.fromVersion, 10)
  15. else
  16. fromVersion = -1
  17. DocumentManager.getDocAndRecentOpsWithLock project_id, doc_id, fromVersion, (error, lines, version, ops, ranges) ->
  18. timer.done()
  19. return next(error) if error?
  20. logger.log project_id: project_id, doc_id: doc_id, "got doc via http"
  21. if !lines? or !version?
  22. return next(new Errors.NotFoundError("document not found"))
  23. res.send JSON.stringify
  24. id: doc_id
  25. lines: lines
  26. version: version
  27. ops: ops
  28. ranges: ranges
  29. _getTotalSizeOfLines: (lines) ->
  30. size = 0
  31. for line in lines
  32. size += (line.length + 1)
  33. return size
  34. setDoc: (req, res, next = (error) ->) ->
  35. doc_id = req.params.doc_id
  36. project_id = req.params.project_id
  37. {lines, source, user_id, undoing} = req.body
  38. lineSize = HttpController._getTotalSizeOfLines(lines)
  39. if lineSize > TWO_MEGABYTES
  40. logger.log {project_id, doc_id, source, lineSize, user_id}, "document too large, returning 406 response"
  41. return res.send 406
  42. logger.log {project_id, doc_id, lines, source, user_id, undoing}, "setting doc via http"
  43. timer = new Metrics.Timer("http.setDoc")
  44. DocumentManager.setDocWithLock project_id, doc_id, lines, source, user_id, undoing, (error) ->
  45. timer.done()
  46. return next(error) if error?
  47. logger.log project_id: project_id, doc_id: doc_id, "set doc via http"
  48. res.send 204 # No Content
  49. flushDocIfLoaded: (req, res, next = (error) ->) ->
  50. doc_id = req.params.doc_id
  51. project_id = req.params.project_id
  52. logger.log project_id: project_id, doc_id: doc_id, "flushing doc via http"
  53. timer = new Metrics.Timer("http.flushDoc")
  54. DocumentManager.flushDocIfLoadedWithLock project_id, doc_id, (error) ->
  55. timer.done()
  56. return next(error) if error?
  57. logger.log project_id: project_id, doc_id: doc_id, "flushed doc via http"
  58. res.send 204 # No Content
  59. flushAndDeleteDoc: (req, res, next = (error) ->) ->
  60. doc_id = req.params.doc_id
  61. project_id = req.params.project_id
  62. logger.log project_id: project_id, doc_id: doc_id, "deleting doc via http"
  63. timer = new Metrics.Timer("http.deleteDoc")
  64. DocumentManager.flushAndDeleteDocWithLock project_id, doc_id, (error) ->
  65. timer.done()
  66. return next(error) if error?
  67. logger.log project_id: project_id, doc_id: doc_id, "deleted doc via http"
  68. res.send 204 # No Content
  69. flushProject: (req, res, next = (error) ->) ->
  70. project_id = req.params.project_id
  71. logger.log project_id: project_id, "flushing project via http"
  72. timer = new Metrics.Timer("http.flushProject")
  73. ProjectManager.flushProjectWithLocks project_id, (error) ->
  74. timer.done()
  75. return next(error) if error?
  76. logger.log project_id: project_id, "flushed project via http"
  77. res.send 204 # No Content
  78. deleteProject: (req, res, next = (error) ->) ->
  79. project_id = req.params.project_id
  80. logger.log project_id: project_id, "deleting project via http"
  81. timer = new Metrics.Timer("http.deleteProject")
  82. ProjectManager.flushAndDeleteProjectWithLocks project_id, (error) ->
  83. timer.done()
  84. return next(error) if error?
  85. logger.log project_id: project_id, "deleted project via http"
  86. res.send 204 # No Content
  87. acceptChange: (req, res, next = (error) ->) ->
  88. {project_id, doc_id, change_id} = req.params
  89. logger.log {project_id, doc_id, change_id}, "accepting change via http"
  90. timer = new Metrics.Timer("http.acceptChange")
  91. DocumentManager.acceptChangeWithLock project_id, doc_id, change_id, (error) ->
  92. timer.done()
  93. return next(error) if error?
  94. logger.log {project_id, doc_id, change_id}, "accepted change via http"
  95. res.send 204 # No Content
  96. bulkAcceptChanges: (req, res, next = (error) ->) ->
  97. {project_id, doc_id} = req.params
  98. {change_ids} = req.body
  99. change_ids ?= []
  100. logger.log {project_id, doc_id}, "accepting #{ change_ids.length } changes via http"
  101. timer = new Metrics.Timer("http.bulkAcceptChanges")
  102. DocumentManager.bulkAcceptChangesWithLock project_id, doc_id, change_ids, (error) ->
  103. timer.done()
  104. return next(error) if error?
  105. logger.log {project_id, doc_id}, "accepted #{ change_ids.length } changes via http"
  106. res.send 204 # No Content
  107. deleteComment: (req, res, next = (error) ->) ->
  108. {project_id, doc_id, comment_id} = req.params
  109. logger.log {project_id, doc_id, comment_id}, "deleting comment via http"
  110. timer = new Metrics.Timer("http.deleteComment")
  111. DocumentManager.deleteCommentWithLock project_id, doc_id, comment_id, (error) ->
  112. timer.done()
  113. return next(error) if error?
  114. logger.log {project_id, doc_id, comment_id}, "deleted comment via http"
  115. res.send 204 # No Content