WebApiManager.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. const request = require('request')
  2. const OError = require('@overleaf/o-error')
  3. const settings = require('@overleaf/settings')
  4. const logger = require('@overleaf/logger')
  5. const {
  6. CodedError,
  7. CorruptedJoinProjectResponseError,
  8. NotAuthorizedError,
  9. WebApiRequestFailedError,
  10. } = require('./Errors')
  11. module.exports = {
  12. joinProject(projectId, user, callback) {
  13. const userId = user._id
  14. logger.debug({ projectId, userId }, 'sending join project request to web')
  15. const url = `${settings.apis.web.url}/project/${projectId}/join`
  16. const headers = {}
  17. if (user.anonymousAccessToken) {
  18. headers['x-sl-anonymous-access-token'] = user.anonymousAccessToken
  19. }
  20. request.post(
  21. {
  22. url,
  23. qs: { user_id: userId },
  24. auth: {
  25. user: settings.apis.web.user,
  26. pass: settings.apis.web.pass,
  27. sendImmediately: true,
  28. },
  29. json: true,
  30. jar: false,
  31. headers,
  32. },
  33. function (error, response, data) {
  34. if (error) {
  35. OError.tag(error, 'join project request failed')
  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. const userMetadata = {
  43. isRestrictedUser: data.isRestrictedUser,
  44. isTokenMember: data.isTokenMember,
  45. isInvitedMember: data.isInvitedMember,
  46. }
  47. callback(null, data.project, data.privilegeLevel, userMetadata)
  48. } else if (response.statusCode === 429) {
  49. callback(
  50. new CodedError(
  51. 'rate-limit hit when joining project',
  52. 'TooManyRequests'
  53. )
  54. )
  55. } else if (response.statusCode === 403) {
  56. callback(new NotAuthorizedError())
  57. } else if (response.statusCode === 404) {
  58. callback(new CodedError('project not found', 'ProjectNotFound'))
  59. } else {
  60. callback(new WebApiRequestFailedError(response.statusCode))
  61. }
  62. }
  63. )
  64. },
  65. }