ProjectDuplicator.coffee 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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. Project = require("../../models/Project").Project
  8. _ = require('underscore')
  9. async = require('async')
  10. module.exports =
  11. duplicate: (owner, originalProjectId, newProjectName, callback)->
  12. DocumentUpdaterHandler.flushProjectToMongo originalProjectId, (err) ->
  13. return callback(err) if err?
  14. Project.findById originalProjectId, (err, originalProject) ->
  15. return callback(err) if err?
  16. projectCreationHandler.createBlankProject owner._id, newProjectName, (err, newProject)->
  17. return callback(err) if err?
  18. projectLocator.findRootDoc {project:originalProject}, (err, originalRootDoc)->
  19. return callback(err) if err?
  20. DocstoreManager.getAllDocs originalProjectId, (err, docContentsArray) ->
  21. return callback(err) if err?
  22. docContents = {}
  23. for docContent in docContentsArray
  24. docContents[docContent._id] = docContent
  25. projectOptionsHandler.setCompiler newProject._id, originalProject.compiler
  26. setRootDoc = _.once (doc_id)->
  27. projectEntityHandler.setRootDoc newProject, doc_id
  28. copyDocs = (originalFolder, newParentFolder, callback)->
  29. jobs = originalFolder.docs.map (doc)->
  30. return (callback)->
  31. content = docContents[doc._id.toString()]
  32. return callback(new Error("doc_id not found: #{doc._id}")) if !content?
  33. projectEntityHandler.addDoc newProject._id, newParentFolder._id, doc.name, content.lines, (err, newDoc)->
  34. if originalRootDoc? and newDoc.name == originalRootDoc.name
  35. setRootDoc newDoc._id
  36. callback()
  37. async.series jobs, callback
  38. copyFiles = (originalFolder, newParentFolder, callback)->
  39. jobs = originalFolder.fileRefs.map (file)->
  40. return (callback)->
  41. projectEntityHandler.copyFileFromExistingProject newProject, newParentFolder._id, originalProject._id, file, callback
  42. async.parallelLimit jobs, 5, callback
  43. copyFolder = (folder, desFolder, callback)->
  44. jobs = folder.folders.map (childFolder)->
  45. return (callback)->
  46. projectEntityHandler.addFolder newProject, desFolder._id, childFolder.name, (err, newFolder)->
  47. copyFolder childFolder, newFolder, callback
  48. jobs.push (cb)->
  49. copyDocs folder, desFolder, cb
  50. jobs.push (cb)->
  51. copyFiles folder, desFolder, cb
  52. async.series jobs, callback
  53. copyFolder originalProject.rootFolder[0], newProject.rootFolder[0], ->
  54. callback(err, newProject)