WebApiManager.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /* eslint-disable
  2. camelcase,
  3. */
  4. const request = require('request')
  5. const settings = require('settings-sharelatex')
  6. const logger = require('logger-sharelatex')
  7. const {
  8. CodedError,
  9. CorruptedJoinProjectResponseError,
  10. WebApiRequestFailedError
  11. } = require('./Errors')
  12. module.exports = {
  13. joinProject(project_id, user, callback) {
  14. const user_id = user._id
  15. logger.log({ project_id, user_id }, 'sending join project request to web')
  16. const url = `${settings.apis.web.url}/project/${project_id}/join`
  17. const headers = {}
  18. if (user.anonymousAccessToken) {
  19. headers['x-sl-anonymous-access-token'] = user.anonymousAccessToken
  20. }
  21. request.post(
  22. {
  23. url,
  24. qs: { user_id },
  25. auth: {
  26. user: settings.apis.web.user,
  27. pass: settings.apis.web.pass,
  28. sendImmediately: true
  29. },
  30. json: true,
  31. jar: false,
  32. headers
  33. },
  34. function (error, response, data) {
  35. if (error) {
  36. return callback(error)
  37. }
  38. if (response.statusCode >= 200 && response.statusCode < 300) {
  39. if (!(data && data.project)) {
  40. return callback(new CorruptedJoinProjectResponseError())
  41. }
  42. callback(
  43. null,
  44. data.project,
  45. data.privilegeLevel,
  46. data.isRestrictedUser
  47. )
  48. } else if (response.statusCode === 429) {
  49. logger.log(project_id, user_id, 'rate-limit hit when joining project')
  50. callback(
  51. new CodedError(
  52. 'rate-limit hit when joining project',
  53. 'TooManyRequests'
  54. )
  55. )
  56. } else {
  57. callback(new WebApiRequestFailedError(response.statusCode))
  58. }
  59. }
  60. )
  61. }
  62. }