ThirdPartyIdentityManager.coffee 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. Errors = require "../Errors/Errors"
  2. User = require("../../models/User").User
  3. UserUpdater = require "./UserUpdater"
  4. _ = require "lodash"
  5. module.exports = ThirdPartyIdentityManager =
  6. login: (providerId, externalUserId, externalData, callback) ->
  7. return callback(new Error "invalid arguments") unless providerId? and externalUserId?
  8. externalUserId = externalUserId.toString()
  9. providerId = providerId.toString()
  10. query =
  11. "thirdPartyIdentifiers.externalUserId": externalUserId
  12. "thirdPartyIdentifiers.providerId": providerId
  13. User.findOne query, (err, user) ->
  14. return callback err if err?
  15. return callback(new Errors.ThirdPartyUserNotFoundError()) unless user
  16. # skip updating data unless passed
  17. return callback(null, user) unless externalData
  18. # get third party identifier object from array
  19. thirdPartyIdentifier = user.thirdPartyIdentifiers.find (tpi) ->
  20. tpi.externalUserId == externalUserId and tpi.providerId == providerId
  21. # do recursive merge of new data over existing data
  22. _.merge(thirdPartyIdentifier.externalData, externalData)
  23. # update user
  24. update = "thirdPartyIdentifiers.$": thirdPartyIdentifier
  25. User.findOneAndUpdate query, update, {new: true}, callback
  26. # register: () ->
  27. # this should be implemented once we move to having v2 as the master
  28. # but for now we need to register with v1 then call link once that
  29. # is complete
  30. link: (user_id, providerId, externalUserId, externalData, callback, retry) ->
  31. query =
  32. _id: user_id
  33. "thirdPartyIdentifiers.providerId": $ne: providerId
  34. update = $push: thirdPartyIdentifiers:
  35. externalUserId: externalUserId
  36. externalData: externalData
  37. providerId: providerId
  38. # add new tpi only if an entry for the provider does not exist
  39. UserUpdater.updateUser query, update, (err, res) ->
  40. return callback err if err?
  41. return callback null, res if res.nModified == 1
  42. # if already retried then throw error
  43. return callback(new Error "update failed") if retry
  44. # attempt to clear existing entry then retry
  45. ThirdPartyIdentityManager.unlink user_id, providerId, (err) ->
  46. return callback err if err?
  47. ThirdPartyIdentityManager.link user_id, providerId, externalUserId, externalData, callback, true
  48. unlink: (user_id, providerId, callback) ->
  49. update = $pull: thirdPartyIdentifiers:
  50. providerId: providerId
  51. UserUpdater.updateUser user_id, update, callback