TeamInvitesHandler.coffee 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. logger = require("logger-sharelatex")
  2. crypto = require("crypto")
  3. settings = require("settings-sharelatex")
  4. ObjectId = require("mongojs").ObjectId
  5. TeamInvite = require("../../models/TeamInvite").TeamInvite
  6. Subscription = require("../../models/Subscription").Subscription
  7. UserLocator = require("../User/UserLocator")
  8. SubscriptionLocator = require("./SubscriptionLocator")
  9. SubscriptionUpdater = require("./SubscriptionUpdater")
  10. LimitationsManager = require("./LimitationsManager")
  11. EmailHandler = require("../Email/EmailHandler")
  12. module.exports = TeamInvitesHandler =
  13. getInvites: (subscriptionId, callback) ->
  14. TeamInvite.find(subscriptionId: subscriptionId, callback)
  15. createInvite: (teamManagerId, email, callback) ->
  16. UserLocator.findById teamManagerId, (error, teamManager) ->
  17. SubscriptionLocator.getUsersSubscription teamManagerId, (error, subscription) ->
  18. return callback(error) if error?
  19. if LimitationsManager.teamHasReachedMemberLimit(subscription)
  20. return callback(limitReached: true)
  21. existingInvite = subscription.teamInvites.find (invite) -> invite.email == email
  22. if existingInvite
  23. return callback(alreadyInvited: true)
  24. inviterName = TeamInvitesHandler.inviterName(teamManager)
  25. token = crypto.randomBytes(32).toString("hex")
  26. invite = {
  27. email: email,
  28. token: token,
  29. sentAt: new Date(),
  30. }
  31. subscription.teamInvites.push(invite)
  32. subscription.save (error) ->
  33. return callback(error) if error?
  34. # TODO: use standard way to canonalise email addresses
  35. opts =
  36. to: email.trim().toLowerCase()
  37. inviterName: inviterName
  38. acceptInviteUrl: "#{settings.siteUrl}/subscription/invites/#{token}/"
  39. EmailHandler.sendEmail "verifyEmailToJoinTeam", opts, (error) ->
  40. return callback(error, invite)
  41. acceptInvite: (token, userId, callback) ->
  42. TeamInvitesHandler.getInviteAndManager token, (err, invite, subscription, teamManager) ->
  43. return callback(err) if err?
  44. return callback(inviteNoLongerValid: true) unless invite? and teamManager?
  45. SubscriptionUpdater.addUserToGroup teamManager, userId, (err) ->
  46. return callback(err) if err?
  47. TeamInvitesHandler.removeInviteFromTeam(subscription.id, invite.email, callback)
  48. revokeInvite: (teamManagerId, email, callback) ->
  49. SubscriptionLocator.getUsersSubscription teamManagerId, (err, teamSubscription) ->
  50. return callback(err) if err?
  51. TeamInvitesHandler.removeInviteFromTeam(teamSubscription.id, email, callback)
  52. getInviteDetails: (token, userId, callback) ->
  53. TeamInvitesHandler.getInviteAndManager token, (err, invite, teamSubscription, teamManager) ->
  54. return callback(err) if err?
  55. SubscriptionLocator.getUsersSubscription userId, (err, personalSubscription) ->
  56. return callback(err) if err?
  57. return callback(null , {
  58. invite: invite,
  59. personalSubscription: personalSubscription,
  60. team: teamSubscription,
  61. inviterName: TeamInvitesHandler.inviterName(teamManager),
  62. teamManager: teamManager
  63. })
  64. getInviteAndManager: (token, callback) ->
  65. TeamInvitesHandler.getInvite token, (err, invite, teamSubscription) ->
  66. return callback(err) if err?
  67. UserLocator.findById teamSubscription.admin_id, (err, teamManager) ->
  68. return callback(err, invite, teamSubscription, teamManager)
  69. getInvite: (token, callback) ->
  70. Subscription.findOne 'teamInvites.token': token, (err, subscription) ->
  71. return callback(err, subscription) if err?
  72. return callback(teamNotFound: true) unless subscription?
  73. invite = subscription.teamInvites.find (i) -> i.token == token
  74. return callback(null, invite, subscription)
  75. removeInviteFromTeam: (subscriptionId, email, callback) ->
  76. searchConditions = { _id: new ObjectId(subscriptionId.toString()) }
  77. updateOp = { $pull: { teamInvites: { email: email.trim().toLowerCase() } } }
  78. Subscription.update(searchConditions, updateOp, callback)
  79. inviterName: (teamManager) ->
  80. if teamManager.first_name and teamManager.last_name
  81. "#{teamManager.first_name} #{teamManager.last_name} (#{teamManager.email})"
  82. else
  83. teamManager.email