ProjectFileAgent.coffee 4.2 KB

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