UserMembershipHandler.coffee 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. UserMembershipEntityConfigs = require "./UserMembershipEntityConfigs"
  11. module.exports =
  12. getEntity: (entityId, entityConfig, loggedInUser, callback = (error, entity) ->) ->
  13. entityId = ObjectId(entityId) if ObjectId.isValid(entityId.toString())
  14. query = Object.assign({}, entityConfig.baseQuery)
  15. query[entityConfig.fields.primaryKey] = entityId
  16. unless loggedInUser.isAdmin
  17. query[entityConfig.fields.access] = ObjectId(loggedInUser._id)
  18. EntityModels[entityConfig.modelName].findOne query, callback
  19. getUsers: (entity, entityConfig, callback = (error, users) ->) ->
  20. attributes = entityConfig.fields.read
  21. getPopulatedListOfMembers(entity, attributes, callback)
  22. addUser: (entity, entityConfig, email, callback = (error, user) ->) ->
  23. attribute = entityConfig.fields.write
  24. UserGetter.getUserByAnyEmail email, (error, user) ->
  25. return callback(error) if error?
  26. unless user
  27. return callback(userNotFound: true)
  28. if entity[attribute].some((managerId) -> managerId.equals(user._id))
  29. return callback(alreadyAdded: true)
  30. addUserToEntity entity, attribute, user, (error) ->
  31. callback(error, UserMembershipViewModel.build(user))
  32. removeUser: (entity, entityConfig, userId, callback = (error) ->) ->
  33. attribute = entityConfig.fields.write
  34. if entity.admin_id?.equals(userId)
  35. return callback(isAdmin: true)
  36. removeUserFromEntity entity, attribute, userId, callback
  37. getEntitiesByUser: (entityConfig, userId, callback = (error, entities) ->) ->
  38. query = Object.assign({}, entityConfig.baseQuery)
  39. query[entityConfig.fields.access] = userId
  40. EntityModels[entityConfig.modelName].find query, (error, entities = []) ->
  41. return callback(error) if error?
  42. async.mapSeries entities,
  43. (entity, cb) -> entity.fetchV1Data(cb),
  44. callback
  45. getPopulatedListOfMembers = (entity, attributes, callback = (error, users)->)->
  46. userObjects = []
  47. for attribute in attributes
  48. for userObject in entity[attribute] or []
  49. # userObject can be an email as String, a user id as ObjectId or an
  50. # invite as Object with an email attribute as String. We want to pass to
  51. # UserMembershipViewModel either an email as (String) or a user id (ObjectId)
  52. userIdOrEmail = userObject.email || userObject
  53. userObjects.push userIdOrEmail
  54. async.map userObjects, UserMembershipViewModel.buildAsync, callback
  55. addUserToEntity = (entity, attribute, user, callback = (error)->) ->
  56. fieldUpdate = {}
  57. fieldUpdate[attribute] = user._id
  58. entity.update { $addToSet: fieldUpdate }, callback
  59. removeUserFromEntity = (entity, attribute, userId, callback = (error)->) ->
  60. fieldUpdate = {}
  61. fieldUpdate[attribute] = userId
  62. entity.update { $pull: fieldUpdate }, callback