FileStoreHandler.coffee 3.0 KB

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