mirror of
https://github.com/overleaf/overleaf.git
synced 2025-03-15 08:23:08 +00:00
Clean up code that uses invited_emails
This commit is contained in:
parent
1c485c1884
commit
385fec1914
12 changed files with 96 additions and 256 deletions
|
@ -6,7 +6,7 @@ Settings = require("settings-sharelatex")
|
||||||
CollaboratorsHandler = require("../Collaborators/CollaboratorsHandler")
|
CollaboratorsHandler = require("../Collaborators/CollaboratorsHandler")
|
||||||
CollaboratorsInvitesHandler = require("../Collaborators/CollaboratorsInviteHandler")
|
CollaboratorsInvitesHandler = require("../Collaborators/CollaboratorsInviteHandler")
|
||||||
|
|
||||||
module.exports =
|
module.exports = LimitationsManager =
|
||||||
allowedNumberOfCollaboratorsInProject: (project_id, callback) ->
|
allowedNumberOfCollaboratorsInProject: (project_id, callback) ->
|
||||||
ProjectGetter.getProject project_id, owner_ref: true, (error, project) =>
|
ProjectGetter.getProject project_id, owner_ref: true, (error, project) =>
|
||||||
return callback(error) if error?
|
return callback(error) if error?
|
||||||
|
@ -56,7 +56,7 @@ module.exports =
|
||||||
callback err, subscriptions.length > 0, subscriptions
|
callback err, subscriptions.length > 0, subscriptions
|
||||||
|
|
||||||
teamHasReachedMemberLimit: (subscription) ->
|
teamHasReachedMemberLimit: (subscription) ->
|
||||||
currentTotal = (subscription.member_ids or []).length + (subscription.team_invites or []).length
|
currentTotal = (subscription.member_ids or []).length + (subscription.teamInvites or []).length
|
||||||
return currentTotal >= subscription.membersLimit
|
return currentTotal >= subscription.membersLimit
|
||||||
|
|
||||||
hasGroupMembersLimitReached: (user_id, callback = (err, limitReached, subscription)->)->
|
hasGroupMembersLimitReached: (user_id, callback = (err, limitReached, subscription)->)->
|
||||||
|
@ -67,7 +67,6 @@ module.exports =
|
||||||
if !subscription?
|
if !subscription?
|
||||||
logger.err user_id:user_id, "no subscription found for user"
|
logger.err user_id:user_id, "no subscription found for user"
|
||||||
return callback("no subscription found")
|
return callback("no subscription found")
|
||||||
currentTotal = (subscription.member_ids or []).length + (subscription.invited_emails or []).length
|
|
||||||
limitReached = currentTotal >= subscription.membersLimit
|
limitReached = LimitationsManager.teamHasReachedMemberLimit(subscription)
|
||||||
logger.log user_id:user_id, limitReached:limitReached, currentTotal: currentTotal, membersLimit: subscription.membersLimit, "checking if subscription members limit has been reached"
|
|
||||||
callback(err, limitReached, subscription)
|
callback(err, limitReached, subscription)
|
||||||
|
|
|
@ -33,14 +33,6 @@ module.exports =
|
||||||
return res.sendStatus 500
|
return res.sendStatus 500
|
||||||
res.send()
|
res.send()
|
||||||
|
|
||||||
removeEmailInviteFromGroup: (req, res)->
|
|
||||||
adminUserId = AuthenticationController.getLoggedInUserId(req)
|
|
||||||
email = req.params.email
|
|
||||||
logger.log {adminUserId, email}, "removing email invite from group subscription"
|
|
||||||
SubscriptionGroupHandler.removeEmailInviteFromGroup adminUserId, email, (err)->
|
|
||||||
return next(error) if error?
|
|
||||||
res.send()
|
|
||||||
|
|
||||||
removeSelfFromGroup: (req, res)->
|
removeSelfFromGroup: (req, res)->
|
||||||
adminUserId = req.query.admin_user_id
|
adminUserId = req.query.admin_user_id
|
||||||
userToRemove_id = AuthenticationController.getLoggedInUserId(req)
|
userToRemove_id = AuthenticationController.getLoggedInUserId(req)
|
||||||
|
|
|
@ -33,7 +33,7 @@ module.exports = SubscriptionGroupHandler =
|
||||||
userViewModel = buildUserViewModel(user)
|
userViewModel = buildUserViewModel(user)
|
||||||
callback(err, userViewModel)
|
callback(err, userViewModel)
|
||||||
else
|
else
|
||||||
SubscriptionUpdater.addEmailInviteToGroup adminUserId, newEmail, (err) ->
|
TeamInvitesHandler.createManagerInvite adminUserId, newEmail, (err) ->
|
||||||
return callback(err) if err?
|
return callback(err) if err?
|
||||||
userViewModel = buildEmailInviteViewModel(newEmail)
|
userViewModel = buildEmailInviteViewModel(newEmail)
|
||||||
callback(err, userViewModel)
|
callback(err, userViewModel)
|
||||||
|
@ -41,16 +41,11 @@ module.exports = SubscriptionGroupHandler =
|
||||||
removeUserFromGroup: (adminUser_id, userToRemove_id, callback)->
|
removeUserFromGroup: (adminUser_id, userToRemove_id, callback)->
|
||||||
SubscriptionUpdater.removeUserFromGroup adminUser_id, userToRemove_id, callback
|
SubscriptionUpdater.removeUserFromGroup adminUser_id, userToRemove_id, callback
|
||||||
|
|
||||||
removeEmailInviteFromGroup: (adminUser_id, email, callback) ->
|
|
||||||
SubscriptionUpdater.removeEmailInviteFromGroup adminUser_id, email, callback
|
|
||||||
|
|
||||||
getPopulatedListOfMembers: (adminUser_id, callback)->
|
getPopulatedListOfMembers: (adminUser_id, callback)->
|
||||||
SubscriptionLocator.getUsersSubscription adminUser_id, (err, subscription)->
|
SubscriptionLocator.getUsersSubscription adminUser_id, (err, subscription)->
|
||||||
return callback(err) if err?
|
return callback(err) if err?
|
||||||
|
|
||||||
users = []
|
users = []
|
||||||
for email in subscription.invited_emails or []
|
|
||||||
users.push buildEmailInviteViewModel(email)
|
|
||||||
|
|
||||||
for teamInvite in subscription.teamInvites or []
|
for teamInvite in subscription.teamInvites or []
|
||||||
users.push buildEmailInviteViewModel(teamInvite.email)
|
users.push buildEmailInviteViewModel(teamInvite.email)
|
||||||
|
@ -86,37 +81,6 @@ module.exports = SubscriptionGroupHandler =
|
||||||
completeJoinUrl: "#{settings.siteUrl}/user/subscription/#{subscription_id}/group/complete-join?token=#{token}"
|
completeJoinUrl: "#{settings.siteUrl}/user/subscription/#{subscription_id}/group/complete-join?token=#{token}"
|
||||||
EmailHandler.sendEmail "completeJoinGroupAccount", opts, callback
|
EmailHandler.sendEmail "completeJoinGroupAccount", opts, callback
|
||||||
|
|
||||||
processGroupVerification: (userEmail, subscription_id, token, callback)->
|
|
||||||
logger.log userEmail:userEmail, subscription_id:subscription_id, "processing group verification for user"
|
|
||||||
OneTimeTokenHandler.getValueFromTokenAndExpire token, (err, token_subscription_id)->
|
|
||||||
if err? or subscription_id != token_subscription_id
|
|
||||||
logger.err userEmail:userEmail, token:token, "token value not found for processing group verification"
|
|
||||||
return callback("token_not_found")
|
|
||||||
SubscriptionLocator.getSubscription subscription_id, (err, subscription)->
|
|
||||||
if err?
|
|
||||||
logger.err err:err, subscription:subscription, userEmail:userEmail, subscription_id:subscription_id, "error getting subscription"
|
|
||||||
return callback(err)
|
|
||||||
if !subscription?
|
|
||||||
logger.warn subscription_id:subscription_id, userEmail:userEmail, "no subscription found"
|
|
||||||
return callback()
|
|
||||||
SubscriptionGroupHandler.addUserToGroup subscription?.admin_id, userEmail, callback
|
|
||||||
|
|
||||||
convertEmailInvitesToMemberships: (email, user_id, callback = (err) ->) ->
|
|
||||||
SubscriptionLocator.getGroupsWithEmailInvite email, (err, groups = []) ->
|
|
||||||
return callback(err) if err?
|
|
||||||
logger.log {email, user_id, groups}, "found groups to convert from email invite to member"
|
|
||||||
jobs = []
|
|
||||||
for group in groups
|
|
||||||
do (group) ->
|
|
||||||
jobs.push (cb) ->
|
|
||||||
SubscriptionUpdater.removeEmailInviteFromGroup group.admin_id, email, (err) ->
|
|
||||||
return cb(err) if err?
|
|
||||||
SubscriptionUpdater.addUserToGroup group.admin_id, user_id, (err) ->
|
|
||||||
return cb(err) if err?
|
|
||||||
logger.log {group_id: group._id, user_id, email}, "converted email invite to group membership"
|
|
||||||
return cb()
|
|
||||||
async.series jobs, callback
|
|
||||||
|
|
||||||
buildUserViewModel = (user)->
|
buildUserViewModel = (user)->
|
||||||
u =
|
u =
|
||||||
email: user.email
|
email: user.email
|
||||||
|
|
|
@ -32,4 +32,4 @@ module.exports =
|
||||||
Subscription.find {member_ids: user_id}, {_id:1, planCode:1}, callback
|
Subscription.find {member_ids: user_id}, {_id:1, planCode:1}, callback
|
||||||
|
|
||||||
getGroupsWithEmailInvite: (email, callback) ->
|
getGroupsWithEmailInvite: (email, callback) ->
|
||||||
Subscription.find { invited_emails: email }, callback
|
Subscription.find { teamInvites: { email: email } }, callback
|
||||||
|
|
|
@ -24,7 +24,6 @@ module.exports =
|
||||||
webRouter.post '/subscription/group/user', AuthenticationController.requireLogin(), SubscriptionGroupController.addUserToGroup
|
webRouter.post '/subscription/group/user', AuthenticationController.requireLogin(), SubscriptionGroupController.addUserToGroup
|
||||||
webRouter.get '/subscription/group/export', AuthenticationController.requireLogin(), SubscriptionGroupController.exportGroupCsv
|
webRouter.get '/subscription/group/export', AuthenticationController.requireLogin(), SubscriptionGroupController.exportGroupCsv
|
||||||
webRouter.delete '/subscription/group/user/:user_id', AuthenticationController.requireLogin(), SubscriptionGroupController.removeUserFromGroup
|
webRouter.delete '/subscription/group/user/:user_id', AuthenticationController.requireLogin(), SubscriptionGroupController.removeUserFromGroup
|
||||||
webRouter.delete '/subscription/group/email/:email', AuthenticationController.requireLogin(), SubscriptionGroupController.removeEmailInviteFromGroup
|
|
||||||
webRouter.delete '/subscription/group/user', AuthenticationController.requireLogin(), SubscriptionGroupController.removeSelfFromGroup
|
webRouter.delete '/subscription/group/user', AuthenticationController.requireLogin(), SubscriptionGroupController.removeSelfFromGroup
|
||||||
|
|
||||||
# Team invites
|
# Team invites
|
||||||
|
|
|
@ -26,28 +26,20 @@ module.exports = SubscriptionUpdater =
|
||||||
|
|
||||||
addUserToGroup: (adminUser_id, user_id, callback)->
|
addUserToGroup: (adminUser_id, user_id, callback)->
|
||||||
logger.log adminUser_id:adminUser_id, user_id:user_id, "adding user into mongo subscription"
|
logger.log adminUser_id:adminUser_id, user_id:user_id, "adding user into mongo subscription"
|
||||||
searchOps =
|
searchOps =
|
||||||
admin_id: adminUser_id
|
admin_id: adminUser_id
|
||||||
insertOperation =
|
insertOperation =
|
||||||
"$addToSet": {member_ids:user_id}
|
"$addToSet": {member_ids:user_id}
|
||||||
Subscription.findAndModify searchOps, insertOperation, (err, subscription)->
|
Subscription.findAndModify searchOps, insertOperation, (err, subscription)->
|
||||||
if err?
|
if err?
|
||||||
logger.err err:err, searchOps:searchOps, insertOperation:insertOperation, "error findy and modify add user to group"
|
logger.err err:err, searchOps:searchOps, insertOperation:insertOperation, "error findy and modify add user to group"
|
||||||
return callback(err)
|
return callback(err)
|
||||||
FeaturesUpdater.refreshFeatures user_id, callback
|
FeaturesUpdater.refreshFeatures user_id, callback
|
||||||
|
|
||||||
addEmailInviteToGroup: (adminUser_id, email, callback) ->
|
|
||||||
logger.log {adminUser_id, email}, "adding email into mongo subscription"
|
|
||||||
searchOps =
|
|
||||||
admin_id: adminUser_id
|
|
||||||
insertOperation =
|
|
||||||
"$addToSet": {invited_emails: email}
|
|
||||||
Subscription.findAndModify searchOps, insertOperation, callback
|
|
||||||
|
|
||||||
removeUserFromGroup: (adminUser_id, user_id, callback)->
|
removeUserFromGroup: (adminUser_id, user_id, callback)->
|
||||||
searchOps =
|
searchOps =
|
||||||
admin_id: adminUser_id
|
admin_id: adminUser_id
|
||||||
removeOperation =
|
removeOperation =
|
||||||
"$pull": {member_ids:user_id}
|
"$pull": {member_ids:user_id}
|
||||||
Subscription.update searchOps, removeOperation, (err)->
|
Subscription.update searchOps, removeOperation, (err)->
|
||||||
if err?
|
if err?
|
||||||
|
@ -55,13 +47,6 @@ module.exports = SubscriptionUpdater =
|
||||||
return callback(err)
|
return callback(err)
|
||||||
FeaturesUpdater.refreshFeatures user_id, callback
|
FeaturesUpdater.refreshFeatures user_id, callback
|
||||||
|
|
||||||
removeEmailInviteFromGroup: (adminUser_id, email, callback)->
|
|
||||||
Subscription.update {
|
|
||||||
admin_id: adminUser_id
|
|
||||||
}, "$pull": {
|
|
||||||
invited_emails: email
|
|
||||||
}, callback
|
|
||||||
|
|
||||||
deleteSubscription: (subscription_id, callback = (error) ->) ->
|
deleteSubscription: (subscription_id, callback = (error) ->) ->
|
||||||
SubscriptionLocator.getSubscription subscription_id, (err, subscription) ->
|
SubscriptionLocator.getSubscription subscription_id, (err, subscription) ->
|
||||||
return callback(err) if err?
|
return callback(err) if err?
|
||||||
|
|
|
@ -10,7 +10,7 @@ module.exports =
|
||||||
teamManagerId = AuthenticationController.getLoggedInUserId(req)
|
teamManagerId = AuthenticationController.getLoggedInUserId(req)
|
||||||
email = req.body.email
|
email = req.body.email
|
||||||
|
|
||||||
TeamInvitesHandler.createInvite teamManagerId, email, (err, invite) ->
|
TeamInvitesHandler.createManagerInvite teamManagerId, email, (err, invite) ->
|
||||||
return handleError(err, req, res, next) if err?
|
return handleError(err, req, res, next) if err?
|
||||||
inviteView = { user:
|
inviteView = { user:
|
||||||
{ email: invite.email, sentAt: invite.sentAt, holdingAccount: true }
|
{ email: invite.email, sentAt: invite.sentAt, holdingAccount: true }
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
logger = require("logger-sharelatex")
|
logger = require("logger-sharelatex")
|
||||||
crypto = require("crypto")
|
crypto = require("crypto")
|
||||||
|
async = require("async")
|
||||||
|
|
||||||
settings = require("settings-sharelatex")
|
settings = require("settings-sharelatex")
|
||||||
ObjectId = require("mongojs").ObjectId
|
ObjectId = require("mongojs").ObjectId
|
||||||
|
@ -15,19 +16,16 @@ LimitationsManager = require("./LimitationsManager")
|
||||||
EmailHandler = require("../Email/EmailHandler")
|
EmailHandler = require("../Email/EmailHandler")
|
||||||
|
|
||||||
module.exports = TeamInvitesHandler =
|
module.exports = TeamInvitesHandler =
|
||||||
|
|
||||||
getInvites: (subscriptionId, callback) ->
|
|
||||||
TeamInvite.find(subscriptionId: subscriptionId, callback)
|
|
||||||
|
|
||||||
getInvite: (token, callback) ->
|
getInvite: (token, callback) ->
|
||||||
Subscription.findOne 'teamInvites.token': token, (err, subscription) ->
|
Subscription.findOne 'teamInvites.token': token, (err, subscription) ->
|
||||||
return callback(err, subscription) if err?
|
return callback(err) if err?
|
||||||
return callback(teamNotFound: true) unless subscription?
|
return callback(teamNotFound: true) unless subscription?
|
||||||
|
|
||||||
invite = subscription.teamInvites.find (i) -> i.token == token
|
invite = subscription.teamInvites.find (i) -> i.token == token
|
||||||
return callback(null, invite, subscription)
|
return callback(null, invite, subscription)
|
||||||
|
|
||||||
createManagerInvite: (teamManagerId, email, callback) ->
|
createManagerInvite: (teamManagerId, email, callback) ->
|
||||||
|
logger.log {teamManagerId, email}, "Creating manager team invite"
|
||||||
UserLocator.findById teamManagerId, (error, teamManager) ->
|
UserLocator.findById teamManagerId, (error, teamManager) ->
|
||||||
return callback(error) if error?
|
return callback(error) if error?
|
||||||
|
|
||||||
|
@ -39,14 +37,16 @@ module.exports = TeamInvitesHandler =
|
||||||
else
|
else
|
||||||
inviterName = teamManager.email
|
inviterName = teamManager.email
|
||||||
|
|
||||||
TeamInvitesHandler.createInvite(subscription, email, inviterName, callback)
|
createInvite(subscription, email, inviterName, callback)
|
||||||
|
|
||||||
createDomainInvite: (user, licence, callback) ->
|
createDomainInvite: (user, licence, callback) ->
|
||||||
|
logger.log {licence, email: user.email}, "Creating domain team invite"
|
||||||
SubscriptionLocator.getSubscription licence.subscription_id, (error, subscription) ->
|
SubscriptionLocator.getSubscription licence.subscription_id, (error, subscription) ->
|
||||||
return callback(error) if error?
|
return callback(error) if error?
|
||||||
TeamInvitesHandler.createInvite(subscription, user.email, licence.name, callback)
|
createInvite(subscription, user.email, licence.name, callback)
|
||||||
|
|
||||||
acceptInvite: (token, userId, callback) ->
|
acceptInvite: (token, userId, callback) ->
|
||||||
|
logger.log {userId}, "Accepting invite"
|
||||||
TeamInvitesHandler.getInvite token, (err, invite, subscription) ->
|
TeamInvitesHandler.getInvite token, (err, invite, subscription) ->
|
||||||
return callback(err) if err?
|
return callback(err) if err?
|
||||||
return callback(inviteNoLongerValid: true) unless invite?
|
return callback(inviteNoLongerValid: true) unless invite?
|
||||||
|
@ -54,22 +54,19 @@ module.exports = TeamInvitesHandler =
|
||||||
SubscriptionUpdater.addUserToGroup subscription.admin_id, userId, (err) ->
|
SubscriptionUpdater.addUserToGroup subscription.admin_id, userId, (err) ->
|
||||||
return callback(err) if err?
|
return callback(err) if err?
|
||||||
|
|
||||||
TeamInvitesHandler.removeInviteFromTeam(subscription.id, invite.email, callback)
|
removeInviteFromTeam(subscription.id, invite.email, callback)
|
||||||
|
|
||||||
revokeInvite: (teamManagerId, email, callback) ->
|
revokeInvite: (teamManagerId, email, callback) ->
|
||||||
|
logger.log {teamManagerId, email}, "Revoking invite"
|
||||||
SubscriptionLocator.getUsersSubscription teamManagerId, (err, teamSubscription) ->
|
SubscriptionLocator.getUsersSubscription teamManagerId, (err, teamSubscription) ->
|
||||||
return callback(err) if err?
|
return callback(err) if err?
|
||||||
|
|
||||||
TeamInvitesHandler.removeInviteFromTeam(teamSubscription.id, email, callback)
|
removeInviteFromTeam(teamSubscription.id, email, callback)
|
||||||
|
|
||||||
createInvite: (subscription, email, inviterName, callback) ->
|
createInvite = (subscription, email, inviterName, callback) ->
|
||||||
if LimitationsManager.teamHasReachedMemberLimit(subscription)
|
logger.log {subscriptionId: subscription.id, email, inviterName}, "Creating invite"
|
||||||
return callback(limitReached: true)
|
checkIfInviteIsPossible subscription, email, (error, possible, reason) ->
|
||||||
|
return callback(reason) unless possible?
|
||||||
existingInvite = subscription.teamInvites.find (invite) -> invite.email == email
|
|
||||||
|
|
||||||
if existingInvite
|
|
||||||
return callback(alreadyInvited: true)
|
|
||||||
|
|
||||||
token = crypto.randomBytes(32).toString("hex")
|
token = crypto.randomBytes(32).toString("hex")
|
||||||
|
|
||||||
|
@ -93,8 +90,30 @@ module.exports = TeamInvitesHandler =
|
||||||
EmailHandler.sendEmail "verifyEmailToJoinTeam", opts, (error) ->
|
EmailHandler.sendEmail "verifyEmailToJoinTeam", opts, (error) ->
|
||||||
return callback(error, invite)
|
return callback(error, invite)
|
||||||
|
|
||||||
removeInviteFromTeam: (subscriptionId, email, callback) ->
|
removeInviteFromTeam = (subscriptionId, email, callback) ->
|
||||||
searchConditions = { _id: new ObjectId(subscriptionId.toString()) }
|
searchConditions = { _id: new ObjectId(subscriptionId.toString()) }
|
||||||
updateOp = { $pull: { teamInvites: { email: email.trim().toLowerCase() } } }
|
updateOp = { $pull: { teamInvites: { email: email.trim().toLowerCase() } } }
|
||||||
|
|
||||||
Subscription.update(searchConditions, updateOp, callback)
|
Subscription.update(searchConditions, updateOp, callback)
|
||||||
|
|
||||||
|
checkIfInviteIsPossible = (subscription, email, callback = (error, possible, reason) -> ) ->
|
||||||
|
if LimitationsManager.teamHasReachedMemberLimit(subscription)
|
||||||
|
logger.log {subscriptionId: subscription.id}, "team has reached member limit"
|
||||||
|
return callback(null, false, limitReached: true)
|
||||||
|
|
||||||
|
existingInvite = subscription.teamInvites.find (invite) -> invite.email == email
|
||||||
|
|
||||||
|
if existingInvite
|
||||||
|
logger.log {subscriptionId: subscription.id, email}, "user already invited"
|
||||||
|
return callback(null, false, alreadyInvited: true)
|
||||||
|
|
||||||
|
async.map subscription.member_ids, UserLocator.findById, (error, members) ->
|
||||||
|
return callback(error) if error?
|
||||||
|
|
||||||
|
existingMember = members.find (member) -> member.email == email
|
||||||
|
|
||||||
|
if existingMember
|
||||||
|
logger.log {subscriptionId: subscription.id, email}, "user already in team"
|
||||||
|
return callback(null, false, alreadyInTeam: true)
|
||||||
|
else
|
||||||
|
return callback(null, true)
|
||||||
|
|
|
@ -55,7 +55,7 @@ describe "LimitationsManager", ->
|
||||||
|
|
||||||
it "should return the number of collaborators the user is allowed", ->
|
it "should return the number of collaborators the user is allowed", ->
|
||||||
@callback.calledWith(null, @user.features.collaborators).should.equal true
|
@callback.calledWith(null, @user.features.collaborators).should.equal true
|
||||||
|
|
||||||
describe "allowedNumberOfCollaboratorsForUser", ->
|
describe "allowedNumberOfCollaboratorsForUser", ->
|
||||||
describe "when the user has no features", ->
|
describe "when the user has no features", ->
|
||||||
beforeEach ->
|
beforeEach ->
|
||||||
|
@ -286,7 +286,9 @@ describe "LimitationsManager", ->
|
||||||
@subscription =
|
@subscription =
|
||||||
membersLimit: 3
|
membersLimit: 3
|
||||||
member_ids: ["", ""]
|
member_ids: ["", ""]
|
||||||
invited_emails: ["bob@example.com"]
|
teamInvites: [
|
||||||
|
{ email: "bob@example.com", sentAt: new Date(), token: "hey" }
|
||||||
|
]
|
||||||
|
|
||||||
it "should return true if the limit is hit (including members and invites)", (done)->
|
it "should return true if the limit is hit (including members and invites)", (done)->
|
||||||
@SubscriptionLocator.getUsersSubscription.callsArgWith(1, null, @subscription)
|
@SubscriptionLocator.getUsersSubscription.callsArgWith(1, null, @subscription)
|
||||||
|
|
|
@ -24,10 +24,8 @@ describe "SubscriptionGroupController", ->
|
||||||
@GroupHandler =
|
@GroupHandler =
|
||||||
addUserToGroup: sinon.stub().callsArgWith(2, null, @user)
|
addUserToGroup: sinon.stub().callsArgWith(2, null, @user)
|
||||||
removeUserFromGroup: sinon.stub().callsArgWith(2)
|
removeUserFromGroup: sinon.stub().callsArgWith(2)
|
||||||
removeEmailInviteFromGroup: sinon.stub().callsArgWith(2)
|
|
||||||
isUserPartOfGroup: sinon.stub()
|
isUserPartOfGroup: sinon.stub()
|
||||||
sendVerificationEmail:sinon.stub()
|
sendVerificationEmail:sinon.stub()
|
||||||
processGroupVerification:sinon.stub()
|
|
||||||
getPopulatedListOfMembers: sinon.stub().callsArgWith(1, null, [@user])
|
getPopulatedListOfMembers: sinon.stub().callsArgWith(1, null, [@user])
|
||||||
@SubscriptionLocator = getUsersSubscription: sinon.stub().callsArgWith(1, null, @subscription)
|
@SubscriptionLocator = getUsersSubscription: sinon.stub().callsArgWith(1, null, @subscription)
|
||||||
@AuthenticationController =
|
@AuthenticationController =
|
||||||
|
@ -80,16 +78,6 @@ describe "SubscriptionGroupController", ->
|
||||||
done()
|
done()
|
||||||
@Controller.removeUserFromGroup @req, res
|
@Controller.removeUserFromGroup @req, res
|
||||||
|
|
||||||
describe "removeEmailInviteFromGroup", ->
|
|
||||||
it "should use the admin id for the logged in user and take the email from the params", (done)->
|
|
||||||
email = "jo@example.com"
|
|
||||||
@req.params = email: email
|
|
||||||
res =
|
|
||||||
send : =>
|
|
||||||
@GroupHandler.removeEmailInviteFromGroup.calledWith(@adminUserId, email).should.equal true
|
|
||||||
done()
|
|
||||||
@Controller.removeEmailInviteFromGroup @req, res
|
|
||||||
|
|
||||||
describe "renderSubscriptionGroupAdminPage", ->
|
describe "renderSubscriptionGroupAdminPage", ->
|
||||||
it "should redirect you if you don't have a group account", (done)->
|
it "should redirect you if you don't have a group account", (done)->
|
||||||
@subscription.groupPlan = false
|
@subscription.groupPlan = false
|
||||||
|
@ -109,97 +97,6 @@ describe "SubscriptionGroupController", ->
|
||||||
done()
|
done()
|
||||||
@Controller.renderSubscriptionGroupAdminPage @req, res
|
@Controller.renderSubscriptionGroupAdminPage @req, res
|
||||||
|
|
||||||
describe "renderGroupInvitePage", ->
|
|
||||||
describe "with a valid licence", ->
|
|
||||||
beforeEach ->
|
|
||||||
@SubscriptionDomainHandler.findDomainLicenceBySubscriptionId.returns({subscription_id:@subscription_id, adminUser_id:@adminUserId})
|
|
||||||
|
|
||||||
it "should render subscriptions/group/invite if not part of group", (done)->
|
|
||||||
@GroupHandler.isUserPartOfGroup.callsArgWith(2, null, false)
|
|
||||||
res =
|
|
||||||
render : (pageName)=>
|
|
||||||
pageName.should.equal "subscriptions/group/invite"
|
|
||||||
done()
|
|
||||||
@Controller.renderGroupInvitePage @req, res
|
|
||||||
|
|
||||||
it "should redirect to custom page if is already part of group", (done)->
|
|
||||||
@GroupHandler.isUserPartOfGroup.callsArgWith(2, null, true)
|
|
||||||
res =
|
|
||||||
redirect : (location)=>
|
|
||||||
location.should.equal "/user/subscription/custom_account"
|
|
||||||
done()
|
|
||||||
@Controller.renderGroupInvitePage @req, res
|
|
||||||
|
|
||||||
describe "without a valid licence", ->
|
|
||||||
beforeEach ->
|
|
||||||
@SubscriptionDomainHandler.findDomainLicenceBySubscriptionId.returns(undefined)
|
|
||||||
|
|
||||||
it "should send a 500", (done)->
|
|
||||||
@Controller.renderGroupInvitePage @req, {}
|
|
||||||
@ErrorsController.notFound.called.should.equal true
|
|
||||||
done()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
describe "beginJoinGroup", ->
|
|
||||||
describe "with a valid licence", ->
|
|
||||||
beforeEach ->
|
|
||||||
@licenceName = "get amazing licence"
|
|
||||||
@SubscriptionDomainHandler.findDomainLicenceBySubscriptionId.returns({name:@licenceName})
|
|
||||||
@GroupHandler.sendVerificationEmail.callsArgWith(3)
|
|
||||||
|
|
||||||
it "should ask the SubscriptionGroupHandler to send the verification email", (done)->
|
|
||||||
res =
|
|
||||||
sendStatus : (statusCode)=>
|
|
||||||
statusCode.should.equal 200
|
|
||||||
@GroupHandler.sendVerificationEmail.calledWith(@subscription_id, @licenceName, @user_email).should.equal true
|
|
||||||
done()
|
|
||||||
@Controller.beginJoinGroup @req, res
|
|
||||||
|
|
||||||
describe "without a valid licence", ->
|
|
||||||
beforeEach ->
|
|
||||||
@SubscriptionDomainHandler.findDomainLicenceBySubscriptionId.returns(undefined)
|
|
||||||
|
|
||||||
it "should send a 500", (done)->
|
|
||||||
@Controller.beginJoinGroup @req, {}
|
|
||||||
@ErrorsController.notFound.called.should.equal true
|
|
||||||
done()
|
|
||||||
|
|
||||||
|
|
||||||
describe "completeJoin", ->
|
|
||||||
describe "with a valid licence", ->
|
|
||||||
beforeEach ->
|
|
||||||
@GroupHandler.processGroupVerification.callsArgWith(3)
|
|
||||||
@SubscriptionDomainHandler.findDomainLicenceBySubscriptionId.returns({name:@licenceName})
|
|
||||||
|
|
||||||
it "should redirect to the success page upon processGroupVerification", (done)->
|
|
||||||
@req.query.token = @token
|
|
||||||
res =
|
|
||||||
redirect : (location)=>
|
|
||||||
@GroupHandler.processGroupVerification.calledWith(@user_email, @subscription_id, @token).should.equal true
|
|
||||||
location.should.equal "/user/subscription/#{@subscription_id}/group/successful-join"
|
|
||||||
done()
|
|
||||||
@Controller.completeJoin @req, res
|
|
||||||
|
|
||||||
describe "without a valid licence", ->
|
|
||||||
|
|
||||||
it "should send a 500", (done)->
|
|
||||||
@SubscriptionDomainHandler.findDomainLicenceBySubscriptionId.returns(undefined)
|
|
||||||
@Controller.completeJoin @req, {}
|
|
||||||
@ErrorsController.notFound.called.should.equal true
|
|
||||||
done()
|
|
||||||
|
|
||||||
it "should redirect to the invited page with querystring if token was not found", (done)->
|
|
||||||
@SubscriptionDomainHandler.findDomainLicenceBySubscriptionId.returns({name:@licenceName})
|
|
||||||
@req.query.token = @token
|
|
||||||
@GroupHandler.processGroupVerification.callsArgWith(3, "token_not_found")
|
|
||||||
res =
|
|
||||||
redirect : (location)=>
|
|
||||||
location.should.equal "/user/subscription/#{@subscription_id}/group/invited?expired=true"
|
|
||||||
done()
|
|
||||||
@Controller.completeJoin @req, res
|
|
||||||
|
|
||||||
|
|
||||||
describe "exportGroupCsv", ->
|
describe "exportGroupCsv", ->
|
||||||
|
|
||||||
beforeEach ->
|
beforeEach ->
|
||||||
|
|
|
@ -19,19 +19,20 @@ describe "SubscriptionGroupHandler", ->
|
||||||
admin_id:@adminUser_id
|
admin_id:@adminUser_id
|
||||||
_id:@subscription_id
|
_id:@subscription_id
|
||||||
|
|
||||||
@SubscriptionLocator =
|
@SubscriptionLocator =
|
||||||
getUsersSubscription: sinon.stub()
|
getUsersSubscription: sinon.stub()
|
||||||
getSubscriptionByMemberIdAndId: sinon.stub()
|
getSubscriptionByMemberIdAndId: sinon.stub()
|
||||||
getSubscription: sinon.stub()
|
getSubscription: sinon.stub()
|
||||||
|
|
||||||
@UserCreator =
|
@UserCreator =
|
||||||
getUserOrCreateHoldingAccount: sinon.stub().callsArgWith(1, null, @user)
|
getUserOrCreateHoldingAccount: sinon.stub().callsArgWith(1, null, @user)
|
||||||
|
|
||||||
@SubscriptionUpdater =
|
@SubscriptionUpdater =
|
||||||
addUserToGroup: sinon.stub().callsArgWith(2)
|
addUserToGroup: sinon.stub().callsArgWith(2)
|
||||||
removeUserFromGroup: sinon.stub().callsArgWith(2)
|
removeUserFromGroup: sinon.stub().callsArgWith(2)
|
||||||
addEmailInviteToGroup: sinon.stub().callsArgWith(2)
|
|
||||||
removeEmailInviteFromGroup: sinon.stub().callsArgWith(2)
|
@TeamInvitesHandler =
|
||||||
|
createManagerInvite: sinon.stub().callsArgWith(2)
|
||||||
|
|
||||||
@UserLocator =
|
@UserLocator =
|
||||||
findById: sinon.stub()
|
findById: sinon.stub()
|
||||||
|
@ -47,7 +48,7 @@ describe "SubscriptionGroupHandler", ->
|
||||||
@EmailHandler =
|
@EmailHandler =
|
||||||
sendEmail:sinon.stub()
|
sendEmail:sinon.stub()
|
||||||
|
|
||||||
@settings =
|
@settings =
|
||||||
siteUrl:"http://www.sharelatex.com"
|
siteUrl:"http://www.sharelatex.com"
|
||||||
|
|
||||||
@readStub = sinon.stub()
|
@readStub = sinon.stub()
|
||||||
|
@ -58,6 +59,7 @@ describe "SubscriptionGroupHandler", ->
|
||||||
"logger-sharelatex": log:->
|
"logger-sharelatex": log:->
|
||||||
"../User/UserCreator": @UserCreator
|
"../User/UserCreator": @UserCreator
|
||||||
"./SubscriptionUpdater": @SubscriptionUpdater
|
"./SubscriptionUpdater": @SubscriptionUpdater
|
||||||
|
"./TeamInvitesHandler": @TeamInvitesHandler
|
||||||
"./SubscriptionLocator": @SubscriptionLocator
|
"./SubscriptionLocator": @SubscriptionLocator
|
||||||
"../User/UserLocator": @UserLocator
|
"../User/UserLocator": @UserLocator
|
||||||
"./LimitationsManager": @LimitationsManager
|
"./LimitationsManager": @LimitationsManager
|
||||||
|
@ -65,7 +67,7 @@ describe "SubscriptionGroupHandler", ->
|
||||||
"../Email/EmailHandler":@EmailHandler
|
"../Email/EmailHandler":@EmailHandler
|
||||||
"settings-sharelatex":@settings
|
"settings-sharelatex":@settings
|
||||||
"../Notifications/NotificationsBuilder": @NotificationsBuilder
|
"../Notifications/NotificationsBuilder": @NotificationsBuilder
|
||||||
"logger-sharelatex":
|
"logger-sharelatex":
|
||||||
err:->
|
err:->
|
||||||
log:->
|
log:->
|
||||||
warn:->
|
warn:->
|
||||||
|
@ -75,7 +77,7 @@ describe "SubscriptionGroupHandler", ->
|
||||||
beforeEach ->
|
beforeEach ->
|
||||||
@LimitationsManager.hasGroupMembersLimitReached.callsArgWith(1, null, false, @subscription)
|
@LimitationsManager.hasGroupMembersLimitReached.callsArgWith(1, null, false, @subscription)
|
||||||
@UserLocator.findByEmail.callsArgWith(1, null, @user)
|
@UserLocator.findByEmail.callsArgWith(1, null, @user)
|
||||||
|
|
||||||
it "should find the user", (done)->
|
it "should find the user", (done)->
|
||||||
@Handler.addUserToGroup @adminUser_id, @newEmail, (err)=>
|
@Handler.addUserToGroup @adminUser_id, @newEmail, (err)=>
|
||||||
@UserLocator.findByEmail.calledWith(@newEmail).should.equal true
|
@UserLocator.findByEmail.calledWith(@newEmail).should.equal true
|
||||||
|
@ -85,7 +87,7 @@ describe "SubscriptionGroupHandler", ->
|
||||||
@Handler.addUserToGroup @adminUser_id, @newEmail, (err)=>
|
@Handler.addUserToGroup @adminUser_id, @newEmail, (err)=>
|
||||||
@SubscriptionUpdater.addUserToGroup.calledWith(@adminUser_id, @user._id).should.equal true
|
@SubscriptionUpdater.addUserToGroup.calledWith(@adminUser_id, @user._id).should.equal true
|
||||||
done()
|
done()
|
||||||
|
|
||||||
it "should not add the user to the group if the limit has been reached", (done)->
|
it "should not add the user to the group if the limit has been reached", (done)->
|
||||||
@LimitationsManager.hasGroupMembersLimitReached.callsArgWith(1, null, true, @subscription)
|
@LimitationsManager.hasGroupMembersLimitReached.callsArgWith(1, null, true, @subscription)
|
||||||
@Handler.addUserToGroup @adminUser_id, @newEmail, (err)=>
|
@Handler.addUserToGroup @adminUser_id, @newEmail, (err)=>
|
||||||
|
@ -103,11 +105,11 @@ describe "SubscriptionGroupHandler", ->
|
||||||
@NotificationsBuilder.groupPlan.calledWith(@user, {subscription_id:@subscription._id}).should.equal true
|
@NotificationsBuilder.groupPlan.calledWith(@user, {subscription_id:@subscription._id}).should.equal true
|
||||||
@readStub.called.should.equal true
|
@readStub.called.should.equal true
|
||||||
done()
|
done()
|
||||||
|
|
||||||
it "should add an email invite if no user is found", (done) ->
|
it "should add a team invite if no user is found", (done) ->
|
||||||
@UserLocator.findByEmail.callsArgWith(1, null, null)
|
@UserLocator.findByEmail.callsArgWith(1, null, null)
|
||||||
@Handler.addUserToGroup @adminUser_id, @newEmail, (err)=>
|
@Handler.addUserToGroup @adminUser_id, @newEmail, (err)=>
|
||||||
@SubscriptionUpdater.addEmailInviteToGroup.calledWith(@adminUser_id, @newEmail).should.equal true
|
@TeamInvitesHandler.createManagerInvite.calledWith(@adminUser_id, @newEmail).should.equal true
|
||||||
done()
|
done()
|
||||||
|
|
||||||
describe "removeUserFromGroup", ->
|
describe "removeUserFromGroup", ->
|
||||||
|
@ -148,15 +150,18 @@ describe "SubscriptionGroupHandler", ->
|
||||||
assert.deepEqual users[1], {_id:@subscription.member_ids[1]}
|
assert.deepEqual users[1], {_id:@subscription.member_ids[1]}
|
||||||
assert.deepEqual users[2], {_id:@subscription.member_ids[2]}
|
assert.deepEqual users[2], {_id:@subscription.member_ids[2]}
|
||||||
done()
|
done()
|
||||||
|
|
||||||
it "should return any invited users", (done) ->
|
it "should return any invited users", (done) ->
|
||||||
@subscription.invited_emails = ["jo@example.com", "charlie@example.com"]
|
@subscription.teamInvites = [
|
||||||
|
{ email: "jo@example.com" },
|
||||||
|
{ email: "charlie@example.com" }
|
||||||
|
]
|
||||||
@Handler.getPopulatedListOfMembers @adminUser_id, (err, users)=>
|
@Handler.getPopulatedListOfMembers @adminUser_id, (err, users)=>
|
||||||
users[0].email.should.equal "jo@example.com"
|
users[0].email.should.equal "jo@example.com"
|
||||||
users[0].holdingAccount.should.equal true
|
users[0].holdingAccount.should.equal true
|
||||||
users[1].email.should.equal "charlie@example.com"
|
users[1].email.should.equal "charlie@example.com"
|
||||||
users[1].holdingAccount.should.equal true
|
users[1].holdingAccount.should.equal true
|
||||||
users.length.should.equal @subscription.invited_emails.length
|
users.length.should.equal @subscription.teamInvites.length
|
||||||
done()
|
done()
|
||||||
|
|
||||||
describe "isUserPartOfGroup", ->
|
describe "isUserPartOfGroup", ->
|
||||||
|
@ -192,47 +197,3 @@ describe "SubscriptionGroupHandler", ->
|
||||||
emailOpts.to.should.equal @email
|
emailOpts.to.should.equal @email
|
||||||
emailOpts.group_name.should.equal @licenceName
|
emailOpts.group_name.should.equal @licenceName
|
||||||
done()
|
done()
|
||||||
|
|
||||||
describe "processGroupVerification", ->
|
|
||||||
beforeEach ->
|
|
||||||
@token = "31dDAd2Da"
|
|
||||||
@SubscriptionLocator.getSubscription.callsArgWith(1, null, @subscription)
|
|
||||||
@Handler.addUserToGroup = sinon.stub().callsArgWith(2)
|
|
||||||
|
|
||||||
it "should addUserToGroup", (done)->
|
|
||||||
@OneTimeTokenHandler.getValueFromTokenAndExpire.callsArgWith(1, null, @subscription_id)
|
|
||||||
@Handler.processGroupVerification @email, @subscription_id, @token, (err)=>
|
|
||||||
@Handler.addUserToGroup.calledWith(@adminUser_id, @email).should.equal true
|
|
||||||
done()
|
|
||||||
|
|
||||||
it "should return token_not_found error if it couldn't get the token", (done)->
|
|
||||||
@OneTimeTokenHandler.getValueFromTokenAndExpire.callsArgWith(1)
|
|
||||||
@Handler.processGroupVerification @email, @subscription_id, @token, (err)=>
|
|
||||||
err.should.equal "token_not_found"
|
|
||||||
done()
|
|
||||||
|
|
||||||
describe "convertEmailInvitesToMemberships", ->
|
|
||||||
beforeEach ->
|
|
||||||
@SubscriptionLocator.getGroupsWithEmailInvite = sinon.stub().yields(null, @groups = [{ admin_id: "group-1" }, { admin_id: "group-2" }])
|
|
||||||
|
|
||||||
it "should get groups with the email address invited to", (done) ->
|
|
||||||
@Handler.convertEmailInvitesToMemberships @email, @user_id, (err) =>
|
|
||||||
@SubscriptionLocator.getGroupsWithEmailInvite.calledWith(@email).should.equal true
|
|
||||||
done()
|
|
||||||
|
|
||||||
it "should remove the email from each group", (done) ->
|
|
||||||
@Handler.convertEmailInvitesToMemberships @email, @user_id, (err) =>
|
|
||||||
for group in @groups
|
|
||||||
@SubscriptionUpdater.removeEmailInviteFromGroup
|
|
||||||
.calledWith(group.admin_id, @email)
|
|
||||||
.should.equal true
|
|
||||||
done()
|
|
||||||
|
|
||||||
it "should add the user to each group", (done) ->
|
|
||||||
@Handler.convertEmailInvitesToMemberships @email, @user_id, (err) =>
|
|
||||||
for group in @groups
|
|
||||||
@SubscriptionUpdater.addUserToGroup
|
|
||||||
.calledWith(group.admin_id, @user_id)
|
|
||||||
.should.equal true
|
|
||||||
done()
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
SandboxedModule = require('sandboxed-module')
|
||||||
|
should = require('chai').should()
|
||||||
|
sinon = require 'sinon'
|
||||||
|
querystring = require 'querystring'
|
||||||
|
modulePath = "../../../../app/js/Features/Subscription/TeamInvitesHandler"
|
||||||
|
|
||||||
|
describe "TeamInvitesHandler", ->
|
||||||
|
|
||||||
|
describe "getInvite", ->
|
||||||
|
# TODO
|
||||||
|
|
||||||
|
describe "createManagerInvite", ->
|
||||||
|
# TODO
|
||||||
|
|
||||||
|
describe "createDomainInvite", ->
|
||||||
|
# TODO
|
||||||
|
|
||||||
|
describe "acceptInvite", ->
|
||||||
|
# TODO
|
||||||
|
|
||||||
|
describe "revokeInvite", ->
|
||||||
|
# TODO
|
Loading…
Reference in a new issue