Check all emails to prevent invite duplicates

This commit is contained in:
Alberto Fernández Capel 2018-06-07 12:49:46 +01:00
parent 566c41cafd
commit 959db80177
2 changed files with 12 additions and 6 deletions

View file

@ -118,10 +118,12 @@ checkIfInviteIsPossible = (subscription, email, callback = (error, possible, rea
logger.log {subscriptionId: subscription.id}, "team has reached member limit" logger.log {subscriptionId: subscription.id}, "team has reached member limit"
return callback(null, false, limitReached: true) return callback(null, false, limitReached: true)
async.map subscription.member_ids, UserGetter.getUser, (error, members) -> UserGetter.getUserByAnyEmail email, (error, existingUser) ->
return callback(error) if error? return callback(error) if error?
return callback(null, true) unless existingUser?
existingMember = members.find (member) -> member.email == email existingMember = subscription.member_ids.find (memberId) ->
memberId.toString() == existingUser._id.toString()
if existingMember if existingMember
logger.log {subscriptionId: subscription.id, email}, "user already in team" logger.log {subscriptionId: subscription.id, email}, "user already in team"

View file

@ -37,7 +37,8 @@ describe "TeamInvitesHandler", ->
} }
@UserGetter = { @UserGetter = {
getUser: sinon.stub() getUser: sinon.stub().yields(),
getUserByAnyEmail: sinon.stub().yields()
} }
@SubscriptionUpdater = { @SubscriptionUpdater = {
@ -65,6 +66,8 @@ describe "TeamInvitesHandler", ->
} }
@UserGetter.getUser.withArgs(@manager.id).yields(null, @manager) @UserGetter.getUser.withArgs(@manager.id).yields(null, @manager)
@UserGetter.getUserByAnyEmail.withArgs(@manager.email).yields(null, @manager)
@SubscriptionLocator.getUsersSubscription.yields(null, @subscription) @SubscriptionLocator.getUsersSubscription.yields(null, @subscription)
@Subscription.findOne.yields(null, @subscription) @Subscription.findOne.yields(null, @subscription)
@ -170,7 +173,7 @@ describe "TeamInvitesHandler", ->
email: "tyrion@lannister.com" email: "tyrion@lannister.com"
} }
@UserGetter.getUser.withArgs(@user.id).yields(null, @user) @UserGetter.getUserByAnyEmail.withArgs(@user.email).yields(null, @user)
@subscription.teamInvites.push({ @subscription.teamInvites.push({
email: "john.snow@nightwatch.com", email: "john.snow@nightwatch.com",
@ -226,14 +229,15 @@ describe "TeamInvitesHandler", ->
expect(err).to.deep.equal(limitReached: true) expect(err).to.deep.equal(limitReached: true)
done() done()
it "doen't create an invite if the user is already part of the team", (done) -> it "doesn't create an invite if the user is already part of the team", (done) ->
member = { member = {
id: "1a2b", id: "1a2b",
_id: "1a2b",
email: "tyrion@lannister.com" email: "tyrion@lannister.com"
} }
@subscription.member_ids = [member.id] @subscription.member_ids = [member.id]
@UserGetter.getUser.withArgs(member.id).yields(null, member) @UserGetter.getUserByAnyEmail.withArgs(member.email).yields(null, member)
@TeamInvitesHandler.createManagerInvite @manager.id, "tyrion@lannister.com", (err, invite) => @TeamInvitesHandler.createManagerInvite @manager.id, "tyrion@lannister.com", (err, invite) =>
expect(err).to.deep.equal(alreadyInTeam: true) expect(err).to.deep.equal(alreadyInTeam: true)