ProjectFileAgent.coffee 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. AuthorizationManager = require('../Authorization/AuthorizationManager')
  2. ProjectLocator = require('../Project/ProjectLocator')
  3. ProjectGetter = require('../Project/ProjectGetter')
  4. DocstoreManager = require('../Docstore/DocstoreManager')
  5. FileStoreHandler = require('../FileStore/FileStoreHandler')
  6. _ = require "underscore"
  7. Settings = require 'settings-sharelatex'
  8. LinkedFilesHandler = require './LinkedFilesHandler'
  9. {
  10. BadDataError,
  11. AccessDeniedError,
  12. BadEntityTypeError,
  13. SourceFileNotFoundError,
  14. ProjectNotFoundError,
  15. V1ProjectNotFoundError
  16. } = require './LinkedFilesErrors'
  17. module.exports = ProjectFileAgent = {
  18. createLinkedFile: (project_id, linkedFileData, name, parent_folder_id, user_id, callback) ->
  19. if !@_canCreate(linkedFileData)
  20. return callback(new AccessDeniedError())
  21. @_go(project_id, linkedFileData, name, parent_folder_id, user_id, callback)
  22. refreshLinkedFile: (project_id, linkedFileData, name, parent_folder_id, user_id, callback) ->
  23. @_go project_id, linkedFileData, name, parent_folder_id, user_id, callback
  24. _prepare: (project_id, linkedFileData, user_id, callback=(err, linkedFileData)->) ->
  25. @_checkAuth project_id, linkedFileData, user_id, (err, allowed) =>
  26. return callback(err) if err?
  27. return callback(new AccessDeniedError()) if !allowed
  28. if !@_validate(linkedFileData)
  29. return callback(new BadDataError())
  30. callback(null, linkedFileData)
  31. _go: (project_id, linkedFileData, name, parent_folder_id, user_id, callback) ->
  32. linkedFileData = @_sanitizeData(linkedFileData)
  33. @_prepare project_id, linkedFileData, user_id, (err, linkedFileData) =>
  34. return callback(err) if err?
  35. if !@_validate(linkedFileData)
  36. return callback(new BadDataError())
  37. @_getEntity linkedFileData, user_id, (err, source_project, entity, type) =>
  38. return callback(err) if err?
  39. if type == 'doc'
  40. DocstoreManager.getDoc source_project._id, entity._id, (err, lines) ->
  41. return callback(err) if err?
  42. LinkedFilesHandler.importContent project_id,
  43. lines.join('\n'),
  44. linkedFileData,
  45. name,
  46. parent_folder_id,
  47. user_id,
  48. (err, file) ->
  49. return callback(err) if err?
  50. callback(null, file._id) # Created
  51. else if type == 'file'
  52. FileStoreHandler.getFileStream source_project._id, entity._id, null, (err, fileStream) ->
  53. return callback(err) if err?
  54. LinkedFilesHandler.importFromStream project_id,
  55. fileStream,
  56. linkedFileData,
  57. name,
  58. parent_folder_id,
  59. user_id,
  60. (err, file) ->
  61. return callback(err) if err?
  62. callback(null, file._id) # Created
  63. else
  64. callback(new BadEntityTypeError())
  65. _getEntity:
  66. (linkedFileData, current_user_id, callback = (err, entity, type) ->) ->
  67. callback = _.once(callback)
  68. { source_entity_path } = linkedFileData
  69. @_getSourceProject linkedFileData, (err, project) ->
  70. return callback(err) if err?
  71. source_project_id = project._id
  72. ProjectLocator.findElementByPath {
  73. project_id: source_project_id,
  74. path: source_entity_path
  75. }, (err, entity, type) ->
  76. if err?
  77. if /^not found.*/.test(err.toString())
  78. err = new SourceFileNotFoundError()
  79. return callback(err)
  80. callback(null, project, entity, type)
  81. _sanitizeData: (data) ->
  82. return _.pick(
  83. data,
  84. 'provider',
  85. 'source_project_id',
  86. 'v1_source_doc_id',
  87. 'source_entity_path'
  88. )
  89. _validate: (data) ->
  90. return (
  91. (data.source_project_id? || data.v1_source_doc_id?) &&
  92. data.source_entity_path?
  93. )
  94. _canCreate: (data) ->
  95. # Don't allow creation of linked-files with v1 doc ids
  96. !data.v1_source_doc_id?
  97. _getSourceProject: LinkedFilesHandler.getSourceProject
  98. _checkAuth: (project_id, data, current_user_id, callback = (error, allowed)->) ->
  99. callback = _.once(callback)
  100. if !ProjectFileAgent._validate(data)
  101. return callback(new BadDataError())
  102. @_getSourceProject data, (err, project) ->
  103. return callback(err) if err?
  104. AuthorizationManager.canUserReadProject current_user_id, project._id, null, (err, canRead) ->
  105. return callback(err) if err?
  106. callback(null, canRead)
  107. }