FileStoreHandler.coffee 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. readStream = request(opts)
  41. readStream.on "error", (err) ->
  42. logger.err {err, project_id, file_id, query}, "error in file stream"
  43. return callback(err)
  44. callback(null, readStream)
  45. deleteFile: (project_id, file_id, callback)->
  46. logger.log project_id:project_id, file_id:file_id, "telling file store to delete file"
  47. opts =
  48. method : "delete"
  49. uri: @_buildUrl(project_id, file_id)
  50. timeout:fiveMinsInMs
  51. request opts, (err, response)->
  52. if err?
  53. logger.err err:err, project_id:project_id, file_id:file_id, "something went wrong deleting file from filestore"
  54. callback(err)
  55. copyFile: (oldProject_id, oldFile_id, newProject_id, newFile_id, callback)->
  56. logger.log oldProject_id:oldProject_id, oldFile_id:oldFile_id, newProject_id:newProject_id, newFile_id:newFile_id, "telling filestore to copy a file"
  57. opts =
  58. method : "put"
  59. json:
  60. source:
  61. project_id:oldProject_id
  62. file_id:oldFile_id
  63. uri: @_buildUrl(newProject_id, newFile_id)
  64. timeout:fiveMinsInMs
  65. request opts, (err)->
  66. if err?
  67. 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"
  68. callback(err)
  69. _buildUrl: (project_id, file_id)->
  70. return "#{settings.apis.filestore.url}/project/#{project_id}/file/#{file_id}"