ProjectController.coffee 6.3 KB

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