ProjectCreationHandler.coffee 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. logger = require('logger-sharelatex')
  2. async = require("async")
  3. metrics = require('metrics-sharelatex')
  4. Settings = require('settings-sharelatex')
  5. ObjectId = require('mongoose').Types.ObjectId
  6. Project = require('../../models/Project').Project
  7. Folder = require('../../models/Folder').Folder
  8. ProjectEntityUpdateHandler = require('./ProjectEntityUpdateHandler')
  9. ProjectDetailsHandler = require('./ProjectDetailsHandler')
  10. HistoryManager = require('../History/HistoryManager')
  11. User = require('../../models/User').User
  12. fs = require('fs')
  13. Path = require "path"
  14. _ = require "underscore"
  15. AnalyticsManger = require("../Analytics/AnalyticsManager")
  16. module.exports = ProjectCreationHandler =
  17. createBlankProject : (owner_id, projectName, attributes, callback = (error, project) ->)->
  18. metrics.inc("project-creation")
  19. if arguments.length == 3
  20. callback = attributes
  21. attributes = null
  22. ProjectDetailsHandler.validateProjectName projectName, (error) ->
  23. return callback(error) if error?
  24. logger.log owner_id:owner_id, projectName:projectName, "creating blank project"
  25. if attributes?
  26. ProjectCreationHandler._createBlankProject owner_id, projectName, attributes, (error, project) ->
  27. return callback(error) if error?
  28. AnalyticsManger.recordEvent(
  29. owner_id, 'project-imported', { projectId: project._id, attributes: attributes }
  30. )
  31. callback(error, project)
  32. else
  33. HistoryManager.initializeProject (error, history) ->
  34. return callback(error) if error?
  35. attributes = overleaf: history: id: history?.overleaf_id
  36. ProjectCreationHandler._createBlankProject owner_id, projectName, attributes, (error, project) ->
  37. return callback(error) if error?
  38. AnalyticsManger.recordEvent(
  39. owner_id, 'project-created', { projectId: project._id }
  40. )
  41. callback(error, project)
  42. _createBlankProject : (owner_id, projectName, attributes, callback = (error, project) ->)->
  43. rootFolder = new Folder {'name':'rootFolder'}
  44. attributes.owner_ref = new ObjectId(owner_id)
  45. attributes.name = projectName
  46. project = new Project attributes
  47. Object.assign(project, attributes)
  48. if Settings.apis?.project_history?.displayHistoryForNewProjects
  49. project.overleaf.history.display = true
  50. if Settings.currentImageName?
  51. # avoid clobbering any imageName already set in attributes (e.g. importedImageName)
  52. project.imageName ?= Settings.currentImageName
  53. project.rootFolder[0] = rootFolder
  54. User.findById owner_id, "ace.spellCheckLanguage", (err, user)->
  55. if user? # It's possible the owner_id is a UserStub
  56. project.spellCheckLanguage = user.ace.spellCheckLanguage
  57. project.save (err)->
  58. return callback(err) if err?
  59. callback err, project
  60. createProjectFromSnippet : (owner_id, projectName, docLines, callback = (error, project) ->)->
  61. @createBlankProject owner_id, projectName, (error, project)->
  62. return callback(error) if error?
  63. ProjectCreationHandler._createRootDoc project, owner_id, docLines, callback
  64. createBasicProject : (owner_id, projectName, callback = (error, project) ->)->
  65. self = @
  66. @createBlankProject owner_id, projectName, (error, project)->
  67. return callback(error) if error?
  68. self._buildTemplate "mainbasic.tex", owner_id, projectName, (error, docLines)->
  69. return callback(error) if error?
  70. ProjectCreationHandler._createRootDoc project, owner_id, docLines, callback
  71. createExampleProject: (owner_id, projectName, callback = (error, project) ->)->
  72. self = @
  73. @createBlankProject owner_id, projectName, (error, project)->
  74. return callback(error) if error?
  75. async.series [
  76. (callback) ->
  77. self._buildTemplate "main.tex", owner_id, projectName, (error, docLines)->
  78. return callback(error) if error?
  79. ProjectCreationHandler._createRootDoc project, owner_id, docLines, callback
  80. (callback) ->
  81. self._buildTemplate "references.bib", owner_id, projectName, (error, docLines)->
  82. return callback(error) if error?
  83. ProjectEntityUpdateHandler.addDoc project._id, project.rootFolder[0]._id, "references.bib", docLines, owner_id, (error, doc)->
  84. callback(error)
  85. (callback) ->
  86. universePath = Path.resolve(__dirname + "/../../../templates/project_files/universe.jpg")
  87. ProjectEntityUpdateHandler.addFile project._id, project.rootFolder[0]._id, "universe.jpg", universePath, null, owner_id, callback
  88. ], (error) ->
  89. callback(error, project)
  90. _createRootDoc: (project, owner_id, docLines, callback = (error, project) ->)->
  91. ProjectEntityUpdateHandler.addDoc project._id, project.rootFolder[0]._id, "main.tex", docLines, owner_id, (error, doc)->
  92. if error?
  93. logger.err err:error, "error adding root doc when creating project"
  94. return callback(error)
  95. ProjectEntityUpdateHandler.setRootDoc project._id, doc._id, (error) ->
  96. callback(error, project)
  97. _buildTemplate: (template_name, user_id, project_name, callback = (error, output) ->)->
  98. User.findById user_id, "first_name last_name", (error, user)->
  99. return callback(error) if error?
  100. monthNames = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]
  101. templatePath = Path.resolve(__dirname + "/../../../templates/project_files/#{template_name}")
  102. fs.readFile templatePath, (error, template) ->
  103. return callback(error) if error?
  104. data =
  105. project_name: project_name
  106. user: user
  107. year: new Date().getUTCFullYear()
  108. month: monthNames[new Date().getUTCMonth()]
  109. output = _.template(template.toString(), data)
  110. callback null, output.split("\n")
  111. metrics.timeAsyncMethod(
  112. ProjectCreationHandler, 'createBlankProject',
  113. 'mongo.ProjectCreationHandler',
  114. logger
  115. )