FileController.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. /* eslint-disable
  2. camelcase,
  3. no-unused-vars,
  4. */
  5. // TODO: This file was created by bulk-decaffeinate.
  6. // Fix any style issues and re-enable lint.
  7. /*
  8. * decaffeinate suggestions:
  9. * DS102: Remove unnecessary code created because of implicit returns
  10. * DS207: Consider shorter variations of null checks
  11. * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  12. */
  13. let FileController;
  14. const PersistorManager = require("./PersistorManager");
  15. const settings = require("settings-sharelatex");
  16. const logger = require("logger-sharelatex");
  17. const FileHandler = require("./FileHandler");
  18. const metrics = require("metrics-sharelatex");
  19. const parseRange = require('range-parser');
  20. const Errors = require('./Errors');
  21. const oneDayInSeconds = 60 * 60 * 24;
  22. const maxSizeInBytes = 1024 * 1024 * 1024; // 1GB
  23. module.exports = (FileController = {
  24. getFile(req, res){
  25. const {key, bucket} = req;
  26. const {format, style} = req.query;
  27. const options = {
  28. key,
  29. bucket,
  30. format,
  31. style,
  32. };
  33. metrics.inc("getFile");
  34. logger.log({key, bucket, format, style}, "receiving request to get file");
  35. if (req.headers.range != null) {
  36. const range = FileController._get_range(req.headers.range);
  37. options.start = range.start;
  38. options.end = range.end;
  39. logger.log({start: range.start, end: range.end}, "getting range of bytes from file");
  40. }
  41. return FileHandler.getFile(bucket, key, options, function(err, fileStream){
  42. if (err != null) {
  43. if (err instanceof Errors.NotFoundError) {
  44. return res.send(404);
  45. } else {
  46. logger.err({err, key, bucket, format, style}, "problem getting file");
  47. return res.send(500);
  48. }
  49. } else if (req.query.cacheWarm) {
  50. logger.log({key, bucket, format, style}, "request is only for cache warm so not sending stream");
  51. return res.send(200);
  52. } else {
  53. logger.log({key, bucket, format, style}, "sending file to response");
  54. return fileStream.pipe(res);
  55. }
  56. });
  57. },
  58. getFileHead(req, res) {
  59. const {key, bucket} = req;
  60. metrics.inc("getFileSize");
  61. logger.log({ key, bucket }, "receiving request to get file metadata");
  62. return FileHandler.getFileSize(bucket, key, function(err, fileSize) {
  63. if (err != null) {
  64. if (err instanceof Errors.NotFoundError) {
  65. res.status(404).end();
  66. } else {
  67. res.status(500).end();
  68. }
  69. return;
  70. }
  71. res.set("Content-Length", fileSize);
  72. return res.status(200).end();
  73. });
  74. },
  75. insertFile(req, res){
  76. metrics.inc("insertFile");
  77. const {key, bucket} = req;
  78. logger.log({key, bucket}, "receiving request to insert file");
  79. return FileHandler.insertFile(bucket, key, req, function(err){
  80. if (err != null) {
  81. logger.log({err, key, bucket}, "error inserting file");
  82. return res.send(500);
  83. } else {
  84. return res.send(200);
  85. }
  86. });
  87. },
  88. copyFile(req, res){
  89. metrics.inc("copyFile");
  90. const {key, bucket} = req;
  91. const oldProject_id = req.body.source.project_id;
  92. const oldFile_id = req.body.source.file_id;
  93. logger.log({key, bucket, oldProject_id, oldFile_id}, "receiving request to copy file");
  94. return PersistorManager.copyFile(bucket, `${oldProject_id}/${oldFile_id}`, key, function(err){
  95. if (err != null) {
  96. if (err instanceof Errors.NotFoundError) {
  97. return res.send(404);
  98. } else {
  99. logger.log({err, oldProject_id, oldFile_id}, "something went wrong copying file");
  100. return res.send(500);
  101. }
  102. } else {
  103. return res.send(200);
  104. }
  105. });
  106. },
  107. deleteFile(req, res){
  108. metrics.inc("deleteFile");
  109. const {key, bucket} = req;
  110. logger.log({key, bucket}, "receiving request to delete file");
  111. return FileHandler.deleteFile(bucket, key, function(err){
  112. if (err != null) {
  113. logger.log({err, key, bucket}, "something went wrong deleting file");
  114. return res.send(500);
  115. } else {
  116. return res.send(204);
  117. }
  118. });
  119. },
  120. _get_range(header) {
  121. const parsed = parseRange(maxSizeInBytes, header);
  122. if ((parsed === -1) || (parsed === -2) || (parsed.type !== 'bytes')) {
  123. return null;
  124. } else {
  125. const range = parsed[0];
  126. return {start: range.start, end: range.end};
  127. }
  128. },
  129. directorySize(req, res){
  130. metrics.inc("projectSize");
  131. const {project_id, bucket} = req;
  132. logger.log({project_id, bucket}, "receiving request to project size");
  133. return FileHandler.getDirectorySize(bucket, project_id, function(err, size){
  134. if (err != null) {
  135. logger.log({err, project_id, bucket}, "error inserting file");
  136. return res.send(500);
  137. } else {
  138. return res.json({'total bytes' : size});
  139. }
  140. });
  141. }
  142. });