HttpController.coffee 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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) ->
  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. _getTotalSizeOfLines: (lines) ->
  29. size = 0
  30. for line in lines
  31. size += (line.length + 1)
  32. return size
  33. setDoc: (req, res, next = (error) ->) ->
  34. doc_id = req.params.doc_id
  35. project_id = req.params.project_id
  36. lines = req.body.lines
  37. source = req.body.source
  38. user_id = req.body.user_id
  39. lineSize = HttpController._getTotalSizeOfLines(lines)
  40. if lineSize > TWO_MEGABYTES
  41. logger.log {project_id, doc_id, source, lineSize, user_id}, "document too large, returning 406 response"
  42. return res.send 406
  43. logger.log project_id: project_id, doc_id: doc_id, lines: lines, source: source, user_id: user_id, "setting doc via http"
  44. timer = new Metrics.Timer("http.setDoc")
  45. DocumentManager.setDocWithLock project_id, doc_id, lines, source, user_id, (error) ->
  46. timer.done()
  47. return next(error) if error?
  48. logger.log project_id: project_id, doc_id: doc_id, "set doc via http"
  49. res.send 204 # No Content
  50. flushDocIfLoaded: (req, res, next = (error) ->) ->
  51. doc_id = req.params.doc_id
  52. project_id = req.params.project_id
  53. logger.log project_id: project_id, doc_id: doc_id, "flushing doc via http"
  54. timer = new Metrics.Timer("http.flushDoc")
  55. DocumentManager.flushDocIfLoadedWithLock project_id, doc_id, (error) ->
  56. timer.done()
  57. return next(error) if error?
  58. logger.log project_id: project_id, doc_id: doc_id, "flushed doc via http"
  59. res.send 204 # No Content
  60. flushAndDeleteDoc: (req, res, next = (error) ->) ->
  61. doc_id = req.params.doc_id
  62. project_id = req.params.project_id
  63. logger.log project_id: project_id, doc_id: doc_id, "deleting doc via http"
  64. timer = new Metrics.Timer("http.deleteDoc")
  65. DocumentManager.flushAndDeleteDocWithLock project_id, doc_id, (error) ->
  66. timer.done()
  67. return next(error) if error?
  68. logger.log project_id: project_id, doc_id: doc_id, "deleted doc via http"
  69. res.send 204 # No Content
  70. flushProject: (req, res, next = (error) ->) ->
  71. project_id = req.params.project_id
  72. logger.log project_id: project_id, "flushing project via http"
  73. timer = new Metrics.Timer("http.flushProject")
  74. ProjectManager.flushProjectWithLocks project_id, (error) ->
  75. timer.done()
  76. return next(error) if error?
  77. logger.log project_id: project_id, "flushed project via http"
  78. res.send 204 # No Content
  79. deleteProject: (req, res, next = (error) ->) ->
  80. project_id = req.params.project_id
  81. logger.log project_id: project_id, "deleting project via http"
  82. timer = new Metrics.Timer("http.deleteProject")
  83. ProjectManager.flushAndDeleteProjectWithLocks project_id, (error) ->
  84. timer.done()
  85. return next(error) if error?
  86. logger.log project_id: project_id, "deleted project via http"
  87. res.send 204 # No Content