UrlAgent.coffee 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. request = require 'request'
  2. _ = require "underscore"
  3. urlValidator = require 'valid-url'
  4. { InvalidUrlError, UrlFetchFailedError } = require './LinkedFilesErrors'
  5. LinkedFilesHandler = require './LinkedFilesHandler'
  6. UrlHelper = require '../Helpers/UrlHelper'
  7. module.exports = UrlAgent = {
  8. createLinkedFile: (project_id, linkedFileData, name, parent_folder_id, user_id, callback) ->
  9. linkedFileData = @._sanitizeData(linkedFileData)
  10. @_getUrlStream project_id, linkedFileData, user_id, (err, readStream) ->
  11. return callback(err) if err?
  12. readStream.on "error", callback
  13. readStream.on "response", (response) ->
  14. if 200 <= response.statusCode < 300
  15. readStream.resume()
  16. LinkedFilesHandler.importFromStream project_id,
  17. readStream,
  18. linkedFileData,
  19. name,
  20. parent_folder_id,
  21. user_id,
  22. (err, file) ->
  23. return callback(err) if err?
  24. callback(null, file._id) # Created
  25. else
  26. error = new UrlFetchFailedError("url fetch failed: #{linkedFileData.url}")
  27. error.statusCode = response.statusCode
  28. callback(error)
  29. refreshLinkedFile: (project_id, linkedFileData, name, parent_folder_id, user_id, callback) ->
  30. @createLinkedFile project_id, linkedFileData, name, parent_folder_id, user_id, callback
  31. _sanitizeData: (data) ->
  32. return {
  33. provider: data.provider
  34. url: UrlHelper.prependHttpIfNeeded(data.url)
  35. }
  36. _getUrlStream: (project_id, data, current_user_id, callback = (error, fsPath) ->) ->
  37. callback = _.once(callback)
  38. url = data.url
  39. if !urlValidator.isWebUri(url)
  40. return callback(new InvalidUrlError("invalid url: #{url}"))
  41. url = UrlHelper.wrapUrlWithProxy(url)
  42. readStream = request.get(url)
  43. readStream.pause()
  44. callback(null, readStream)
  45. }