UrlAgent.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /* eslint-disable
  2. camelcase,
  3. node/handle-callback-err,
  4. max-len,
  5. no-unused-vars,
  6. */
  7. // TODO: This file was created by bulk-decaffeinate.
  8. // Fix any style issues and re-enable lint.
  9. /*
  10. * decaffeinate suggestions:
  11. * DS102: Remove unnecessary code created because of implicit returns
  12. * DS207: Consider shorter variations of null checks
  13. * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  14. */
  15. let UrlAgent
  16. const request = require('request')
  17. const _ = require('underscore')
  18. const urlValidator = require('valid-url')
  19. const { InvalidUrlError, UrlFetchFailedError } = require('./LinkedFilesErrors')
  20. const LinkedFilesHandler = require('./LinkedFilesHandler')
  21. const UrlHelper = require('../Helpers/UrlHelper')
  22. module.exports = UrlAgent = {
  23. createLinkedFile(
  24. project_id,
  25. linkedFileData,
  26. name,
  27. parent_folder_id,
  28. user_id,
  29. callback
  30. ) {
  31. linkedFileData = this._sanitizeData(linkedFileData)
  32. return this._getUrlStream(project_id, linkedFileData, user_id, function(
  33. err,
  34. readStream
  35. ) {
  36. if (err != null) {
  37. return callback(err)
  38. }
  39. readStream.on('error', callback)
  40. return readStream.on('response', function(response) {
  41. if (response.statusCode >= 200 && response.statusCode < 300) {
  42. readStream.resume()
  43. return LinkedFilesHandler.importFromStream(
  44. project_id,
  45. readStream,
  46. linkedFileData,
  47. name,
  48. parent_folder_id,
  49. user_id,
  50. function(err, file) {
  51. if (err != null) {
  52. return callback(err)
  53. }
  54. return callback(null, file._id)
  55. }
  56. ) // Created
  57. } else {
  58. const error = new UrlFetchFailedError(
  59. `url fetch failed: ${linkedFileData.url}`
  60. )
  61. error.statusCode = response.statusCode
  62. return callback(error)
  63. }
  64. })
  65. })
  66. },
  67. refreshLinkedFile(
  68. project_id,
  69. linkedFileData,
  70. name,
  71. parent_folder_id,
  72. user_id,
  73. callback
  74. ) {
  75. return this.createLinkedFile(
  76. project_id,
  77. linkedFileData,
  78. name,
  79. parent_folder_id,
  80. user_id,
  81. callback
  82. )
  83. },
  84. _sanitizeData(data) {
  85. return {
  86. provider: data.provider,
  87. url: UrlHelper.prependHttpIfNeeded(data.url)
  88. }
  89. },
  90. _getUrlStream(project_id, data, current_user_id, callback) {
  91. if (callback == null) {
  92. callback = function(error, fsPath) {}
  93. }
  94. callback = _.once(callback)
  95. let { url } = data
  96. if (!urlValidator.isWebUri(url)) {
  97. return callback(new InvalidUrlError(`invalid url: ${url}`))
  98. }
  99. url = UrlHelper.wrapUrlWithProxy(url)
  100. const readStream = request.get(url)
  101. readStream.pause()
  102. return callback(null, readStream)
  103. }
  104. }