UserMembershipHandler.coffee 3.3 KB

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