ProjectDuplicator.coffee 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. projectCreationHandler = require('./ProjectCreationHandler')
  2. projectEntityHandler = require('./ProjectEntityHandler')
  3. projectLocator = require('./ProjectLocator')
  4. projectOptionsHandler = require('./ProjectOptionsHandler')
  5. DocumentUpdaterHandler = require("../DocumentUpdater/DocumentUpdaterHandler")
  6. DocstoreManager = require "../Docstore/DocstoreManager"
  7. ProjectGetter = require("./ProjectGetter")
  8. _ = require('underscore')
  9. async = require('async')
  10. logger = require("logger-sharelatex")
  11. module.exports = ProjectDuplicator =
  12. _copyDocs: (newProject, originalRootDoc, originalFolder, desFolder, docContents, callback)->
  13. setRootDoc = _.once (doc_id)->
  14. projectEntityHandler.setRootDoc newProject._id, doc_id
  15. docs = originalFolder.docs or []
  16. jobs = docs.map (doc)->
  17. return (cb)->
  18. if !doc?._id?
  19. return callback()
  20. content = docContents[doc._id.toString()]
  21. projectEntityHandler.addDocWithProject newProject, desFolder._id, doc.name, content.lines, (err, newDoc)->
  22. if err?
  23. logger.err err:err, "error copying doc"
  24. return callback(err)
  25. if originalRootDoc? and newDoc.name == originalRootDoc.name
  26. setRootDoc newDoc._id
  27. cb()
  28. async.series jobs, callback
  29. _copyFiles: (newProject, originalProject_id, originalFolder, desFolder, callback)->
  30. fileRefs = originalFolder.fileRefs or []
  31. jobs = fileRefs.map (file)->
  32. return (cb)->
  33. projectEntityHandler.copyFileFromExistingProjectWithProject newProject, desFolder._id, originalProject_id, file, cb
  34. async.parallelLimit jobs, 5, callback
  35. _copyFolderRecursivly: (newProject_id, originalProject_id, originalRootDoc, originalFolder, desFolder, docContents, callback)->
  36. ProjectGetter.getProject newProject_id, {rootFolder:true, name:true}, (err, newProject)->
  37. if err?
  38. logger.err project_id:newProject_id, "could not get project"
  39. return callback(err)
  40. folders = originalFolder.folders or []
  41. jobs = folders.map (childFolder)->
  42. return (cb)->
  43. if !childFolder?._id?
  44. return cb()
  45. projectEntityHandler.addFolderWithProject newProject, desFolder?._id, childFolder.name, (err, newFolder)->
  46. return cb(err) if err?
  47. ProjectDuplicator._copyFolderRecursivly newProject_id, originalProject_id, originalRootDoc, childFolder, newFolder, docContents, cb
  48. jobs.push (cb)->
  49. ProjectDuplicator._copyFiles newProject, originalProject_id, originalFolder, desFolder, cb
  50. jobs.push (cb)->
  51. ProjectDuplicator._copyDocs newProject, originalRootDoc, originalFolder, desFolder, docContents, cb
  52. async.series jobs, callback
  53. duplicate: (owner, originalProject_id, newProjectName, callback)->
  54. jobs =
  55. flush: (cb)->
  56. DocumentUpdaterHandler.flushProjectToMongo originalProject_id, cb
  57. originalProject: (cb)->
  58. ProjectGetter.getProject originalProject_id, {compiler:true, rootFolder:true, rootDoc_id:true}, cb
  59. newProject: (cb)->
  60. projectCreationHandler.createBlankProject owner._id, newProjectName, cb
  61. originalRootDoc: (cb)->
  62. projectLocator.findRootDoc {project_id:originalProject_id}, cb
  63. docContentsArray: (cb)->
  64. DocstoreManager.getAllDocs originalProject_id, cb
  65. async.series jobs, (err, results)->
  66. if err?
  67. logger.err err:err, originalProject_id:originalProject_id, "error duplicating project"
  68. return callback(err)
  69. {originalProject, newProject, originalRootDoc, docContentsArray} = results
  70. originalRootDoc = originalRootDoc?[0]
  71. docContents = {}
  72. for docContent in docContentsArray
  73. docContents[docContent._id] = docContent
  74. projectOptionsHandler.setCompiler newProject._id, originalProject.compiler, ->
  75. ProjectDuplicator._copyFolderRecursivly newProject._id, originalProject_id, originalRootDoc, originalProject.rootFolder[0], newProject.rootFolder[0], docContents, ->
  76. if err?
  77. logger.err err:err, originalProject_id:originalProject_id, newProjectName:newProjectName, "error cloning project"
  78. callback(err, newProject)