ProjectCreationHandler.coffee 3.9 KB

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