UserMembershipHandler.coffee 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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. entityId = ObjectId(entityId) if ObjectId.isValid(entityId.toString())
  13. query = Object.assign({}, entityConfig.baseQuery)
  14. query[entityConfig.fields.primaryKey] = entityId
  15. unless loggedInUser.isAdmin
  16. query[entityConfig.fields.access] = ObjectId(loggedInUser._id)
  17. EntityModels[entityConfig.modelName].findOne query, callback
  18. getUsers: (entity, entityConfig, callback = (error, users) ->) ->
  19. attributes = entityConfig.fields.read
  20. getPopulatedListOfMembers(entity, attributes, callback)
  21. addUser: (entity, entityConfig, email, callback = (error, user) ->) ->
  22. attribute = entityConfig.fields.write
  23. UserGetter.getUserByAnyEmail email, (error, user) ->
  24. error ||= new Errors.NotFoundError("No user found with email #{email}") unless user
  25. return callback(error) if error?
  26. addUserToEntity entity, attribute, user, (error) ->
  27. callback(error, UserMembershipViewModel.build(user))
  28. removeUser: (entity, entityConfig, userId, callback = (error) ->) ->
  29. attribute = entityConfig.fields.write
  30. removeUserFromEntity entity, attribute, userId, callback
  31. getPopulatedListOfMembers = (entity, attributes, callback = (error, users)->)->
  32. userObjects = []
  33. for attribute in attributes
  34. for userObject in entity[attribute] or []
  35. # userObject can be an email as String, a user id as ObjectId or an
  36. # invite as Object with an email attribute as String. We want to pass to
  37. # UserMembershipViewModel either an email as (String) or a user id (ObjectId)
  38. userIdOrEmail = userObject.email || userObject
  39. userObjects.push userIdOrEmail
  40. async.map userObjects, UserMembershipViewModel.buildAsync, callback
  41. addUserToEntity = (entity, attribute, user, callback = (error)->) ->
  42. fieldUpdate = {}
  43. fieldUpdate[attribute] = user._id
  44. entity.update { $addToSet: fieldUpdate }, callback
  45. removeUserFromEntity = (entity, attribute, userId, callback = (error)->) ->
  46. fieldUpdate = {}
  47. fieldUpdate[attribute] = userId
  48. entity.update { $pull: fieldUpdate }, callback