ProjectDuplicator.coffee 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. projectCreationHandler = require('./ProjectCreationHandler')
  2. projectEntityHandler = require('./ProjectEntityHandler')
  3. projectLocator = require('./ProjectLocator')
  4. projectOptionsHandler = require('./ProjectOptionsHandler')
  5. DocumentUpdaterHandler = require("../DocumentUpdater/DocumentUpdaterHandler")
  6. Project = require("../../models/Project").Project
  7. _ = require('underscore')
  8. async = require('async')
  9. module.exports =
  10. duplicate: (owner, originalProjectId, newProjectName, callback)->
  11. DocumentUpdaterHandler.flushProjectToMongo originalProjectId, (err) ->
  12. return callback(err) if err?
  13. Project.findById originalProjectId, (err, originalProject) ->
  14. return callback(err) if err?
  15. projectCreationHandler.createBlankProject owner._id, newProjectName, (err, newProject)->
  16. return callback(err) if err?
  17. projectLocator.findRootDoc {project:originalProject}, (err, originalRootDoc)->
  18. projectOptionsHandler.setCompiler newProject._id, originalProject.compiler
  19. setRootDoc = _.once (doc_id)->
  20. projectEntityHandler.setRootDoc newProject, doc_id
  21. copyDocs = (originalFolder, newParentFolder, callback)->
  22. jobs = originalFolder.docs.map (doc)->
  23. return (callback)->
  24. projectEntityHandler.addDoc newProject, newParentFolder._id, doc.name, doc.lines, (err, newDoc)->
  25. if originalRootDoc? and newDoc.name == originalRootDoc.name
  26. setRootDoc newDoc._id
  27. callback()
  28. async.series jobs, callback
  29. copyFiles = (originalFolder, newParentFolder, callback)->
  30. jobs = originalFolder.fileRefs.map (file)->
  31. return (callback)->
  32. projectEntityHandler.copyFileFromExistingProject newProject, newParentFolder._id, originalProject._id, file, callback
  33. async.parallelLimit jobs, 5, callback
  34. copyFolder = (folder, desFolder, callback)->
  35. jobs = folder.folders.map (childFolder)->
  36. return (callback)->
  37. projectEntityHandler.addFolder newProject, desFolder._id, childFolder.name, (err, newFolder)->
  38. copyFolder childFolder, newFolder, callback
  39. jobs.push (cb)->
  40. copyDocs folder, desFolder, cb
  41. jobs.push (cb)->
  42. copyFiles folder, desFolder, cb
  43. async.series jobs, callback
  44. copyFolder originalProject.rootFolder[0], newProject.rootFolder[0], ->
  45. callback(err, newProject)