ProjectEntityHandler.coffee 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. _ = require('underscore')
  2. async = require "async"
  3. path = require "path"
  4. logger = require('logger-sharelatex')
  5. DocstoreManager = require "../Docstore/DocstoreManager"
  6. DocumentUpdaterHandler = require('../../Features/DocumentUpdater/DocumentUpdaterHandler')
  7. Errors = require '../Errors/Errors'
  8. Project = require('../../models/Project').Project
  9. ProjectGetter = require "./ProjectGetter"
  10. TpdsUpdateSender = require('../ThirdPartyDataStore/TpdsUpdateSender')
  11. module.exports = ProjectEntityHandler = self =
  12. getAllDocs: (project_id, callback) ->
  13. logger.log project_id:project_id, "getting all docs for project"
  14. # We get the path and name info from the project, and the lines and
  15. # version info from the doc store.
  16. DocstoreManager.getAllDocs project_id, (error, docContentsArray) ->
  17. return callback(error) if error?
  18. # Turn array from docstore into a dictionary based on doc id
  19. docContents = {}
  20. for docContent in docContentsArray
  21. docContents[docContent._id] = docContent
  22. self._getAllFolders project_id, (error, folders = {}) ->
  23. return callback(error) if error?
  24. docs = {}
  25. for folderPath, folder of folders
  26. for doc in (folder.docs or [])
  27. content = docContents[doc._id.toString()]
  28. if content?
  29. docs[path.join(folderPath, doc.name)] = {
  30. _id: doc._id
  31. name: doc.name
  32. lines: content.lines
  33. rev: content.rev
  34. }
  35. logger.log count:_.keys(docs).length, project_id:project_id, "returning docs for project"
  36. callback null, docs
  37. getAllFiles: (project_id, callback) ->
  38. logger.log project_id:project_id, "getting all files for project"
  39. self._getAllFolders project_id, (err, folders = {}) ->
  40. return callback(err) if err?
  41. files = {}
  42. for folderPath, folder of folders
  43. for file in (folder.fileRefs or [])
  44. if file?
  45. files[path.join(folderPath, file.name)] = file
  46. callback null, files
  47. getAllEntities: (project_id, callback) ->
  48. ProjectGetter.getProject project_id, (err, project) ->
  49. return callback(err) if err?
  50. self.getAllEntitiesFromProject project, callback
  51. getAllEntitiesFromProject: (project, callback) ->
  52. logger.log project:project, "getting all entities for project"
  53. self._getAllFoldersFromProject project, (err, folders = {}) ->
  54. return callback(err) if err?
  55. docs = []
  56. files = []
  57. for folderPath, folder of folders
  58. for doc in (folder.docs or [])
  59. if doc?
  60. docs.push({path: path.join(folderPath, doc.name), doc:doc})
  61. for file in (folder.fileRefs or [])
  62. if file?
  63. files.push({path: path.join(folderPath, file.name), file:file})
  64. callback null, docs, files
  65. getAllDocPathsFromProjectById: (project_id, callback) ->
  66. ProjectGetter.getProjectWithoutDocLines project_id, (err, project) ->
  67. return callback(err) if err?
  68. return callback(Errors.NotFoundError("no project")) if !project?
  69. self.getAllDocPathsFromProject project, callback
  70. getAllDocPathsFromProject: (project, callback) ->
  71. logger.log project:project, "getting all docs for project"
  72. self._getAllFoldersFromProject project, (err, folders = {}) ->
  73. return callback(err) if err?
  74. docPath = {}
  75. for folderPath, folder of folders
  76. for doc in (folder.docs or [])
  77. docPath[doc._id] = path.join(folderPath, doc.name)
  78. logger.log count:_.keys(docPath).length, project_id:project._id, "returning docPaths for project"
  79. callback null, docPath
  80. flushProjectToThirdPartyDataStore: (project_id, callback) ->
  81. logger.log project_id:project_id, "flushing project to tpds"
  82. DocumentUpdaterHandler.flushProjectToMongo project_id, (error) ->
  83. return callback(error) if error?
  84. ProjectGetter.getProject project_id, {name:true}, (error, project) ->
  85. return callback(error) if error?
  86. requests = []
  87. self.getAllDocs project_id, (error, docs) ->
  88. return callback(error) if error?
  89. for docPath, doc of docs
  90. do (docPath, doc) ->
  91. requests.push (cb) ->
  92. TpdsUpdateSender.addDoc {project_id:project_id, doc_id:doc._id, path:docPath, project_name:project.name, rev:doc.rev||0}, cb
  93. self.getAllFiles project_id, (error, files) ->
  94. return callback(error) if error?
  95. for filePath, file of files
  96. do (filePath, file) ->
  97. requests.push (cb) ->
  98. TpdsUpdateSender.addFile {project_id:project_id, file_id:file._id, path:filePath, project_name:project.name, rev:file.rev}, cb
  99. async.series requests, (err) ->
  100. logger.log project_id:project_id, "finished flushing project to tpds"
  101. callback(err)
  102. getDoc: (project_id, doc_id, options = {}, callback = (error, lines, rev) ->) ->
  103. if typeof(options) == "function"
  104. callback = options
  105. options = {}
  106. DocstoreManager.getDoc project_id, doc_id, options, callback
  107. _getAllFolders: (project_id, callback) ->
  108. logger.log project_id:project_id, "getting all folders for project"
  109. ProjectGetter.getProjectWithoutDocLines project_id, (err, project) ->
  110. return callback(err) if err?
  111. return callback(Errors.NotFoundError("no project")) if !project?
  112. self._getAllFoldersFromProject project, callback
  113. _getAllFoldersFromProject: (project, callback) ->
  114. folders = {}
  115. processFolder = (basePath, folder) ->
  116. folders[basePath] = folder
  117. for childFolder in (folder.folders or [])
  118. if childFolder.name?
  119. processFolder path.join(basePath, childFolder.name), childFolder
  120. processFolder "/", project.rootFolder[0]
  121. callback null, folders