ProjectController.coffee 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. async = require("async")
  2. logger = require("logger-sharelatex")
  3. projectDeleter = require("./ProjectDeleter")
  4. projectDuplicator = require("./ProjectDuplicator")
  5. projectCreationHandler = require("./ProjectCreationHandler")
  6. editorController = require("../Editor/EditorController")
  7. metrics = require('../../infrastructure/Metrics')
  8. sanitize = require('sanitizer')
  9. Project = require('../../models/Project').Project
  10. User = require('../../models/User').User
  11. TagsHandler = require("../Tags/TagsHandler")
  12. SubscriptionLocator = require("../Subscription/SubscriptionLocator")
  13. _ = require("underscore")
  14. Settings = require("settings-sharelatex")
  15. SecurityManager = require("../../managers/SecurityManager")
  16. module.exports =
  17. deleteProject: (req, res) ->
  18. project_id = req.params.Project_id
  19. logger.log project_id:project_id, "received request to delete project"
  20. projectDeleter.archiveProject project_id, (err)->
  21. if err?
  22. res.send 500
  23. else
  24. res.send 200
  25. restoreProject: (req, res) ->
  26. project_id = req.params.Project_id
  27. logger.log project_id:project_id, "received request to restore project"
  28. projectDeleter.restoreProject project_id, (err)->
  29. if err?
  30. res.send 500
  31. else
  32. res.send 200
  33. cloneProject: (req, res)->
  34. metrics.inc "cloned-project"
  35. project_id = req.params.Project_id
  36. projectName = req.body.projectName
  37. logger.log project_id:project_id, projectName:projectName, "cloning project"
  38. if !req.session.user?
  39. return res.send redir:"/register"
  40. projectDuplicator.duplicate req.session.user, project_id, projectName, (err, project)->
  41. if err?
  42. logger.error err:err, project_id: project_id, user_id: req.session.user._id, "error cloning project"
  43. return next(err)
  44. res.send(project_id:project._id)
  45. newProject: (req, res)->
  46. user = req.session.user
  47. projectName = sanitize.escape(req.body.projectName)
  48. template = sanitize.escape(req.body.template)
  49. logger.log user: user, type: template, name: projectName, "creating project"
  50. async.waterfall [
  51. (cb)->
  52. if template == 'example'
  53. projectCreationHandler.createExampleProject user._id, projectName, cb
  54. else
  55. projectCreationHandler.createBasicProject user._id, projectName, cb
  56. ], (err, project)->
  57. if err?
  58. logger.error err: err, project: project, user: user, name: projectName, type: template, "error creating project"
  59. res.send 500
  60. else
  61. logger.log project: project, user: user, name: projectName, type: template, "created project"
  62. res.send {project_id:project._id}
  63. renameProject: (req, res)->
  64. project_id = req.params.Project_id
  65. newName = req.body.newProjectName
  66. editorController.renameProject project_id, newName, (err)->
  67. if err?
  68. logger.err err:err, project_id:project_id, newName:newName, "problem renaming project"
  69. res.send 500
  70. else
  71. res.send 200
  72. projectListPage: (req, res, next)->
  73. timer = new metrics.Timer("project-list")
  74. user_id = req.session.user._id
  75. async.parallel {
  76. tags: (cb)->
  77. TagsHandler.getAllTags user_id, cb
  78. projects: (cb)->
  79. Project.findAllUsersProjects user_id, 'name lastUpdated publicAccesLevel', cb
  80. }, (err, results)->
  81. if err?
  82. logger.err err:err, "error getting data for project list page"
  83. return res.send 500
  84. logger.log results:results, user_id:user_id, "rendering project list"
  85. viewModel = _buildListViewModel results.projects[0], results.projects[1], results.projects[2], results.tags[0], results.tags[1]
  86. res.render 'project/list', viewModel
  87. timer.done()
  88. archivedProjects: (req, res, next)->
  89. user_id = req.session.user._id
  90. projectDeleter.findArchivedProjects user_id, 'name lastUpdated publicAccesLevel', (error, projects) ->
  91. return next(error) if error?
  92. logger.log projects: projects, user_id:user_id, "rendering archived project list"
  93. viewModel = _buildListViewModel projects, [], [], [], {}
  94. res.render 'project/archived', viewModel
  95. loadEditor: (req, res, next)->
  96. timer = new metrics.Timer("load-editor")
  97. if !Settings.editorIsOpen
  98. return res.render("general/closed", {title:"updating site"})
  99. if req.session.user?
  100. user_id = req.session.user._id
  101. anonymous = false
  102. else
  103. anonymous = true
  104. user_id = 'openUser'
  105. project_id = req.params.Project_id
  106. async.parallel {
  107. project: (cb)->
  108. Project.findPopulatedById project_id, cb
  109. user: (cb)->
  110. if user_id == 'openUser'
  111. cb null, defaultSettingsForAnonymousUser(user_id)
  112. else
  113. User.findById user_id, cb
  114. subscription: (cb)->
  115. if user_id == 'openUser'
  116. return cb()
  117. SubscriptionLocator.getUsersSubscription user_id, cb
  118. }, (err, results)->
  119. if err?
  120. logger.err err:err, "error getting details for project page"
  121. return next err
  122. project = results.project
  123. user = results.user
  124. subscription = results.subscription
  125. SecurityManager.userCanAccessProject user, project, (canAccess, privilegeLevel)->
  126. if !canAccess
  127. return res.send 401
  128. if subscription? and subscription.freeTrial? and subscription.freeTrial.expiresAt?
  129. allowedFreeTrial = !!subscription.freeTrial.allowed || true
  130. res.render 'project/editor',
  131. title: project.name
  132. priority_title: true
  133. bodyClasses: ["editor"]
  134. project : project
  135. userObject : JSON.stringify({
  136. id : user.id
  137. email : user.email
  138. first_name : user.first_name
  139. last_name : user.last_name
  140. referal_id : user.referal_id
  141. subscription :
  142. freeTrial: {allowed: allowedFreeTrial}
  143. })
  144. userSettingsObject: JSON.stringify({
  145. mode : user.ace.mode
  146. theme : user.ace.theme
  147. project_id : project._id
  148. fontSize : user.ace.fontSize
  149. autoComplete: user.ace.autoComplete
  150. spellCheckLanguage: user.ace.spellCheckLanguage
  151. pdfViewer : user.ace.pdfViewer
  152. docPositions: {}
  153. oldHistory: !!user.featureSwitches?.oldHistory
  154. })
  155. sharelatexObject : JSON.stringify({
  156. siteUrl: Settings.siteUrl,
  157. jsPath: res.locals.jsPath
  158. })
  159. privilegeLevel: privilegeLevel
  160. loadPdfjs: (user.ace.pdfViewer == "pdfjs")
  161. chatUrl: Settings.apis.chat.url
  162. anonymous: anonymous
  163. languages: Settings.languages
  164. timer.done()
  165. defaultSettingsForAnonymousUser = (user_id)->
  166. id : user_id
  167. ace:
  168. mode:'none'
  169. theme:'textmate'
  170. fontSize: '12'
  171. autoComplete: true
  172. spellCheckLanguage: ""
  173. pdfViewer: ""
  174. subscription:
  175. freeTrial:
  176. allowed: true
  177. featureSwitches:
  178. dropbox: false
  179. trackChanges: false
  180. _buildListViewModel = (projects, collabertions, readOnlyProjects, tags, tagsGroupedByProject)->
  181. for project in projects
  182. project.accessLevel = "owner"
  183. for project in collabertions
  184. project.accessLevel = "readWrite"
  185. for project in readOnlyProjects
  186. project.accessLevel = "readOnly"
  187. projects = projects.concat(collabertions).concat(readOnlyProjects)
  188. projects = projects.map (project)->
  189. project.tags = tagsGroupedByProject[project._id] || []
  190. return project
  191. tags = _.sortBy tags, (tag)->
  192. -tag.project_ids.length
  193. sortedProjects = _.sortBy projects, (project)->
  194. return - project.lastUpdated
  195. return {
  196. title:'Your Projects'
  197. priority_title: true
  198. projects: sortedProjects
  199. tags:tags
  200. projectTabActive: true
  201. }