FileStoreHandler.coffee 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. logger = require("logger-sharelatex")
  2. fs = require("fs")
  3. request = require("request")
  4. settings = require("settings-sharelatex")
  5. oneMinInMs = 60 * 1000
  6. fiveMinsInMs = oneMinInMs * 5
  7. module.exports = FileStoreHandler =
  8. uploadFileFromDisk: (project_id, file_id, fsPath, callback)->
  9. fs.lstat fsPath, (err, stat)->
  10. if err?
  11. logger.err err:err, project_id:project_id, file_id:file_id, fsPath:fsPath, "error stating file"
  12. callback(err)
  13. if !stat.isFile()
  14. logger.log project_id:project_id, file_id:file_id, fsPath:fsPath, "tried to upload symlink, not contining"
  15. return callback(new Error("can not upload symlink"))
  16. logger.log project_id:project_id, file_id:file_id, fsPath:fsPath, "uploading file from disk"
  17. readStream = fs.createReadStream(fsPath)
  18. opts =
  19. method: "post"
  20. uri: FileStoreHandler._buildUrl(project_id, file_id)
  21. timeout:fiveMinsInMs
  22. writeStream = request(opts)
  23. readStream.pipe writeStream
  24. writeStream.on "end", callback
  25. readStream.on "error", (err)->
  26. logger.err err:err, project_id:project_id, file_id:file_id, fsPath:fsPath, "something went wrong on the read stream of uploadFileFromDisk"
  27. callback err
  28. writeStream.on "error", (err)->
  29. logger.err err:err, project_id:project_id, file_id:file_id, fsPath:fsPath, "something went wrong on the write stream of uploadFileFromDisk"
  30. callback err
  31. getFileStream: (project_id, file_id, query, callback)->
  32. logger.log project_id:project_id, file_id:file_id, query:query, "getting file stream from file store"
  33. queryString = ""
  34. if query? and query["format"]?
  35. queryString = "?format=#{query['format']}"
  36. opts =
  37. method : "get"
  38. uri: "#{@_buildUrl(project_id, file_id)}#{queryString}"
  39. timeout:fiveMinsInMs
  40. headers: {}
  41. if query? and query['range']?
  42. rangeText = query['range']
  43. if rangeText && rangeText.match? && rangeText.match(/\d+-\d+/)
  44. opts.headers['range'] = "bytes=#{query['range']}"
  45. readStream = request(opts)
  46. readStream.on "error", (err) ->
  47. logger.err {err, project_id, file_id, query}, "error in file stream"
  48. callback(null, readStream)
  49. deleteFile: (project_id, file_id, callback)->
  50. logger.log project_id:project_id, file_id:file_id, "telling file store to delete file"
  51. opts =
  52. method : "delete"
  53. uri: @_buildUrl(project_id, file_id)
  54. timeout:fiveMinsInMs
  55. request opts, (err, response)->
  56. if err?
  57. logger.err err:err, project_id:project_id, file_id:file_id, "something went wrong deleting file from filestore"
  58. callback(err)
  59. copyFile: (oldProject_id, oldFile_id, newProject_id, newFile_id, callback)->
  60. logger.log oldProject_id:oldProject_id, oldFile_id:oldFile_id, newProject_id:newProject_id, newFile_id:newFile_id, "telling filestore to copy a file"
  61. opts =
  62. method : "put"
  63. json:
  64. source:
  65. project_id:oldProject_id
  66. file_id:oldFile_id
  67. uri: @_buildUrl(newProject_id, newFile_id)
  68. timeout:fiveMinsInMs
  69. request opts, (err)->
  70. if err?
  71. logger.err err:err, oldProject_id:oldProject_id, oldFile_id:oldFile_id, newProject_id:newProject_id, newFile_id:newFile_id, "something went wrong telling filestore api to copy file"
  72. callback(err)
  73. _buildUrl: (project_id, file_id)->
  74. return "#{settings.apis.filestore.url}/project/#{project_id}/file/#{file_id}"