ProjectHandler.coffee 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. Project = require('../models/Project').Project
  2. Folder = require('../models/Folder').Folder
  3. Doc = require('../models/Doc').Doc
  4. File = require('../models/File').File
  5. User = require('../models/User').User
  6. logger = require('logger-sharelatex')
  7. _ = require('underscore')
  8. Settings = require('settings-sharelatex')
  9. emailer = require('../managers/EmailManager')
  10. tpdsUpdateSender = require '../Features/ThirdPartyDataStore/TpdsUpdateSender'
  11. projectCreationHandler = require '../Features/Project/ProjectCreationHandler'
  12. projectEntityHandler = require '../Features/Project/ProjectEntityHandler'
  13. ProjectEditorHandler = require '../Features/Project/ProjectEditorHandler'
  14. FileStoreHandler = require "../Features/FileStore/FileStoreHandler"
  15. projectLocator = require '../Features/Project/ProjectLocator'
  16. mimelib = require("mimelib")
  17. async = require('async')
  18. tagsHandler = require('../Features/Tags/TagsHandler')
  19. module.exports = class ProjectHandler
  20. getProject: (project_id, callback)->
  21. logger.log project_id: project_id, "getting project"
  22. Project.findById project_id, (err, project)->
  23. callback err, ProjectEditorHandler.buildProjectModelView(project, includeUsers: false)
  24. confirmFolder = (project_id, folder_id, callback)->
  25. logger.log folder: folder_id, project_id: project_id, "confirming existence of folder"
  26. if folder_id+'' == 'undefined'
  27. Project.findById project_id, (err, project)->
  28. callback(project.rootFolder[0]._id)
  29. else if folder_id != null
  30. callback folder_id
  31. else
  32. Project.findById project_id, (err, project)->
  33. callback(project.rootFolder[0]._id)
  34. renameEntity: (project_id, entity_id, entityType, newName, callback)->
  35. logger.log(entity_id: entity_id, project_id: project_id, ('renaming '+entityType))
  36. if !entityType?
  37. logger.err err: "No entityType set", project_id: project_id, entity_id: entity_id
  38. return callback("No entityType set")
  39. entityType = entityType.toLowerCase()
  40. Project.findById project_id, (err, project)=>
  41. projectLocator.findElement {project:project, element_id:entity_id, type:entityType}, (err, entity, path, folder)=>
  42. if err?
  43. return callback err
  44. conditons = {_id:project_id}
  45. update = "$set":{}
  46. namePath = path.mongo+".name"
  47. update["$set"][namePath] = newName
  48. endPath = path.fileSystem.replace(entity.name, newName)
  49. tpdsUpdateSender.moveEntity({project_id:project_id, startPath:path.fileSystem, endPath:endPath, project_name:project.name, rev:entity.rev})
  50. Project.update conditons, update, {}, (err)->
  51. if callback?
  52. callback err
  53. renameProject: (project_id, window_id, newName, callback)->
  54. logger.log project_id: project_id, "renaming project"
  55. conditons = {_id:project_id}
  56. Project.findOne conditons, "name", (err, project)->
  57. oldProjectName = project.name
  58. Project.update conditons, {name: newName}, {},(err, project)=>
  59. tpdsUpdateSender.moveEntity {project_id:project_id, project_name:oldProjectName, newProjectName:newName}
  60. if callback?
  61. callback err
  62. deleteProject: (project_id, callback = (error) ->)->
  63. logger.log project_id:project_id, "deleting project"
  64. Project.findById project_id, (err, project)=>
  65. if project?
  66. require('../Features/DocumentUpdater/DocumentUpdaterHandler').flushProjectToMongoAndDelete project_id, (error) ->
  67. return callback(error) if error?
  68. Project.applyToAllFilesRecursivly project.rootFolder[0], (file)=>
  69. FileStoreHandler.deleteFile project_id, file._id, ->
  70. Project.remove {_id:project_id}, (err)->
  71. if callback?
  72. callback(err)
  73. require('../Features/Versioning/AutomaticSnapshotManager').unmarkProjectAsUpdated project_id, ->
  74. tagsHandler.removeProjectFromAllTags project.owner_ref, project_id,->
  75. project.collaberator_refs.forEach (collaberator_ref)->
  76. tagsHandler.removeProjectFromAllTags collaberator_ref, project_id, ->
  77. project.readOnly_refs.forEach (readOnly_ref)->
  78. tagsHandler.removeProjectFromAllTags readOnly_ref, project_id,->
  79. else
  80. if callback?
  81. callback(err)
  82. setPublicAccessLevel : (project_id, newAccessLevel, callback)->
  83. logger.log project_id: project_id, level: newAccessLevel, "set public access level"
  84. if project_id? && newAccessLevel?
  85. if _.include ['readOnly', 'readAndWrite', 'private'], newAccessLevel
  86. Project.update {_id:project_id},{publicAccesLevel:newAccessLevel},{}, (err)->
  87. if callback?
  88. callback()
  89. addUserToProject: (project_id, email, privlages, callback)->
  90. if email != ''
  91. doAdd = (user)=>
  92. Project.findOne(_id: project_id )
  93. .select("name owner_ref")
  94. .populate('owner_ref')
  95. .exec (err, project)->
  96. emailOptions =
  97. receiver : email
  98. replyTo : project.owner_ref.email
  99. subject : "#{project.owner_ref.first_name} #{project.owner_ref.last_name} wants to share '#{project.name}' with you"
  100. heading : "#{project.name} #{project.owner_ref.last_name} wants to share '#{project.name}' with you"
  101. message : "
  102. "
  103. template_name:"shared_project_email_template"
  104. view_data:
  105. project:
  106. name: project.name
  107. url: "#{Settings.siteUrl}/project/#{project._id}?" + [
  108. "project_name=#{project.name}"
  109. "user_first_name=#{project.owner_ref.first_name}"
  110. "new_email=#{email}"
  111. "r=#{project.owner_ref.referal_id}" # Referal
  112. "rs=ci" # referral source = collaborator invite
  113. ].join("&")
  114. owner:
  115. first_name: project.owner_ref.first_name
  116. email: project.owner_ref.email
  117. sharelatex_url: Settings.siteUrl
  118. emailer.sendEmail emailOptions
  119. if privlages == 'readAndWrite'
  120. level = {"collaberator_refs":user}
  121. logger.log privileges: "readAndWrite", user: user, project: project, "adding user"
  122. else if privlages == 'readOnly'
  123. level = {"readOnly_refs":user}
  124. logger.log privileges: "readOnly", user: user, project: project, "adding user"
  125. Project.update {_id: project_id}, {$push:level},{},(err)->
  126. projectEntityHandler.flushProjectToThirdPartyDataStore project_id, "", ->
  127. if callback?
  128. callback(user)
  129. emails = mimelib.parseAddresses(email)
  130. email = emails[0].address
  131. User.findOne {'email':email}, (err, user)->
  132. if(!user)
  133. user = new User 'email':email, holdingAccount:true
  134. user.save (err)->
  135. logger.log user: user, 'creating new empty user'
  136. doAdd user
  137. else
  138. doAdd user
  139. removeUserFromProject: (project_id, user_id, callback)->
  140. logger.log user_id: user_id, project_id: project_id, "removing user"
  141. conditions = _id:project_id
  142. update = $pull:{}
  143. update["$pull"] = collaberator_refs:user_id, readOnly_refs:user_id
  144. Project.update conditions, update, {}, (err)->
  145. if err?
  146. logger.err err: err, "problem removing user from project collaberators"
  147. if callback?
  148. callback()
  149. changeUsersPrivlageLevel: (project_id, user_id, newPrivalageLevel)->
  150. @removeUserFromProject project_id, user_id, ()=>
  151. User.findById user_id, (err, user)=>
  152. if user
  153. @addUserToProject project_id, user.email, newPrivalageLevel