ProjectDuplicator.coffee 4.0 KB

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