overleaf/services/web/app/coffee/Features/Subscription/TeamInvitesHandler.coffee

101 lines
3.5 KiB
CoffeeScript
Raw Normal View History

logger = require("logger-sharelatex")
crypto = require("crypto")
settings = require("settings-sharelatex")
2018-05-31 06:54:50 -04:00
ObjectId = require("mongojs").ObjectId
TeamInvite = require("../../models/TeamInvite").TeamInvite
Subscription = require("../../models/Subscription").Subscription
UserLocator = require("../User/UserLocator")
SubscriptionLocator = require("./SubscriptionLocator")
2018-05-31 06:54:50 -04:00
SubscriptionUpdater = require("./SubscriptionUpdater")
LimitationsManager = require("./LimitationsManager")
EmailHandler = require("../Email/EmailHandler")
module.exports = TeamInvitesHandler =
getInvites: (subscriptionId, callback) ->
TeamInvite.find(subscriptionId: subscriptionId, callback)
getInvite: (token, callback) ->
Subscription.findOne 'teamInvites.token': token, (err, subscription) ->
return callback(err, subscription) if err?
return callback(teamNotFound: true) unless subscription?
2018-05-31 06:54:50 -04:00
invite = subscription.teamInvites.find (i) -> i.token == token
return callback(null, invite, subscription)
2018-05-31 06:54:50 -04:00
createManagerInvite: (teamManagerId, email, callback) ->
UserLocator.findById teamManagerId, (error, teamManager) ->
return callback(error) if error?
SubscriptionLocator.getUsersSubscription teamManagerId, (error, subscription) ->
return callback(error) if error?
2018-05-31 06:54:50 -04:00
if teamManager.first_name and teamManager.last_name
inviterName = "#{teamManager.first_name} #{teamManager.last_name} (#{teamManager.email})"
else
inviterName = teamManager.email
2018-05-31 06:54:50 -04:00
TeamInvitesHandler.createInvite(subscription, email, inviterName, callback)
2018-05-31 06:54:50 -04:00
createDomainInvite: (user, licence, callback) ->
SubscriptionLocator.getSubscription licence.subscription_id, (error, subscription) ->
return callback(error) if error?
TeamInvitesHandler.createInvite(subscription, user.email, licence.name, callback)
2018-05-31 06:54:50 -04:00
acceptInvite: (token, userId, callback) ->
TeamInvitesHandler.getInvite token, (err, invite, subscription) ->
2018-05-31 06:54:50 -04:00
return callback(err) if err?
return callback(inviteNoLongerValid: true) unless invite?
2018-05-31 06:54:50 -04:00
SubscriptionUpdater.addUserToGroup subscription.admin_id, userId, (err) ->
2018-05-31 06:54:50 -04:00
return callback(err) if err?
2018-05-31 06:54:50 -04:00
TeamInvitesHandler.removeInviteFromTeam(subscription.id, invite.email, callback)
2018-05-31 06:54:50 -04:00
revokeInvite: (teamManagerId, email, callback) ->
SubscriptionLocator.getUsersSubscription teamManagerId, (err, teamSubscription) ->
return callback(err) if err?
TeamInvitesHandler.removeInviteFromTeam(teamSubscription.id, email, callback)
2018-05-30 08:06:27 -04:00
createInvite: (subscription, email, inviterName, callback) ->
if LimitationsManager.teamHasReachedMemberLimit(subscription)
return callback(limitReached: true)
2018-05-30 08:06:27 -04:00
existingInvite = subscription.teamInvites.find (invite) -> invite.email == email
2018-05-31 06:54:50 -04:00
if existingInvite
return callback(alreadyInvited: true)
2018-05-31 06:54:50 -04:00
token = crypto.randomBytes(32).toString("hex")
2018-05-31 06:54:50 -04:00
invite = {
email: email,
token: token,
inviterName: inviterName,
sentAt: new Date(),
}
2018-05-31 06:54:50 -04:00
subscription.teamInvites.push(invite)
2018-05-31 06:54:50 -04:00
subscription.save (error) ->
return callback(error) if error?
2018-05-30 08:06:27 -04:00
# TODO: use standard way to canonalise email addresses
opts =
to: email.trim().toLowerCase()
inviterName: inviterName
acceptInviteUrl: "#{settings.siteUrl}/subscription/invites/#{token}/"
EmailHandler.sendEmail "verifyEmailToJoinTeam", opts, (error) ->
return callback(error, invite)
2018-05-30 08:06:27 -04:00
2018-05-31 06:54:50 -04:00
removeInviteFromTeam: (subscriptionId, email, callback) ->
searchConditions = { _id: new ObjectId(subscriptionId.toString()) }
updateOp = { $pull: { teamInvites: { email: email.trim().toLowerCase() } } }
2018-05-30 08:06:27 -04:00
2018-05-31 06:54:50 -04:00
Subscription.update(searchConditions, updateOp, callback)