HistoryController.coffee 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. logger = require "logger-sharelatex"
  2. request = require "request"
  3. settings = require "settings-sharelatex"
  4. AuthenticationController = require "../Authentication/AuthenticationController"
  5. Errors = require "../Errors/Errors"
  6. HistoryManager = require "./HistoryManager"
  7. ProjectDetailsHandler = require "../Project/ProjectDetailsHandler"
  8. ProjectEntityUpdateHandler = require "../Project/ProjectEntityUpdateHandler"
  9. module.exports = HistoryController =
  10. selectHistoryApi: (req, res, next = (error) ->) ->
  11. project_id = req.params?.Project_id
  12. # find out which type of history service this project uses
  13. ProjectDetailsHandler.getDetails project_id, (err, project) ->
  14. return next(err) if err?
  15. history = project.overleaf?.history
  16. if history?.id? and history?.display
  17. req.useProjectHistory = true
  18. else
  19. req.useProjectHistory = false
  20. next()
  21. proxyToHistoryApi: (req, res, next = (error) ->) ->
  22. user_id = AuthenticationController.getLoggedInUserId req
  23. url = HistoryController.buildHistoryServiceUrl(req.useProjectHistory) + req.url
  24. logger.log url: url, "proxying to history api"
  25. getReq = request(
  26. url: url
  27. method: req.method
  28. headers:
  29. "X-User-Id": user_id
  30. )
  31. getReq.pipe(res)
  32. getReq.on "error", (error) ->
  33. logger.error url: url, err: error, "history API error"
  34. next(error)
  35. proxyToHistoryApiAndInjectUserDetails: (req, res, next = (error) ->) ->
  36. user_id = AuthenticationController.getLoggedInUserId req
  37. url = HistoryController.buildHistoryServiceUrl(req.useProjectHistory) + req.url
  38. logger.log url: url, "proxying to history api"
  39. request {
  40. url: url
  41. method: req.method
  42. json: true
  43. headers:
  44. "X-User-Id": user_id
  45. }, (error, response, body) ->
  46. return next(error) if error?
  47. if 200 <= response.statusCode < 300
  48. HistoryManager.injectUserDetails body, (error, data) ->
  49. return next(error) if error?
  50. res.json data
  51. else
  52. error = new Error("history api responded with non-success code: #{response.statusCode}")
  53. logger.error err: error, user_id: user_id, "error proxying request to history api"
  54. next(error)
  55. buildHistoryServiceUrl: (useProjectHistory) ->
  56. # choose a history service, either document-level (trackchanges)
  57. # or project-level (project_history)
  58. if useProjectHistory
  59. return settings.apis.project_history.url
  60. else
  61. return settings.apis.trackchanges.url
  62. resyncProjectHistory: (req, res, next = (error) ->) ->
  63. project_id = req.params.Project_id
  64. ProjectEntityUpdateHandler.resyncProjectHistory project_id, (error) ->
  65. return res.sendStatus(404) if error instanceof Errors.ProjectHistoryDisabledError
  66. return next(error) if error?
  67. res.sendStatus 204