ProjectFileAgent.coffee 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. FileWriter = require('../../infrastructure/FileWriter')
  2. AuthorizationManager = require('../Authorization/AuthorizationManager')
  3. ProjectLocator = require('../Project/ProjectLocator')
  4. DocstoreManager = require('../Docstore/DocstoreManager')
  5. FileStoreHandler = require('../FileStore/FileStoreHandler')
  6. FileWriter = require('../../infrastructure/FileWriter')
  7. _ = require "underscore"
  8. Settings = require 'settings-sharelatex'
  9. AccessDeniedError = (message) ->
  10. error = new Error(message)
  11. error.name = 'AccessDenied'
  12. error.__proto__ = AccessDeniedError.prototype
  13. return error
  14. AccessDeniedError.prototype.__proto__ = Error.prototype
  15. BadEntityTypeError = (message) ->
  16. error = new Error(message)
  17. error.name = 'BadEntityType'
  18. error.__proto__ = BadEntityTypeError.prototype
  19. return error
  20. BadEntityTypeError.prototype.__proto__ = Error.prototype
  21. module.exports = ProjectFileAgent =
  22. sanitizeData: (data) ->
  23. # TODO:
  24. # - Nothing?
  25. return data
  26. writeIncomingFileToDisk:
  27. (project_id, data, current_user_id, callback = (error, fsPath) ->) ->
  28. callback = _.once(callback)
  29. {source_project_id, source_entity_path} = data
  30. AuthorizationManager.canUserReadProject current_user_id, source_project_id,
  31. null, (err, canRead) ->
  32. return callback(err) if err?
  33. return callback(new AccessDeniedError()) if !canRead
  34. ProjectLocator.findElementByPath {
  35. project_id: source_project_id,
  36. path: source_entity_path
  37. }, (err, entity, type) ->
  38. return callback(err) if err? # also applies when file not found
  39. ProjectFileAgent._writeEntityToDisk source_project_id, entity._id, type, callback
  40. _writeEntityToDisk: (project_id, entity_id, type, callback=(err, location)->) ->
  41. callback = _.once(callback)
  42. if type == 'doc'
  43. DocstoreManager.getDoc project_id, entity_id, (err, lines) ->
  44. return callback(err) if err?
  45. FileWriter.writeLinesToDisk entity_id, lines, callback
  46. else if type == 'file'
  47. FileStoreHandler.getFileStream project_id, entity_id, (err, fileStream) ->
  48. return callback(err) if err?
  49. FileWriter.writeStreamToDisk entity_id, fileStream, callback
  50. else
  51. callback(new BadEntityTypeError())
  52. handleError: (error, req, res, next) ->
  53. if error instanceof AccessDeniedError
  54. res.status(403).send("You do not have access to this project")
  55. else if error instanceof FileNotFoundError
  56. res.status(404).send("The file does not exist")
  57. else if error instanceof BadEntityTypeError
  58. res.status(404).send("The file is the wrong type") # TODO: better error message
  59. else
  60. next(error)
  61. next()