FileController.coffee 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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, "reciving 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. insertFile: (req, res)->
  41. metrics.inc "insertFile"
  42. {key, bucket} = req
  43. logger.log key:key, bucket:bucket, "reciving request to insert file"
  44. FileHandler.insertFile bucket, key, req, (err)->
  45. if err?
  46. logger.log err: err, key: key, bucket: bucket, "error inserting file"
  47. res.send 500
  48. else
  49. res.send 200
  50. copyFile: (req, res)->
  51. metrics.inc "copyFile"
  52. {key, bucket} = req
  53. oldProject_id = req.body.source.project_id
  54. oldFile_id = req.body.source.file_id
  55. logger.log key:key, bucket:bucket, oldProject_id:oldProject_id, oldFile_id:oldFile_id, "reciving request to copy file"
  56. PersistorManager.copyFile bucket, "#{oldProject_id}/#{oldFile_id}", key, (err)->
  57. if err?
  58. if err instanceof Errors.NotFoundError
  59. res.send 404
  60. else
  61. logger.log err:err, oldProject_id:oldProject_id, oldFile_id:oldFile_id, "something went wrong copying file"
  62. res.send 500
  63. else
  64. res.send 200
  65. deleteFile: (req, res)->
  66. metrics.inc "deleteFile"
  67. {key, bucket} = req
  68. logger.log key:key, bucket:bucket, "reciving request to delete file"
  69. FileHandler.deleteFile bucket, key, (err)->
  70. if err?
  71. logger.log err:err, key:key, bucket:bucket, "something went wrong deleting file"
  72. res.send 500
  73. else
  74. res.send 204
  75. _get_range: (header) ->
  76. parsed = parseRange(maxSizeInBytes, header)
  77. if parsed == -1 or parsed == -2 or parsed.type != 'bytes'
  78. null
  79. else
  80. range = parsed[0]
  81. {start: range.start, end: range.end}
  82. directorySize: (req, res)->
  83. metrics.inc "projectSize"
  84. {project_id, bucket} = req
  85. logger.log project_id:project_id, bucket:bucket, "reciving request to project size"
  86. FileHandler.getDirectorySize bucket, project_id, (err, size)->
  87. if err?
  88. logger.log err: err, project_id: project_id, bucket: bucket, "error inserting file"
  89. res.send 500
  90. else
  91. res.json {'total bytes' : size}