ProjectOutputFileAgent.coffee 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. CompileController = require '../Compile/CompileController'
  8. ClsiCookieManager = require '../Compile/ClsiCookieManager'
  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. url = "#{Settings.apis.clsi.url}/project/#{source_project_id}/output/#{source_output_file_path}"
  52. ClsiCookieManager.getCookieJar source_project_id, (err, jar)->
  53. return callback(err) if err?
  54. oneMinute = 60 * 1000
  55. # the base request
  56. options = { url: url, method: "GET", timeout: oneMinute, jar : jar }
  57. readStream = request(options)
  58. readStream.on "error", callback
  59. readStream.on "response", (response) ->
  60. if 200 <= response.statusCode < 300
  61. FileWriter.writeStreamToDisk project_id, readStream, callback
  62. else
  63. error = new OutputFileFetchFailedError("Output file fetch failed: #{url}")
  64. error.statusCode = response.statusCode
  65. callback(error)
  66. handleError: (error, req, res, next) ->
  67. if error instanceof ProjectFileAgent.BadDataError
  68. res.status(400).send("The submitted data is not valid")
  69. else if error instanceof OutputFileFetchFailedError
  70. res.status(404).send("Could not get output file")
  71. else if error instanceof ProjectFileAgent.ProjectNotFoundError
  72. res.status(404).send("Project not found")
  73. else if error instanceof ProjectFileAgent.V1ProjectNotFoundError
  74. res.status(409).send(ProjectFileAgent._v1ProjectNotFoundMessage)
  75. else
  76. next(error)
  77. }