HttpController.coffee 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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 = req.body.lines
  38. source = req.body.source
  39. user_id = req.body.user_id
  40. lineSize = HttpController._getTotalSizeOfLines(lines)
  41. if lineSize > TWO_MEGABYTES
  42. logger.log {project_id, doc_id, source, lineSize, user_id}, "document too large, returning 406 response"
  43. return res.send 406
  44. logger.log project_id: project_id, doc_id: doc_id, lines: lines, source: source, user_id: user_id, "setting doc via http"
  45. timer = new Metrics.Timer("http.setDoc")
  46. DocumentManager.setDocWithLock project_id, doc_id, lines, source, user_id, (error) ->
  47. timer.done()
  48. return next(error) if error?
  49. logger.log project_id: project_id, doc_id: doc_id, "set doc via http"
  50. res.send 204 # No Content
  51. flushDocIfLoaded: (req, res, next = (error) ->) ->
  52. doc_id = req.params.doc_id
  53. project_id = req.params.project_id
  54. logger.log project_id: project_id, doc_id: doc_id, "flushing doc via http"
  55. timer = new Metrics.Timer("http.flushDoc")
  56. DocumentManager.flushDocIfLoadedWithLock project_id, doc_id, (error) ->
  57. timer.done()
  58. return next(error) if error?
  59. logger.log project_id: project_id, doc_id: doc_id, "flushed doc via http"
  60. res.send 204 # No Content
  61. flushAndDeleteDoc: (req, res, next = (error) ->) ->
  62. doc_id = req.params.doc_id
  63. project_id = req.params.project_id
  64. logger.log project_id: project_id, doc_id: doc_id, "deleting doc via http"
  65. timer = new Metrics.Timer("http.deleteDoc")
  66. DocumentManager.flushAndDeleteDocWithLock project_id, doc_id, (error) ->
  67. timer.done()
  68. return next(error) if error?
  69. logger.log project_id: project_id, doc_id: doc_id, "deleted doc via http"
  70. res.send 204 # No Content
  71. flushProject: (req, res, next = (error) ->) ->
  72. project_id = req.params.project_id
  73. logger.log project_id: project_id, "flushing project via http"
  74. timer = new Metrics.Timer("http.flushProject")
  75. ProjectManager.flushProjectWithLocks project_id, (error) ->
  76. timer.done()
  77. return next(error) if error?
  78. logger.log project_id: project_id, "flushed project via http"
  79. res.send 204 # No Content
  80. deleteProject: (req, res, next = (error) ->) ->
  81. project_id = req.params.project_id
  82. logger.log project_id: project_id, "deleting project via http"
  83. timer = new Metrics.Timer("http.deleteProject")
  84. ProjectManager.flushAndDeleteProjectWithLocks project_id, (error) ->
  85. timer.done()
  86. return next(error) if error?
  87. logger.log project_id: project_id, "deleted project via http"
  88. res.send 204 # No Content
  89. acceptChange: (req, res, next = (error) ->) ->
  90. {project_id, doc_id, change_id} = req.params
  91. logger.log {project_id, doc_id, change_id}, "accepting change via http"
  92. timer = new Metrics.Timer("http.acceptChange")
  93. DocumentManager.acceptChangeWithLock project_id, doc_id, change_id, (error) ->
  94. timer.done()
  95. return next(error) if error?
  96. logger.log {project_id, doc_id, change_id}, "accepted change via http"
  97. res.send 204 # No Content
  98. deleteComment: (req, res, next = (error) ->) ->
  99. {project_id, doc_id, comment_id} = req.params
  100. logger.log {project_id, doc_id, comment_id}, "deleting comment via http"
  101. timer = new Metrics.Timer("http.deleteComment")
  102. DocumentManager.deleteCommentWithLock project_id, doc_id, comment_id, (error) ->
  103. timer.done()
  104. return next(error) if error?
  105. logger.log {project_id, doc_id, comment_id}, "deleted comment via http"
  106. res.send 204 # No Content