Invite users in the invited_emails array

We'll remove that attribute soon, but for the time being we want
users to still be able to join the team.
This commit is contained in:
Alberto Fernández Capel 2018-06-06 12:35:13 +01:00
parent 6fb6119ca8
commit e753ef3af5
7 changed files with 63 additions and 14 deletions

View file

@ -30,3 +30,6 @@ module.exports =
getGroupSubscriptionsMemberOf: (user_id, callback)-> getGroupSubscriptionsMemberOf: (user_id, callback)->
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) ->
Subscription.find { invited_emails: email }, callback

View file

@ -63,6 +63,17 @@ module.exports = TeamInvitesHandler =
removeInviteFromTeam(teamSubscription.id, email, callback) removeInviteFromTeam(teamSubscription.id, email, callback)
# Legacy method to allow a user to receive a confirmation email if their
# email is in Subscription.invited_emails when they join. We'll remove this
# after a short while.
createTeamInvitesForLegacyInvitedEmail: (email, callback) ->
SubscriptionLocator.getGroupsWithEmailInvite email, (err, teams) ->
return callback(err) if err?
async.map teams,
(team, cb) -> TeamInvitesHandler.createManagerInvite(team.admin_id, email, cb)
, callback
createInvite = (subscription, email, inviterName, callback) -> createInvite = (subscription, email, inviterName, callback) ->
logger.log {subscriptionId: subscription.id, email, inviterName}, "Creating invite" logger.log {subscriptionId: subscription.id, email, inviterName}, "Creating invite"
checkIfInviteIsPossible subscription, email, (error, possible, reason) -> checkIfInviteIsPossible subscription, email, (error, possible, reason) ->

View file

@ -110,9 +110,9 @@ module.exports = UserController =
logger.err err:err, user_id:user_id, "error getting user for email update" logger.err err:err, user_id:user_id, "error getting user for email update"
return res.send 500 return res.send 500
AuthenticationController.setInSessionUser(req, {email: user.email, first_name: user.first_name, last_name: user.last_name}) AuthenticationController.setInSessionUser(req, {email: user.email, first_name: user.first_name, last_name: user.last_name})
UserHandler.notifyDomainLicence user, (err)-> #need to refresh this in the background UserHandler.populateTeamInvites user, (err)-> #need to refresh this in the background
if err? if err?
logger.err err:err, "error notifyDomainLicence" logger.err err:err, "error populateTeamInvites"
res.sendStatus(200) res.sendStatus(200)
logout : (req, res)-> logout : (req, res)->

View file

@ -1,11 +1,17 @@
SubscriptionDomainHandler = require("../Subscription/SubscriptionDomainHandler") SubscriptionDomainHandler = require("../Subscription/SubscriptionDomainHandler")
NotificationsBuilder = require("../Notifications/NotificationsBuilder") NotificationsBuilder = require("../Notifications/NotificationsBuilder")
SubscriptionGroupHandler = require("../Subscription/SubscriptionGroupHandler") SubscriptionGroupHandler = require("../Subscription/SubscriptionGroupHandler")
TeamInvitesHandler = require("../Subscription/TeamInvitesHandler")
logger = require("logger-sharelatex") logger = require("logger-sharelatex")
module.exports = UserHandler = module.exports = UserHandler =
populateTeamInvites: (user, callback) ->
UserHandler.notifyDomainLicence user, (err) ->
return callback(err) if err?
TeamInvitesHandler.createTeamInvitesForLegacyInvitedEmail(user.email, callback)
notifyDomainLicence: (user, callback = ->)-> notifyDomainLicence: (user, callback = ->)->
logger.log user_id:user._id, "notiying user about a potential domain licence" logger.log user_id:user._id, "notiying user about a potential domain licence"
licence = SubscriptionDomainHandler.getLicenceUserCanJoin user licence = SubscriptionDomainHandler.getLicenceUserCanJoin user
@ -22,8 +28,4 @@ module.exports = UserHandler =
NotificationsBuilder.groupPlan(user, licence).create(callback) NotificationsBuilder.groupPlan(user, licence).create(callback)
setupLoginData: (user, callback = ->)-> setupLoginData: (user, callback = ->)->
@notifyDomainLicence user, callback @populateTeamInvites user, callback
# Backwards compatibility: this is called from the public-registration module
populateGroupLicenceInvite: (user, callback = ->)->
@notifyDomainLicence user, callback

View file

@ -184,11 +184,28 @@ describe "TeamInvitesHandler", ->
).should.eq true ).should.eq true
done() done()
describe "createTeamInvitesForLegacyInvitedEmail", (done) ->
beforeEach ->
@subscription.invited_emails = ["eddard@stark.com", "robert@stark.com"]
@TeamInvitesHandler.createManagerInvite = sinon.stub().yields(null)
@SubscriptionLocator.getGroupsWithEmailInvite = sinon.stub().yields(null, [@subscription])
it "sends an invitation email to addresses in the legacy invited_emails field", (done) ->
@TeamInvitesHandler.createTeamInvitesForLegacyInvitedEmail "eddard@stark.com", (err, invite) =>
expect(err).not.to.exist
@TeamInvitesHandler.createManagerInvite.calledWith(
@subscription.admin_id,
"eddard@stark.com"
).should.eq true
@TeamInvitesHandler.createManagerInvite.callCount.should.eq 1
done()
describe "validation", -> describe "validation", ->
it "doesn't create an invite if the team limit has been reached", (done) -> it "doesn't create an invite if the team limit has been reached", (done) ->
@LimitationsManager.teamHasReachedMemberLimit = sinon.stub().returns(true) @LimitationsManager.teamHasReachedMemberLimit = sinon.stub().returns(true)
@TeamInvitesHandler.createManagerInvite @manager.id, "John.Snow@nightwatch.com", (err, invite) => @TeamInvitesHandler.createManagerInvite @manager.id, "John.Snow@nightwatch.com", (err, invite) =>
console.log('err, invite', err, invite)
expect(err).to.deep.equal(limitReached: true) expect(err).to.deep.equal(limitReached: true)
done() done()

