FileController.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. PersistorManager = require("./PersistorManager")
  2. settings = require("settings-sharelatex")
  3. logger = require("logger-sharelatex")
  4. FileHandler = require("./FileHandler")
  5. metrics = require("metrics-sharelatex")
  6. parseRange = require('range-parser')
  7. Errors = require('./Errors')
  8. oneDayInSeconds = 60 * 60 * 24
  9. maxSizeInBytes = 1024 * 1024 * 1024 # 1GB
  10. module.exports = FileController =
  11. getFile: (req, res)->
  12. {key, bucket} = req
  13. {format, style} = req.query
  14. options = {
  15. key: key,
  16. bucket: bucket,
  17. format: format,
  18. style: style,
  19. }
  20. metrics.inc "getFile"
  21. logger.log key:key, bucket:bucket, format:format, style: style, "receiving request to get file"
  22. if req.headers.range?
  23. range = FileController._get_range(req.headers.range)
  24. options.start = range.start
  25. options.end = range.end
  26. logger.log start: range.start, end: range.end, "getting range of bytes from file"
  27. FileHandler.getFile bucket, key, options, (err, fileStream)->
  28. if err?
  29. if err instanceof Errors.NotFoundError
  30. return res.send 404
  31. else
  32. logger.err err:err, key:key, bucket:bucket, format:format, style:style, "problem getting file"
  33. return res.send 500
  34. else if req.query.cacheWarm
  35. logger.log key:key, bucket:bucket, format:format, style:style, "request is only for cache warm so not sending stream"
  36. res.send 200
  37. else
  38. logger.log key:key, bucket:bucket, format:format, style:style, "sending file to response"
  39. fileStream.pipe res
  40. getFileHead: (req, res) ->
  41. {key, bucket} = req
  42. metrics.inc("getFileSize")
  43. logger.log({ key: key, bucket: bucket }, "receiving request to get file metadata")
  44. FileHandler.getFileSize bucket, key, (err, fileSize) ->
  45. if err?
  46. if err instanceof Errors.NotFoundError
  47. res.status(404).end()
  48. else
  49. res.status(500).end()
  50. return
  51. res.set("Content-Length", fileSize)
  52. res.status(200).end()
  53. insertFile: (req, res)->
  54. metrics.inc "insertFile"
  55. {key, bucket} = req
  56. logger.log key:key, bucket:bucket, "receiving request to insert file"
  57. FileHandler.insertFile bucket, key, req, (err)->
  58. if err?
  59. logger.log err: err, key: key, bucket: bucket, "error inserting file"
  60. res.send 500
  61. else
  62. res.send 200
  63. copyFile: (req, res)->
  64. metrics.inc "copyFile"
  65. {key, bucket} = req
  66. oldProject_id = req.body.source.project_id
  67. oldFile_id = req.body.source.file_id
  68. logger.log key:key, bucket:bucket, oldProject_id:oldProject_id, oldFile_id:oldFile_id, "receiving request to copy file"
  69. PersistorManager.copyFile bucket, "#{oldProject_id}/#{oldFile_id}", key, (err)->
  70. if err?
  71. if err instanceof Errors.NotFoundError
  72. res.send 404
  73. else
  74. logger.log err:err, oldProject_id:oldProject_id, oldFile_id:oldFile_id, "something went wrong copying file"
  75. res.send 500
  76. else
  77. res.send 200
  78. deleteFile: (req, res)->
  79. metrics.inc "deleteFile"
  80. {key, bucket} = req
  81. logger.log key:key, bucket:bucket, "receiving request to delete file"
  82. FileHandler.deleteFile bucket, key, (err)->
  83. if err?
  84. logger.log err:err, key:key, bucket:bucket, "something went wrong deleting file"
  85. res.send 500
  86. else
  87. res.send 204
  88. _get_range: (header) ->
  89. parsed = parseRange(maxSizeInBytes, header)
  90. if parsed == -1 or parsed == -2 or parsed.type != 'bytes'
  91. null
  92. else
  93. range = parsed[0]
  94. {start: range.start, end: range.end}
  95. directorySize: (req, res)->
  96. metrics.inc "projectSize"
  97. {project_id, bucket} = req
  98. logger.log project_id:project_id, bucket:bucket, "receiving request to project size"
  99. FileHandler.getDirectorySize bucket, project_id, (err, size)->
  100. if err?
  101. logger.log err: err, project_id: project_id, bucket: bucket, "error inserting file"
  102. res.send 500
  103. else
  104. res.json {'total bytes' : size}