ProjectDuplicator.coffee 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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 =
  12. duplicate: (owner, originalProjectId, newProjectName, callback)->
  13. DocumentUpdaterHandler.flushProjectToMongo originalProjectId, (err) ->
  14. return callback(err) if err?
  15. ProjectGetter.getProject originalProjectId, {compiler:true, rootFolder:true, rootDoc_id:true}, (err, originalProject) ->
  16. return callback(err) if err?
  17. projectCreationHandler.createBlankProject owner._id, newProjectName, (err, newProject)->
  18. return callback(err) if err?
  19. projectLocator.findRootDoc {project:originalProject}, (err, originalRootDoc)->
  20. return callback(err) if err?
  21. DocstoreManager.getAllDocs originalProjectId, (err, docContentsArray) ->
  22. return callback(err) if err?
  23. docContents = {}
  24. for docContent in docContentsArray
  25. docContents[docContent._id] = docContent
  26. projectOptionsHandler.setCompiler newProject._id, originalProject.compiler
  27. setRootDoc = _.once (doc_id)->
  28. projectEntityHandler.setRootDoc newProject, doc_id
  29. copyDocs = (originalFolder, newParentFolder, callback)->
  30. jobs = originalFolder.docs.map (doc)->
  31. return (callback)->
  32. content = docContents[doc._id.toString()]
  33. projectEntityHandler.addDocWithProject newProject, newParentFolder._id, doc.name, content.lines, (err, newDoc)->
  34. if err?
  35. logger.err err:err, originalProjectId:originalProjectId, newProjectName:newProjectName, "error adding doc"
  36. return callback(err)
  37. if originalRootDoc? and newDoc.name == originalRootDoc.name
  38. setRootDoc newDoc._id
  39. callback()
  40. async.series jobs, callback
  41. copyFiles = (originalFolder, newParentFolder, callback)->
  42. jobs = originalFolder.fileRefs.map (file)->
  43. return (callback)->
  44. projectEntityHandler.copyFileFromExistingProjectWithProject newProject, newParentFolder._id, originalProject._id, file, callback
  45. async.parallelLimit jobs, 5, callback
  46. copyFolder = (folder, desFolder, callback)->
  47. jobs = folder.folders.map (childFolder)->
  48. return (callback)->
  49. projectEntityHandler.addFolderWithProject newProject, desFolder._id, childFolder.name, (err, newFolder)->
  50. copyFolder childFolder, newFolder, callback
  51. jobs.push (cb)->
  52. copyDocs folder, desFolder, cb
  53. jobs.push (cb)->
  54. copyFiles folder, desFolder, cb
  55. async.series jobs, callback
  56. copyFolder originalProject.rootFolder[0], newProject.rootFolder[0], (err)->
  57. if err?
  58. logger.err err:err, originalProjectId:originalProjectId, newProjectName:newProjectName, "error cloning project"
  59. callback(err, newProject)