HistoryController.coffee 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. RestoreManager = require "./RestoreManager"
  10. module.exports = HistoryController =
  11. selectHistoryApi: (req, res, next = (error) ->) ->
  12. project_id = req.params?.Project_id
  13. # find out which type of history service this project uses
  14. ProjectDetailsHandler.getDetails project_id, (err, project) ->
  15. return next(err) if err?
  16. history = project.overleaf?.history
  17. if history?.id? and history?.display
  18. req.useProjectHistory = true
  19. else
  20. req.useProjectHistory = false
  21. next()
  22. proxyToHistoryApi: (req, res, next = (error) ->) ->
  23. user_id = AuthenticationController.getLoggedInUserId req
  24. url = HistoryController.buildHistoryServiceUrl(req.useProjectHistory) + req.url
  25. logger.log url: url, "proxying to history api"
  26. getReq = request(
  27. url: url
  28. method: req.method
  29. headers:
  30. "X-User-Id": user_id
  31. )
  32. getReq.pipe(res)
  33. getReq.on "error", (error) ->
  34. logger.error url: url, err: error, "history API error"
  35. next(error)
  36. proxyToHistoryApiAndInjectUserDetails: (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. request {
  41. url: url
  42. method: req.method
  43. json: true
  44. headers:
  45. "X-User-Id": user_id
  46. }, (error, response, body) ->
  47. return next(error) if error?
  48. if 200 <= response.statusCode < 300
  49. HistoryManager.injectUserDetails body, (error, data) ->
  50. return next(error) if error?
  51. res.json data
  52. else
  53. error = new Error("history api responded with non-success code: #{response.statusCode}")
  54. logger.error err: error, user_id: user_id, "error proxying request to history api"
  55. next(error)
  56. buildHistoryServiceUrl: (useProjectHistory) ->
  57. # choose a history service, either document-level (trackchanges)
  58. # or project-level (project_history)
  59. if useProjectHistory
  60. return settings.apis.project_history.url
  61. else
  62. return settings.apis.trackchanges.url
  63. resyncProjectHistory: (req, res, next = (error) ->) ->
  64. project_id = req.params.Project_id
  65. ProjectEntityUpdateHandler.resyncProjectHistory project_id, (error) ->
  66. return res.sendStatus(404) if error instanceof Errors.ProjectHistoryDisabledError
  67. return next(error) if error?
  68. res.sendStatus 204
  69. restoreFileFromV2: (req, res, next) ->
  70. {project_id} = req.params
  71. {version, pathname} = req.body
  72. user_id = AuthenticationController.getLoggedInUserId req
  73. logger.log {project_id, version, pathname}, "restoring file from v2"
  74. RestoreManager.restoreFileFromV2 user_id, project_id, version, pathname, (error, entity) ->
  75. return next(error) if error?
  76. res.json {
  77. type: entity.type,
  78. id: entity._id
  79. }
  80. restoreDocFromDeletedDoc: (req, res, next) ->
  81. {project_id, doc_id} = req.params
  82. {name} = req.body
  83. user_id = AuthenticationController.getLoggedInUserId(req)
  84. if !name?
  85. return res.sendStatus 400 # Malformed request
  86. logger.log {project_id, doc_id, user_id}, "restoring doc from v1 deleted doc"
  87. RestoreManager.restoreDocFromDeletedDoc user_id, project_id, doc_id, name, (err, doc) =>
  88. return next(error) if error?
  89. res.json {
  90. doc_id: doc._id
  91. }