HistoryManager.coffee 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. injectUserDetails: (data, callback = (error, data_with_users) ->) ->
  26. # data can be either:
  27. # {
  28. # diff: [{
  29. # i: "foo",
  30. # meta: {
  31. # users: ["user_id", { first_name: "James", ... }, ...]
  32. # ...
  33. # }
  34. # }, ...]
  35. # }
  36. # or
  37. # {
  38. # updates: [{
  39. # pathnames: ["main.tex"]
  40. # meta: {
  41. # users: ["user_id", { first_name: "James", ... }, ...]
  42. # ...
  43. # },
  44. # ...
  45. # }, ...]
  46. # }
  47. # Either way, the top level key points to an array of objects with a meta.users property
  48. # that we need to replace user_ids with populated user objects.
  49. # Note that some entries in the users arrays may already have user objects from the v1 history
  50. # service
  51. user_ids = new Set()
  52. for entry in data.diff or data.updates or []
  53. for user in entry.meta?.users or []
  54. if typeof user == "string"
  55. user_ids.add user
  56. user_ids = Array.from(user_ids)
  57. UserGetter.getUsers user_ids, { first_name: 1, last_name: 1, email: 1 }, (error, users_array) ->
  58. return callback(error) if error?
  59. users = {}
  60. for user in users_array or []
  61. users[user._id.toString()] = HistoryManager._userView(user)
  62. for entry in data.diff or data.updates or []
  63. entry.meta?.users = (entry.meta?.users or []).map (user) ->
  64. if typeof user == "string"
  65. return users[user]
  66. else
  67. return user
  68. callback null, data
  69. _userView: (user) ->
  70. { _id, first_name, last_name, email } = user
  71. return { first_name, last_name, email, id: _id }