HistoryController.coffee 2.5 KB

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