ProjectOutputFileAgent.coffee 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. FileWriter = require('../../infrastructure/FileWriter')
  2. AuthorizationManager = require('../Authorization/AuthorizationManager')
  3. ProjectGetter = require('../Project/ProjectGetter')
  4. FileWriter = require('../../infrastructure/FileWriter')
  5. Settings = require 'settings-sharelatex'
  6. CompileManager = require '../Compile/CompileManager'
  7. ClsiCookieManager = require '../Compile/ClsiCookieManager'
  8. ClsiManager = require '../Compile/ClsiManager'
  9. ProjectFileAgent = require './ProjectFileAgent'
  10. _ = require "underscore"
  11. request = require "request"
  12. OutputFileFetchFailedError = (message) ->
  13. error = new Error(message)
  14. error.name = 'OutputFileFetchFailedError'
  15. error.__proto__ = OutputFileFetchFailedError.prototype
  16. return error
  17. OutputFileFetchFailedError.prototype.__proto__ = Error.prototype
  18. module.exports = ProjectOutputFileAgent = {
  19. sanitizeData: (data) ->
  20. return {
  21. source_project_id: data.source_project_id,
  22. source_output_file_path: data.source_output_file_path
  23. }
  24. canCreate: ProjectFileAgent.canCreate
  25. _getSourceProject: ProjectFileAgent._getSourceProject
  26. decorateLinkedFileData: ProjectFileAgent.decorateLinkedFileData
  27. _validate: (data) ->
  28. return (
  29. (data.source_project_id? || data.v1_source_doc_id?) &&
  30. data.source_output_file_path?
  31. )
  32. checkAuth: (project_id, data, current_user_id, callback = (error, allowed)->) ->
  33. callback = _.once(callback)
  34. if !ProjectOutputFileAgent._validate(data)
  35. return callback(new BadDataError())
  36. @_getSourceProject data, (err, project) ->
  37. return callback(err) if err?
  38. AuthorizationManager.canUserReadProject current_user_id, project._id, null, (err, canRead) ->
  39. return callback(err) if err?
  40. callback(null, canRead)
  41. writeIncomingFileToDisk: (project_id, data, current_user_id, callback = (error, fsPath) ->) ->
  42. callback = _.once(callback)
  43. if !ProjectOutputFileAgent._validate(data)
  44. return callback(new BadDataError())
  45. { source_output_file_path } = data
  46. @_getSourceProject data, (err, project) ->
  47. return callback(err) if err?
  48. source_project_id = project._id
  49. CompileManager.compile source_project_id, null, {}, (err) ->
  50. return callback(err) if err?
  51. ClsiManager.getOutputFileStream source_project_id, source_output_file_path, (err, readStream) ->
  52. return callback(err) if err?
  53. readStream.pause()
  54. readStream.on "error", callback
  55. readStream.on "response", (response) ->
  56. if 200 <= response.statusCode < 300
  57. readStream.resume()
  58. FileWriter.writeStreamToDisk project_id, readStream, callback
  59. else
  60. error = new OutputFileFetchFailedError("Output file fetch failed: #{url}")
  61. error.statusCode = response.statusCode
  62. callback(error)
  63. handleError: (error, req, res, next) ->
  64. if error instanceof ProjectFileAgent.BadDataError
  65. res.status(400).send("The submitted data is not valid")
  66. else if error instanceof OutputFileFetchFailedError
  67. res.status(404).send("Could not get output file")
  68. else if error instanceof ProjectFileAgent.ProjectNotFoundError
  69. res.status(404).send("Project not found")
  70. else if error instanceof ProjectFileAgent.V1ProjectNotFoundError
  71. res.status(409).send(ProjectFileAgent._v1ProjectNotFoundMessage)
  72. else
  73. next(error)
  74. }