HistoryController.coffee 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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. module.exports = HistoryController =
  7. initializeProject: (callback = (error, history_id) ->) ->
  8. return callback() if !settings.apis.project_history?.enabled
  9. request.post {
  10. url: "#{settings.apis.project_history.url}/project"
  11. }, (error, res, body)->
  12. return callback(error) if error?
  13. if res.statusCode >= 200 and res.statusCode < 300
  14. try
  15. project = JSON.parse(body)
  16. catch error
  17. return callback(error)
  18. overleaf_id = project?.project?.id
  19. if !overleaf_id
  20. error = new Error("project-history did not provide an id", project)
  21. return callback(error)
  22. callback null, { overleaf_id }
  23. else
  24. error = new Error("project-history returned a non-success status code: #{res.statusCode}")
  25. callback error
  26. selectHistoryApi: (req, res, next = (error) ->) ->
  27. project_id = req.params?.Project_id
  28. # find out which type of history service this project uses
  29. ProjectDetailsHandler.getDetails project_id, (err, project) ->
  30. return next(err) if err?
  31. if project?.overleaf?.history?.display
  32. req.useProjectHistory = true
  33. else
  34. req.useProjectHistory = false
  35. next()
  36. proxyToHistoryApi: (req, res, next = (error) ->) ->
  37. user_id = AuthenticationController.getLoggedInUserId req
  38. url = HistoryController.buildHistoryServiceUrl(req.useProjectHistory) + req.url
  39. logger.log url: url, "proxying to history api"
  40. getReq = request(
  41. url: url
  42. method: req.method
  43. headers:
  44. "X-User-Id": user_id
  45. )
  46. getReq.pipe(res)
  47. getReq.on "error", (error) ->
  48. logger.error url: url, err: error, "history API error"
  49. next(error)
  50. buildHistoryServiceUrl: (useProjectHistory) ->
  51. # choose a history service, either document-level (trackchanges)
  52. # or project-level (project_history)
  53. if settings.apis.project_history?.enabled && useProjectHistory
  54. return settings.apis.project_history.url
  55. else
  56. return settings.apis.trackchanges.url