WebApiManager.coffee 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. request = require "requestretry" # allow retry on error https://github.com/FGRibreau/node-request-retry
  2. logger = require "logger-sharelatex"
  3. Settings = require "settings-sharelatex"
  4. # Don't let HTTP calls hang for a long time
  5. MAX_HTTP_REQUEST_LENGTH = 15000 # 15 seconds
  6. # DEPRECATED! This method of getting user details via track-changes is deprecated
  7. # in the way we lay out our services.
  8. # Instead, web should be responsible for collecting the raw data (user_ids) and
  9. # filling it out with calls to other services. All API calls should create a
  10. # tree-like structure as much as possible, with web as the root.
  11. module.exports = WebApiManager =
  12. sendRequest: (url, callback = (error, body) ->) ->
  13. request.get {
  14. url: "#{Settings.apis.web.url}#{url}"
  15. timeout: MAX_HTTP_REQUEST_LENGTH
  16. maxAttempts: 2 # for node-request-retry
  17. auth:
  18. user: Settings.apis.web.user
  19. pass: Settings.apis.web.pass
  20. sendImmediately: true
  21. }, (error, res, body)->
  22. if error?
  23. return callback(error)
  24. if res.statusCode == 404
  25. logger.log url: url, "got 404 from web api"
  26. return callback null, null
  27. if res.statusCode >= 200 and res.statusCode < 300
  28. return callback null, body
  29. else
  30. error = new Error("web returned a non-success status code: #{res.statusCode} (attempts: #{res.attempts})")
  31. callback error
  32. getUserInfo: (user_id, callback = (error, userInfo) ->) ->
  33. url = "/user/#{user_id}/personal_info"
  34. logger.log user_id: user_id, "getting user info from web"
  35. WebApiManager.sendRequest url, (error, body) ->
  36. if error?
  37. logger.error err: error, user_id: user_id, url: url, "error accessing web"
  38. return callback error
  39. if body == null
  40. logger.error user_id: user_id, url: url, "no user found"
  41. return callback null, null
  42. try
  43. user = JSON.parse(body)
  44. catch error
  45. return callback(error)
  46. callback null, {
  47. id: user.id
  48. email: user.email
  49. first_name: user.first_name
  50. last_name: user.last_name
  51. }
  52. getProjectDetails: (project_id, callback = (error, details) ->) ->
  53. url = "/project/#{project_id}/details"
  54. logger.log project_id: project_id, "getting project details from web"
  55. WebApiManager.sendRequest url, (error, body) ->
  56. if error?
  57. logger.error err: error, project_id: project_id, url: url, "error accessing web"
  58. return callback error
  59. try
  60. project = JSON.parse(body)
  61. catch error
  62. return callback(error)
  63. callback null, project