HistoryManager.coffee 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. request = require "request"
  2. settings = require "settings-sharelatex"
  3. async = require 'async'
  4. UserGetter = require "../User/UserGetter"
  5. module.exports = HistoryManager =
  6. initializeProject: (callback = (error, history_id) ->) ->
  7. return callback() if !settings.apis.project_history?.initializeHistoryForNewProjects
  8. request.post {
  9. url: "#{settings.apis.project_history.url}/project"
  10. }, (error, res, body)->
  11. return callback(error) if error?
  12. if res.statusCode >= 200 and res.statusCode < 300
  13. try
  14. project = JSON.parse(body)
  15. catch error
  16. return callback(error)
  17. overleaf_id = project?.project?.id
  18. if !overleaf_id
  19. error = new Error("project-history did not provide an id", project)
  20. return callback(error)
  21. callback null, { overleaf_id }
  22. else
  23. error = new Error("project-history returned a non-success status code: #{res.statusCode}")
  24. callback error
  25. flushProject: (project_id, callback = (error) ->) ->
  26. request.post {
  27. url: "#{settings.apis.project_history.url}/project/#{project_id}/flush"
  28. }, (error, res, body)->
  29. return callback(error) if error?
  30. if res.statusCode >= 200 and res.statusCode < 300
  31. callback()
  32. else
  33. error = new Error("project-history returned a non-success status code: #{res.statusCode}")
  34. callback error
  35. injectUserDetails: (data, callback = (error, data_with_users) ->) ->
  36. # data can be either:
  37. # {
  38. # diff: [{
  39. # i: "foo",
  40. # meta: {
  41. # users: ["user_id", { first_name: "James", ... }, ...]
  42. # ...
  43. # }
  44. # }, ...]
  45. # }
  46. # or
  47. # {
  48. # updates: [{
  49. # pathnames: ["main.tex"]
  50. # meta: {
  51. # users: ["user_id", { first_name: "James", ... }, ...]
  52. # ...
  53. # },
  54. # ...
  55. # }, ...]
  56. # }
  57. # Either way, the top level key points to an array of objects with a meta.users property
  58. # that we need to replace user_ids with populated user objects.
  59. # Note that some entries in the users arrays may already have user objects from the v1 history
  60. # service
  61. user_ids = new Set()
  62. for entry in data.diff or data.updates or []
  63. for user in entry.meta?.users or []
  64. if typeof user == "string"
  65. user_ids.add user
  66. user_ids = Array.from(user_ids)
  67. UserGetter.getUsers user_ids, { first_name: 1, last_name: 1, email: 1 }, (error, users_array) ->
  68. return callback(error) if error?
  69. users = {}
  70. for user in users_array or []
  71. users[user._id.toString()] = HistoryManager._userView(user)
  72. for entry in data.diff or data.updates or []
  73. entry.meta?.users = (entry.meta?.users or []).map (user) ->
  74. if typeof user == "string"
  75. return users[user]
  76. else
  77. return user
  78. callback null, data
  79. _userView: (user) ->
  80. { _id, first_name, last_name, email } = user
  81. return { first_name, last_name, email, id: _id }