LinkedFilesController.coffee 3.4 KB

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