ProjectDuplicator.coffee 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. jobs = originalFolder.docs.map (doc)->
  16. return (cb)->
  17. content = docContents[doc._id.toString()]
  18. projectEntityHandler.addDocWithProject newProject, desFolder._id, doc.name, content.lines, (err, newDoc)->
  19. if err?
  20. logger.err err:err, "error copying doc"
  21. return callback(err)
  22. if originalRootDoc? and newDoc.name == originalRootDoc.name
  23. setRootDoc newDoc._id
  24. cb()
  25. async.series jobs, callback
  26. _copyFiles: (newProject, originalProject_id, originalFolder, desFolder, callback)->
  27. jobs = originalFolder.fileRefs.map (file)->
  28. return (cb)->
  29. projectEntityHandler.copyFileFromExistingProjectWithProject newProject, desFolder._id, originalProject_id, file, cb
  30. async.parallelLimit jobs, 5, callback
  31. _copyFolderRecursivly: (newProject_id, originalProject_id, originalRootDoc, originalFolder, desFolder, docContents, callback)->
  32. ProjectGetter.getProject newProject_id, {rootFolder:true, name:true}, (err, newProject)->
  33. if err?
  34. logger.err project_id:newProject_id, "could not get project"
  35. return cb(err)
  36. jobs = originalFolder.folders.map (childFolder)->
  37. return (cb)->
  38. projectEntityHandler.addFolderWithProject newProject, desFolder?._id, childFolder.name, (err, newFolder)->
  39. return cb(err) if err?
  40. ProjectDuplicator._copyFolderRecursivly newProject_id, originalProject_id, originalRootDoc, childFolder, newFolder, docContents, cb
  41. jobs.push (cb)->
  42. ProjectDuplicator._copyFiles newProject, originalProject_id, originalFolder, desFolder, cb
  43. jobs.push (cb)->
  44. ProjectDuplicator._copyDocs newProject, originalRootDoc, originalFolder, desFolder, docContents, cb
  45. async.series jobs, callback
  46. duplicate: (owner, originalProject_id, newProjectName, callback)->
  47. jobs =
  48. flush: (cb)->
  49. DocumentUpdaterHandler.flushProjectToMongo originalProject_id, cb
  50. originalProject: (cb)->
  51. ProjectGetter.getProject originalProject_id, {compiler:true, rootFolder:true, rootDoc_id:true}, cb
  52. newProject: (cb)->
  53. projectCreationHandler.createBlankProject owner._id, newProjectName, cb
  54. originalRootDoc: (cb)->
  55. projectLocator.findRootDoc {project_id:originalProject_id}, cb
  56. docContentsArray: (cb)->
  57. DocstoreManager.getAllDocs originalProject_id, cb
  58. async.series jobs, (err, results)->
  59. if err?
  60. logger.err err:err, originalProject_id:originalProject_id, "error duplicating project"
  61. return callback(err)
  62. {originalProject, newProject, originalRootDoc, docContentsArray} = results
  63. originalRootDoc = originalRootDoc?[0]
  64. docContents = {}
  65. for docContent in docContentsArray
  66. docContents[docContent._id] = docContent
  67. projectOptionsHandler.setCompiler newProject._id, originalProject.compiler, ->
  68. ProjectDuplicator._copyFolderRecursivly newProject._id, originalProject_id, originalRootDoc, originalProject.rootFolder[0], newProject.rootFolder[0], docContents, ->
  69. if err?
  70. logger.err err:err, originalProject_id:originalProject_id, newProjectName:newProjectName, "error cloning project"
  71. callback(err, newProject)