View file

@ -55,7 +55,7 @@ describe "UserController", ->
@settings = @settings =
siteUrl: "sharelatex.example.com" siteUrl: "sharelatex.example.com"
@UserHandler = @UserHandler =
notifyDomainLicence: sinon.stub().callsArgWith(1) populateTeamInvites: sinon.stub().callsArgWith(1)
@UserSessionsManager = @UserSessionsManager =
trackSession: sinon.stub() trackSession: sinon.stub()
untrackSession: sinon.stub() untrackSession: sinon.stub()
@ -267,12 +267,12 @@ describe "UserController", ->
done() done()
@UserController.updateUserSettings @req, @res @UserController.updateUserSettings @req, @res
it "should call notifyDomainLicence", (done)-> it "should call populateTeamInvites", (done)->
@req.body.email = @newEmail.toUpperCase() @req.body.email = @newEmail.toUpperCase()
@UserUpdater.changeEmailAddress.callsArgWith(2) @UserUpdater.changeEmailAddress.callsArgWith(2)
@res.sendStatus = (code)=> @res.sendStatus = (code)=>
code.should.equal 200 code.should.equal 200
@UserHandler.notifyDomainLicence.calledWith(@user).should.equal true @UserHandler.populateTeamInvites.calledWith(@user).should.equal true
done() done()
@UserController.updateUserSettings @req, @res @UserController.updateUserSettings @req, @res

View file

@ -23,17 +23,33 @@ describe "UserHandler", ->
@NotificationsBuilder = @NotificationsBuilder =
groupPlan:sinon.stub().returns({create:@createStub}) groupPlan:sinon.stub().returns({create:@createStub})
@TeamInvitesHandler =
createTeamInvitesForLegacyInvitedEmail: sinon.stub().yields()
@UserHandler = SandboxedModule.require modulePath, requires: @UserHandler = SandboxedModule.require modulePath, requires:
"logger-sharelatex": @logger = { log: sinon.stub() } "logger-sharelatex": @logger = { log: sinon.stub() }
"../Notifications/NotificationsBuilder":@NotificationsBuilder "../Notifications/NotificationsBuilder":@NotificationsBuilder
"../Subscription/SubscriptionDomainHandler":@SubscriptionDomainHandler "../Subscription/SubscriptionDomainHandler":@SubscriptionDomainHandler
"../Subscription/SubscriptionGroupHandler":@SubscriptionGroupHandler "../Subscription/SubscriptionGroupHandler":@SubscriptionGroupHandler
"../Subscription/TeamInvitesHandler": @TeamInvitesHandler
describe "populateTeamInvites", ->
beforeEach (done)->
@UserHandler.notifyDomainLicence = sinon.stub().yields()
@UserHandler.populateTeamInvites @user, done
it "notifies the user about domain licences zzzzz", ->
@UserHandler.notifyDomainLicence.calledWith(@user).should.eq true
it "notifies the user about legacy team invites", ->
@TeamInvitesHandler.createTeamInvitesForLegacyInvitedEmail
.calledWith(@user.email).should.eq true
describe "notifyDomainLicence", -> describe "notifyDomainLicence", ->
describe "no licence", -> describe "no licence", ->
beforeEach (done)-> beforeEach (done)->
@SubscriptionDomainHandler.getLicenceUserCanJoin.returns() @SubscriptionDomainHandler.getLicenceUserCanJoin.returns()
@UserHandler.notifyDomainLicence @user, done @UserHandler.populateTeamInvites @user, done
it "should not call NotificationsBuilder", (done)-> it "should not call NotificationsBuilder", (done)->
@NotificationsBuilder.groupPlan.called.should.equal false @NotificationsBuilder.groupPlan.called.should.equal false
@ -47,7 +63,7 @@ describe "UserHandler", ->
beforeEach (done)-> beforeEach (done)->
@SubscriptionDomainHandler.getLicenceUserCanJoin.returns(@licence) @SubscriptionDomainHandler.getLicenceUserCanJoin.returns(@licence)
@SubscriptionGroupHandler.isUserPartOfGroup.callsArgWith(2, null, false) @SubscriptionGroupHandler.isUserPartOfGroup.callsArgWith(2, null, false)
@UserHandler.notifyDomainLicence @user, done @UserHandler.populateTeamInvites @user, done
it "should create notifcation", (done)-> it "should create notifcation", (done)->
@NotificationsBuilder.groupPlan.calledWith(@user, @licence).should.equal true @NotificationsBuilder.groupPlan.calledWith(@user, @licence).should.equal true
@ -57,7 +73,7 @@ describe "UserHandler", ->
beforeEach (done)-> beforeEach (done)->
@SubscriptionDomainHandler.getLicenceUserCanJoin.returns(@licence) @SubscriptionDomainHandler.getLicenceUserCanJoin.returns(@licence)
@SubscriptionGroupHandler.isUserPartOfGroup.callsArgWith(2, null, true) @SubscriptionGroupHandler.isUserPartOfGroup.callsArgWith(2, null, true)
@UserHandler.notifyDomainLicence @user, done @UserHandler.populateTeamInvites @user, done
it "should create notifcation", (done)-> it "should create notifcation", (done)->
@NotificationsBuilder.groupPlan.called.should.equal false @NotificationsBuilder.groupPlan.called.should.equal false