LinkedFilesController.coffee 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. AuthenticationController = require '../Authentication/AuthenticationController'
  2. EditorController = require '../Editor/EditorController'
  3. ProjectLocator = require '../Project/ProjectLocator'
  4. Settings = require 'settings-sharelatex'
  5. logger = require 'logger-sharelatex'
  6. _ = require 'underscore'
  7. module.exports = LinkedFilesController = {
  8. Agents: {
  9. url: require('./UrlAgent'),
  10. project_file: require('./ProjectFileAgent'),
  11. project_output_file: require('./ProjectOutputFileAgent')
  12. }
  13. _getAgent: (provider) ->
  14. if !LinkedFilesController.Agents.hasOwnProperty(provider)
  15. return null
  16. unless provider in Settings.enabledLinkedFileTypes
  17. return null
  18. LinkedFilesController.Agents[provider]
  19. _getFileById: (project_id, file_id, callback=(err, file)->) ->
  20. ProjectLocator.findElement {
  21. project_id,
  22. element_id: file_id,
  23. type: 'file'
  24. }, (err, file, path, parentFolder) ->
  25. return callback(err) if err?
  26. callback(null, file, path, parentFolder)
  27. createLinkedFile: (req, res, next) ->
  28. {project_id} = req.params
  29. {name, provider, data, parent_folder_id} = req.body
  30. user_id = AuthenticationController.getLoggedInUserId(req)
  31. logger.log {project_id, name, provider, data, parent_folder_id, user_id}, 'create linked file request'
  32. Agent = LinkedFilesController._getAgent(provider)
  33. if !Agent?
  34. return res.sendStatus(400)
  35. linkedFileData = Agent.sanitizeData(data)
  36. linkedFileData.provider = provider
  37. if !Agent.canCreate(linkedFileData)
  38. return res.status(403).send('Cannot create linked file')
  39. LinkedFilesController._doImport(
  40. req, res, next, Agent, project_id, user_id,
  41. parent_folder_id, name, linkedFileData
  42. )
  43. refreshLinkedFile: (req, res, next) ->
  44. {project_id, file_id} = req.params
  45. user_id = AuthenticationController.getLoggedInUserId(req)
  46. logger.log {project_id, file_id, user_id}, 'refresh linked file request'
  47. LinkedFilesController._getFileById project_id, file_id, (err, file, path, parentFolder) ->
  48. return next(err) if err?
  49. return res.sendStatus(404) if !file?
  50. name = file.name
  51. linkedFileData = file.linkedFileData
  52. if !linkedFileData? || !linkedFileData?.provider?
  53. return res.send(409)
  54. provider = linkedFileData.provider
  55. parent_folder_id = parentFolder._id
  56. Agent = LinkedFilesController._getAgent(provider)
  57. if !Agent?
  58. return res.sendStatus(400)
  59. LinkedFilesController._doImport(
  60. req, res, next, Agent, project_id, user_id,
  61. parent_folder_id, name, linkedFileData
  62. )
  63. _doImport: (req, res, next, Agent, project_id, user_id, parent_folder_id, name, linkedFileData) ->
  64. Agent.checkAuth project_id, linkedFileData, user_id, (err, allowed) ->
  65. return Agent.handleError(err, req, res, next) if err?
  66. return res.sendStatus(403) if !allowed
  67. Agent.decorateLinkedFileData linkedFileData, (err, newLinkedFileData) ->
  68. return Agent.handleError(err) if err?
  69. linkedFileData = newLinkedFileData
  70. Agent.writeIncomingFileToDisk project_id,
  71. linkedFileData,
  72. user_id,
  73. (error, fsPath) ->
  74. if error?
  75. logger.error(
  76. {err: error, project_id, name, linkedFileData, parent_folder_id, user_id},
  77. 'error writing linked file to disk'
  78. )
  79. return Agent.handleError(error, req, res, next)
  80. EditorController.upsertFile project_id,
  81. parent_folder_id,
  82. name,
  83. fsPath,
  84. linkedFileData,
  85. "upload",
  86. user_id,
  87. (error, file) ->
  88. return next(error) if error?
  89. res.json(new_file_id: file._id) # created
  90. }