WebApiManager.js 1.8 KB

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