ProjectController.coffee 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. User = require('../models/User').User
  2. Project = require('../models/Project').Project
  3. sanitize = require('sanitizer')
  4. path = require "path"
  5. logger = require('logger-sharelatex')
  6. _ = require('underscore')
  7. fs = require('fs')
  8. SecurityManager = require '../managers/SecurityManager'
  9. Settings = require('settings-sharelatex')
  10. projectCreationHandler = require '../Features/Project/ProjectCreationHandler'
  11. projectDuplicator = require('../Features/Project/ProjectDuplicator')
  12. projectDeleter = require("../Features/Project/ProjectDeleter")
  13. ProjectZipStreamManager = require '../Features/Downloads/ProjectZipStreamManager'
  14. metrics = require('../infrastructure/Metrics')
  15. TagsHandler = require('../Features/Tags/TagsHandler')
  16. SubscriptionLocator = require("../Features/Subscription/SubscriptionLocator")
  17. SubscriptionFormatters = require("../Features/Subscription/SubscriptionFormatters")
  18. FileStoreHandler = require("../Features/FileStore/FileStoreHandler")
  19. module.exports = class ProjectController
  20. constructor: ()->
  21. list: (req, res, next)->
  22. timer = new metrics.Timer("project-list")
  23. user_id = req.session.user._id
  24. startTime = new Date()
  25. User.findById user_id, (error, user) ->
  26. logger.log user_id: user_id, duration: (new Date() - startTime), "project list timer - User.findById"
  27. startTime = new Date()
  28. # TODO: Remove this one month after the ability to start free trials was removed
  29. SubscriptionLocator.getUsersSubscription user._id, (err, subscription)->
  30. logger.log user_id: user_id, duration: (new Date() - startTime), "project list timer - Subscription.getUsersSubscription"
  31. startTime = new Date()
  32. return next(error) if error?
  33. # TODO: Remove this one month after the ability to start free trials was removed
  34. if subscription? and subscription.freeTrial? and subscription.freeTrial.expiresAt?
  35. freeTrial =
  36. expired: !!subscription.freeTrial.downgraded
  37. expiresAt: SubscriptionFormatters.formatDate(subscription.freeTrial.expiresAt)
  38. TagsHandler.getAllTags user_id, (err, tags, tagsGroupedByProject)->
  39. logger.log user_id: user_id, duration: (new Date() - startTime), "project list timer - TagsHandler.getAllTags"
  40. startTime = new Date()
  41. Project.findAllUsersProjects user_id, 'name lastUpdated publicAccesLevel', (projects, collabertions, readOnlyProjects)->
  42. logger.log user_id: user_id, duration: (new Date() - startTime), "project list timer - Project.findAllUsersProjects"
  43. startTime = new Date()
  44. for project in projects
  45. project.accessLevel = "owner"
  46. for project in collabertions
  47. project.accessLevel = "readWrite"
  48. for project in readOnlyProjects
  49. project.accessLevel = "readOnly"
  50. projects = projects.concat(collabertions).concat(readOnlyProjects)
  51. projects = projects.map (project)->
  52. project.tags = tagsGroupedByProject[project._id] || []
  53. return project
  54. tags = _.sortBy tags, (tag)->
  55. -tag.project_ids.length
  56. logger.log projects:projects, collabertions:collabertions, readOnlyProjects:readOnlyProjects, user_id:user_id, "rendering project list"
  57. sortedProjects = _.sortBy projects, (project)->
  58. return - project.lastUpdated
  59. res.render 'project/list',
  60. title:'Your Projects'
  61. priority_title: true
  62. projects: sortedProjects
  63. freeTrial: freeTrial
  64. tags:tags
  65. projectTabActive: true
  66. logger.log user_id: user_id, duration: (new Date() - startTime), "project list timer - Finished"
  67. timer.done()
  68. loadEditor: (req, res)->
  69. timer = new metrics.Timer("load-editor")
  70. if !Settings.editorIsOpen
  71. res.render("general/closed", {title:"updating site"})
  72. else
  73. if req.session.user?
  74. user_id = req.session.user._id
  75. else
  76. user_id = 'openUser'
  77. project_id = req.params.Project_id
  78. Project.findPopulatedById project_id, (err, project)->
  79. User.findById user_id, (err, user)->
  80. if user_id == 'openUser'
  81. anonymous = true
  82. user =
  83. id : user_id
  84. ace:
  85. mode:'none'
  86. theme:'textmate'
  87. fontSize: '12'
  88. autoComplete: true
  89. spellCheckLanguage: ""
  90. pdfViewer: ""
  91. subscription:
  92. freeTrial:
  93. allowed: true
  94. featureSwitches:
  95. dropbox: false
  96. trackChanges: false
  97. else
  98. anonymous = false
  99. SubscriptionLocator.getUsersSubscription user?._id, (err, subscription)->
  100. SecurityManager.userCanAccessProject user, project, (canAccess, privilegeLevel)->
  101. allowedFreeTrial = true
  102. if subscription? and subscription.freeTrial? and subscription.freeTrial.expiresAt?
  103. allowedFreeTrial = !!subscription.freeTrial.allowed
  104. if canAccess
  105. timer.done()
  106. res.render 'project/editor',
  107. title: project.name
  108. priority_title: true
  109. bodyClasses: ["editor"]
  110. project : project
  111. owner : project.owner_ref
  112. userObject : JSON.stringify({
  113. id : user.id
  114. email : user.email
  115. first_name : user.first_name
  116. last_name : user.last_name
  117. referal_id : user.referal_id
  118. subscription :
  119. freeTrial: {allowed: allowedFreeTrial}
  120. })
  121. userSettingsObject: JSON.stringify({
  122. mode : user.ace.mode
  123. theme : user.ace.theme
  124. project_id : project._id
  125. fontSize : user.ace.fontSize
  126. autoComplete: user.ace.autoComplete
  127. spellCheckLanguage: user.ace.spellCheckLanguage
  128. pdfViewer : user.ace.pdfViewer
  129. docPositions: {}
  130. oldHistory: !!user.featureSwitches?.oldHistory
  131. })
  132. sharelatexObject : JSON.stringify({
  133. siteUrl: Settings.siteUrl,
  134. jsPath: res.locals.jsPath
  135. })
  136. privilegeLevel: privilegeLevel
  137. userCanSeeDropbox: user.featureSwitches.dropbox and project.owner_ref._id+"" == user._id+""
  138. loadPdfjs: (user.ace.pdfViewer == "pdfjs")
  139. chatUrl: Settings.apis.chat.url
  140. anonymous: anonymous
  141. languages: Settings.languages,
  142. startBufferingRequest: (req, res, next) ->
  143. req.bufferedChunks = []
  144. req.endEmitted = false
  145. bufferChunk = (chunk) -> req.bufferedChunks.push(chunk)
  146. req.on "data", bufferChunk
  147. endCallback = () -> req.endEmitted = true
  148. req.on "end", endCallback
  149. req.emitBufferedData = () ->
  150. logger.log chunks: @bufferedChunks.length, emittedEnd: @endEmitted, "emitting buffer chunks"
  151. @removeListener "data", bufferChunk
  152. while @bufferedChunks.length > 0
  153. @emit "data", @bufferedChunks.shift()
  154. @removeListener "end", endCallback
  155. @emit "end" if @endEmitted
  156. next()