UserMembershipHandler.coffee 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. ObjectId = require('mongoose').Types.ObjectId
  2. async = require("async")
  3. Errors = require('../Errors/Errors')
  4. EntityModels =
  5. Institution: require('../../models/Institution').Institution
  6. Subscription: require('../../models/Subscription').Subscription
  7. UserMembershipViewModel = require('./UserMembershipViewModel')
  8. UserGetter = require('../User/UserGetter')
  9. logger = require('logger-sharelatex')
  10. module.exports =
  11. getEntity: (entityId, entityConfig, loggedInUser, callback = (error, entity) ->) ->
  12. query = Object.assign({}, entityConfig.baseQuery)
  13. query._id = ObjectId(entityId)
  14. unless loggedInUser.isAdmin
  15. query[entityConfig.fields.access] = ObjectId(loggedInUser._id)
  16. EntityModels[entityConfig.modelName].findOne query, callback
  17. getUsers: (entity, entityConfig, callback = (error, users) ->) ->
  18. attributes = entityConfig.fields.read
  19. getPopulatedListOfMembers(entity, attributes, callback)
  20. addUser: (entity, entityConfig, email, callback = (error, user) ->) ->
  21. attribute = entityConfig.fields.write
  22. UserGetter.getUserByAnyEmail email, (error, user) ->
  23. error ||= new Errors.NotFoundError("No user found with email #{email}") unless user
  24. return callback(error) if error?
  25. addUserToEntity entity, attribute, user, (error) ->
  26. callback(error, UserMembershipViewModel.build(user))
  27. removeUser: (entity, entityConfig, userId, callback = (error) ->) ->
  28. attribute = entityConfig.fields.write
  29. removeUserFromEntity entity, attribute, userId, callback
  30. getPopulatedListOfMembers = (entity, attributes, callback = (error, users)->)->
  31. userObjects = []
  32. for attribute in attributes
  33. for userObject in entity[attribute] or []
  34. # userObject can be an email as String, a user id as ObjectId or an
  35. # invite as Object with an email attribute as String. We want to pass to
  36. # UserMembershipViewModel either an email as (String) or a user id (ObjectId)
  37. userIdOrEmail = userObject.email || userObject
  38. userObjects.push userIdOrEmail
  39. async.map userObjects, UserMembershipViewModel.buildAsync, callback
  40. addUserToEntity = (entity, attribute, user, callback = (error)->) ->
  41. fieldUpdate = {}
  42. fieldUpdate[attribute] = user._id
  43. entity.update { $addToSet: fieldUpdate }, callback
  44. removeUserFromEntity = (entity, attribute, userId, callback = (error)->) ->
  45. fieldUpdate = {}
  46. fieldUpdate[attribute] = userId
  47. entity.update { $pull: fieldUpdate }, callback