V1Api.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // TODO: This file was created by bulk-decaffeinate.
  2. // Fix any style issues and re-enable lint.
  3. /*
  4. * decaffeinate suggestions:
  5. * DS101: Remove unnecessary use of Array.from
  6. * DS102: Remove unnecessary code created because of implicit returns
  7. * DS207: Consider shorter variations of null checks
  8. * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  9. */
  10. const request = require('request')
  11. const settings = require('@overleaf/settings')
  12. const Errors = require('../Errors/Errors')
  13. const { promisifyAll } = require('../../util/promises')
  14. // TODO: check what happens when these settings aren't defined
  15. const DEFAULT_V1_PARAMS = {
  16. baseUrl: settings.apis.v1.url,
  17. auth: {
  18. user: settings.apis.v1.user,
  19. pass: settings.apis.v1.pass,
  20. },
  21. json: true,
  22. timeout: settings.apis.v1.timeout,
  23. }
  24. const v1Request = request.defaults(DEFAULT_V1_PARAMS)
  25. const DEFAULT_V1_OAUTH_PARAMS = {
  26. baseUrl: settings.apis.v1.url,
  27. json: true,
  28. timeout: settings.apis.v1.timeout,
  29. }
  30. const v1OauthRequest = request.defaults(DEFAULT_V1_OAUTH_PARAMS)
  31. const V1Api = {
  32. request(options, callback) {
  33. if (callback == null) {
  34. return request(options)
  35. }
  36. return v1Request(options, (error, response, body) =>
  37. V1Api._responseHandler(options, error, response, body, callback)
  38. )
  39. },
  40. oauthRequest(options, token, callback) {
  41. if (options.uri == null) {
  42. return callback(new Error('uri required'))
  43. }
  44. if (options.method == null) {
  45. options.method = 'GET'
  46. }
  47. options.auth = { bearer: token }
  48. return v1OauthRequest(options, (error, response, body) =>
  49. V1Api._responseHandler(options, error, response, body, callback)
  50. )
  51. },
  52. _responseHandler(options, error, response, body, callback) {
  53. if (error != null) {
  54. return callback(
  55. new Errors.V1ConnectionError('error from V1 API').withCause(error)
  56. )
  57. }
  58. if (response && response.statusCode >= 500) {
  59. return callback(
  60. new Errors.V1ConnectionError({
  61. message: 'error from V1 API',
  62. info: { status: response.statusCode, body },
  63. })
  64. )
  65. }
  66. if (
  67. (response.statusCode >= 200 && response.statusCode < 300) ||
  68. Array.from(options.expectedStatusCodes || []).includes(
  69. response.statusCode
  70. )
  71. ) {
  72. return callback(null, response, body)
  73. } else if (response.statusCode === 403) {
  74. error = new Errors.ForbiddenError('overleaf v1 returned forbidden')
  75. error.statusCode = response.statusCode
  76. return callback(error)
  77. } else if (response.statusCode === 404) {
  78. error = new Errors.NotFoundError(
  79. `overleaf v1 returned non-success code: ${response.statusCode} ${options.method} ${options.uri}`
  80. )
  81. error.statusCode = response.statusCode
  82. return callback(error)
  83. } else {
  84. error = new Error(
  85. `overleaf v1 returned non-success code: ${response.statusCode} ${options.method} ${options.uri}`
  86. )
  87. error.statusCode = response.statusCode
  88. return callback(error)
  89. }
  90. },
  91. }
  92. V1Api.promises = promisifyAll(V1Api, {
  93. multiResult: {
  94. request: ['response', 'body'],
  95. oauthRequest: ['response', 'body'],
  96. },
  97. })
  98. module.exports = V1Api