UserMembershipHandler.coffee 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. return callback(error) if error?
  25. unless user
  26. return callback(userNotFound: true)
  27. if entity[attribute].some((managerId) -> managerId.equals(user._id))
  28. return callback(alreadyAdded: true)
  29. addUserToEntity entity, attribute, user, (error) ->
  30. callback(error, UserMembershipViewModel.build(user))
  31. removeUser: (entity, entityConfig, userId, callback = (error) ->) ->
  32. attribute = entityConfig.fields.write
  33. if entity.admin_id?.equals(userId)
  34. return callback(isAdmin: true)
  35. removeUserFromEntity entity, attribute, userId, callback
  36. getPopulatedListOfMembers = (entity, attributes, callback = (error, users)->)->
  37. userObjects = []
  38. for attribute in attributes
  39. for userObject in entity[attribute] or []
  40. # userObject can be an email as String, a user id as ObjectId or an
  41. # invite as Object with an email attribute as String. We want to pass to
  42. # UserMembershipViewModel either an email as (String) or a user id (ObjectId)
  43. userIdOrEmail = userObject.email || userObject
  44. userObjects.push userIdOrEmail
  45. async.map userObjects, UserMembershipViewModel.buildAsync, callback
  46. addUserToEntity = (entity, attribute, user, callback = (error)->) ->
  47. fieldUpdate = {}
  48. fieldUpdate[attribute] = user._id
  49. entity.update { $addToSet: fieldUpdate }, callback
  50. removeUserFromEntity = (entity, attribute, userId, callback = (error)->) ->
  51. fieldUpdate = {}
  52. fieldUpdate[attribute] = userId
  53. entity.update { $pull: fieldUpdate }, callback