ProjectCreationHandler.coffee 4.1 KB

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