ProjectCreationHandler.coffee 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. ProjectEntityHandler = require('./ProjectEntityHandler')
  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. module.exports = ProjectCreationHandler =
  16. createBlankProject : (owner_id, projectName, projectHistoryId, callback = (error, project) ->)->
  17. metrics.inc("project-creation")
  18. if arguments.length == 3
  19. callback = projectHistoryId
  20. projectHistoryId = null
  21. ProjectDetailsHandler.validateProjectName projectName, (error) ->
  22. return callback(error) if error?
  23. logger.log owner_id:owner_id, projectName:projectName, "creating blank project"
  24. if projectHistoryId?
  25. ProjectCreationHandler._createBlankProject owner_id, projectName, projectHistoryId, callback
  26. else
  27. HistoryManager.initializeProject (error, history) ->
  28. return callback(error) if error?
  29. ProjectCreationHandler._createBlankProject owner_id, projectName, history?.overleaf_id, callback
  30. _createBlankProject : (owner_id, projectName, projectHistoryId, callback = (error, project) ->)->
  31. rootFolder = new Folder {'name':'rootFolder'}
  32. project = new Project
  33. owner_ref : new ObjectId(owner_id)
  34. name : projectName
  35. project.overleaf.history.id = projectHistoryId
  36. if Settings.apis?.project_history?.displayHistoryForNewProjects
  37. project.overleaf.history.display = true
  38. if Settings.currentImageName?
  39. project.imageName = Settings.currentImageName
  40. project.rootFolder[0] = rootFolder
  41. User.findById owner_id, "ace.spellCheckLanguage", (err, user)->
  42. project.spellCheckLanguage = user.ace.spellCheckLanguage
  43. project.save (err)->
  44. return callback(err) if err?
  45. callback err, project
  46. createBasicProject : (owner_id, projectName, callback = (error, project) ->)->
  47. self = @
  48. @createBlankProject owner_id, projectName, (error, project)->
  49. return callback(error) if error?
  50. self._buildTemplate "mainbasic.tex", owner_id, projectName, (error, docLines)->
  51. return callback(error) if error?
  52. ProjectEntityHandler.addDoc project._id, project.rootFolder[0]._id, "main.tex", docLines, owner_id, (error, doc)->
  53. if error?
  54. logger.err err:error, "error adding doc when creating basic project"
  55. return callback(error)
  56. ProjectEntityHandler.setRootDoc project._id, doc._id, (error) ->
  57. callback(error, project)
  58. createExampleProject: (owner_id, projectName, callback = (error, project) ->)->
  59. self = @
  60. @createBlankProject owner_id, projectName, (error, project)->
  61. return callback(error) if error?
  62. async.series [
  63. (callback) ->
  64. self._buildTemplate "main.tex", owner_id, projectName, (error, docLines)->
  65. return callback(error) if error?
  66. ProjectEntityHandler.addDoc project._id, project.rootFolder[0]._id, "main.tex", docLines, owner_id, (error, doc)->
  67. return callback(error) if error?
  68. ProjectEntityHandler.setRootDoc project._id, doc._id, callback
  69. (callback) ->
  70. self._buildTemplate "references.bib", owner_id, projectName, (error, docLines)->
  71. return callback(error) if error?
  72. ProjectEntityHandler.addDoc project._id, project.rootFolder[0]._id, "references.bib", docLines, owner_id, (error, doc)->
  73. callback(error)
  74. (callback) ->
  75. universePath = Path.resolve(__dirname + "/../../../templates/project_files/universe.jpg")
  76. ProjectEntityHandler.addFile project._id, project.rootFolder[0]._id, "universe.jpg", universePath, owner_id, callback
  77. ], (error) ->
  78. callback(error, project)
  79. _buildTemplate: (template_name, user_id, project_name, callback = (error, output) ->)->
  80. User.findById user_id, "first_name last_name", (error, user)->
  81. return callback(error) if error?
  82. monthNames = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]
  83. templatePath = Path.resolve(__dirname + "/../../../templates/project_files/#{template_name}")
  84. fs.readFile templatePath, (error, template) ->
  85. return callback(error) if error?
  86. data =
  87. project_name: project_name
  88. user: user
  89. year: new Date().getUTCFullYear()
  90. month: monthNames[new Date().getUTCMonth()]
  91. output = _.template(template.toString(), data)
  92. callback null, output.split("\n")
  93. metrics.timeAsyncMethod(
  94. ProjectCreationHandler, 'createBlankProject',
  95. 'mongo.ProjectCreationHandler',
  96. logger
  97. )