Return custom error if provider linked to another account

GitOrigin-RevId: c34a615b210a22e220736c9ba44d17be5add491b
This commit is contained in:
Jessica Lawshe
2019-07-03 08:50:51 +00:00
committed by sharelatex
parent 27985458ea
commit f8d895100a
3 changed files with 38 additions and 2 deletions
+13 -1
View File
@@ -139,13 +139,24 @@ var SLInV2Error = function(message) {
} }
SLInV2Error.prototype.__proto__ = Error.prototype SLInV2Error.prototype.__proto__ = Error.prototype
const ThirdPartyIdentityExistsError = function(message) {
if (message == null) {
message = 'provider and external id already linked to another account'
}
const error = new Error(message)
error.name = 'ThirdPartyIdentityExistsError'
error.__proto__ = ThirdPartyIdentityExistsError.prototype
return error
}
ThirdPartyIdentityExistsError.prototype.__proto__ = Error.prototype
const ThirdPartyUserNotFoundError = function(message) { const ThirdPartyUserNotFoundError = function(message) {
if (message == null) { if (message == null) {
message = 'user not found for provider and external id' message = 'user not found for provider and external id'
} }
const error = new Error(message) const error = new Error(message)
error.name = 'ThirdPartyUserNotFoundError' error.name = 'ThirdPartyUserNotFoundError'
error.__proto__ = SLInV2Error.prototype error.__proto__ = ThirdPartyUserNotFoundError.prototype
return error return error
} }
ThirdPartyUserNotFoundError.prototype.__proto__ = Error.prototype ThirdPartyUserNotFoundError.prototype.__proto__ = Error.prototype
@@ -178,6 +189,7 @@ module.exports = Errors = {
AccountMergeError, AccountMergeError,
NotInV2Error, NotInV2Error,
SLInV2Error, SLInV2Error,
ThirdPartyIdentityExistsError,
ThirdPartyUserNotFoundError, ThirdPartyUserNotFoundError,
SubscriptionAdminDeletionError SubscriptionAdminDeletionError
} }
@@ -94,6 +94,9 @@ const ThirdPartyIdentityManager = (module.exports = {
} }
// add new tpi only if an entry for the provider does not exist // add new tpi only if an entry for the provider does not exist
UserUpdater.updateUser(query, update, function(err, res) { UserUpdater.updateUser(query, update, function(err, res) {
if (err && err.code === 11000) {
return callback(new Errors.ThirdPartyIdentityExistsError())
}
if (err != null) { if (err != null) {
return callback(err) return callback(err)
} }
@@ -24,7 +24,7 @@ describe('ThirdPartyIdentityManager', function() {
this.externalUserId = 'external-user-id' this.externalUserId = 'external-user-id'
this.externalData = { test: 'data' } this.externalData = { test: 'data' }
this.user = new User() this.user = new User()
return this.user.ensureUserExists(done) this.user.ensureUserExists(done)
}) })
afterEach(function(done) { afterEach(function(done) {
@@ -161,6 +161,27 @@ describe('ThirdPartyIdentityManager', function() {
} }
) )
}) })
// describe('when another account tries to link same provider/externalUserId', function() {
// NOTE: Cannot run this test because we do not have indexes on the test DB
// beforeEach(function(done) {
// this.user2 = new User()
// this.user2.ensureUserExists(done)
// })
// it('should not link provider', function(done) {
// ThirdPartyIdentityManager.link(
// this.user2.id,
// this.provider,
// this.externalUserId,
// this.externalData,
// (err, user) => {
// expect(err.name).to.equal('ThirdPartyIdentityExistsError')
// return done()
// }
// )
// this.user2.full_delete_user(this.user2.email, done)
// })
// })
}) })
}) })