|
@@ -1,30 +1,51 @@
|
|
|
Errors = require "../Errors/Errors"
|
|
Errors = require "../Errors/Errors"
|
|
|
User = require("../../models/User").User
|
|
User = require("../../models/User").User
|
|
|
|
|
+UserStub = require("../../models/UserStub").UserStub
|
|
|
UserUpdater = require "./UserUpdater"
|
|
UserUpdater = require "./UserUpdater"
|
|
|
_ = require "lodash"
|
|
_ = require "lodash"
|
|
|
|
|
|
|
|
module.exports = ThirdPartyIdentityManager =
|
|
module.exports = ThirdPartyIdentityManager =
|
|
|
login: (providerId, externalUserId, externalData, callback) ->
|
|
login: (providerId, externalUserId, externalData, callback) ->
|
|
|
return callback(new Error "invalid arguments") unless providerId? and externalUserId?
|
|
return callback(new Error "invalid arguments") unless providerId? and externalUserId?
|
|
|
- externalUserId = externalUserId.toString()
|
|
|
|
|
- providerId = providerId.toString()
|
|
|
|
|
- query =
|
|
|
|
|
- "thirdPartyIdentifiers.externalUserId": externalUserId
|
|
|
|
|
- "thirdPartyIdentifiers.providerId": providerId
|
|
|
|
|
|
|
+ query = ThirdPartyIdentityManager._loginQuery providerId, externalUserId
|
|
|
User.findOne query, (err, user) ->
|
|
User.findOne query, (err, user) ->
|
|
|
return callback err if err?
|
|
return callback err if err?
|
|
|
return callback(new Errors.ThirdPartyUserNotFoundError()) unless user
|
|
return callback(new Errors.ThirdPartyUserNotFoundError()) unless user
|
|
|
- # skip updating data unless passed
|
|
|
|
|
return callback(null, user) unless externalData
|
|
return callback(null, user) unless externalData
|
|
|
- # get third party identifier object from array
|
|
|
|
|
- thirdPartyIdentifier = user.thirdPartyIdentifiers.find (tpi) ->
|
|
|
|
|
- tpi.externalUserId == externalUserId and tpi.providerId == providerId
|
|
|
|
|
- # do recursive merge of new data over existing data
|
|
|
|
|
- _.merge(thirdPartyIdentifier.externalData, externalData)
|
|
|
|
|
- # update user
|
|
|
|
|
- update = "thirdPartyIdentifiers.$": thirdPartyIdentifier
|
|
|
|
|
|
|
+ update = ThirdPartyIdentityManager._loginUpdate user, providerId, externalUserId, externalData
|
|
|
User.findOneAndUpdate query, update, {new: true}, callback
|
|
User.findOneAndUpdate query, update, {new: true}, callback
|
|
|
|
|
|
|
|
|
|
+ # attempt to login normally but check for user stub if user not found
|
|
|
|
|
+ loginUserStub: (providerId, externalUserId, externalData, callback) ->
|
|
|
|
|
+ ThirdPartyIdentityManager.login providerId, externalUserId, externalData, (err, user) ->
|
|
|
|
|
+ return callback null, user unless err?
|
|
|
|
|
+ return callback err unless err.name == "ThirdPartyUserNotFoundError"
|
|
|
|
|
+ query = ThirdPartyIdentityManager._loginQuery providerId, externalUserId
|
|
|
|
|
+ UserStub.findOne query, (err, userStub) ->
|
|
|
|
|
+ return callback err if err?
|
|
|
|
|
+ return callback(new Errors.ThirdPartyUserNotFoundError()) unless userStub
|
|
|
|
|
+ return callback(null, userStub) unless externalData
|
|
|
|
|
+ update = ThirdPartyIdentityManager._loginUpdate userStub, providerId, externalUserId, externalData
|
|
|
|
|
+ UserStub.findOneAndUpdate query, update, {new: true}, callback
|
|
|
|
|
+
|
|
|
|
|
+ _loginQuery: (providerId, externalUserId) ->
|
|
|
|
|
+ externalUserId = externalUserId.toString()
|
|
|
|
|
+ providerId = providerId.toString()
|
|
|
|
|
+ query =
|
|
|
|
|
+ "thirdPartyIdentifiers.externalUserId": externalUserId
|
|
|
|
|
+ "thirdPartyIdentifiers.providerId": providerId
|
|
|
|
|
+ return query
|
|
|
|
|
+
|
|
|
|
|
+ _loginUpdate: (user, providerId, externalUserId, externalData) ->
|
|
|
|
|
+ providerId = providerId.toString()
|
|
|
|
|
+ # get third party identifier object from array
|
|
|
|
|
+ thirdPartyIdentifier = user.thirdPartyIdentifiers.find (tpi) ->
|
|
|
|
|
+ tpi.externalUserId == externalUserId and tpi.providerId == providerId
|
|
|
|
|
+ # do recursive merge of new data over existing data
|
|
|
|
|
+ _.merge(thirdPartyIdentifier.externalData, externalData)
|
|
|
|
|
+ update = "thirdPartyIdentifiers.$": thirdPartyIdentifier
|
|
|
|
|
+ return update
|
|
|
|
|
+
|
|
|
# register: () ->
|
|
# register: () ->
|
|
|
# this should be implemented once we move to having v2 as the master
|
|
# this should be implemented once we move to having v2 as the master
|
|
|
# but for now we need to register with v1 then call link once that
|
|
# but for now we need to register with v1 then call link once that
|