UserMembershipHandler.coffee 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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, callback = (error, entity) ->) ->
  14. query = buildEntityQuery(entityId, entityConfig)
  15. unless loggedInUser.isAdmin
  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. getEntitiesByUser: (entityConfig, userId, callback = (error, entities) ->) ->
  43. query = Object.assign({}, entityConfig.baseQuery)
  44. query[entityConfig.fields.access] = userId
  45. EntityModels[entityConfig.modelName].find query, (error, entities = []) ->
  46. return callback(error) if error?
  47. async.mapSeries entities,
  48. (entity, cb) -> entity.fetchV1Data(cb),
  49. callback
  50. getPopulatedListOfMembers = (entity, attributes, callback = (error, users)->)->
  51. userObjects = []
  52. for attribute in attributes
  53. for userObject in entity[attribute] or []
  54. # userObject can be an email as String, a user id as ObjectId or an
  55. # invite as Object with an email attribute as String. We want to pass to
  56. # UserMembershipViewModel either an email as (String) or a user id (ObjectId)
  57. userIdOrEmail = userObject.email || userObject
  58. userObjects.push userIdOrEmail
  59. async.map userObjects, UserMembershipViewModel.buildAsync, callback
  60. addUserToEntity = (entity, attribute, user, callback = (error)->) ->
  61. fieldUpdate = {}
  62. fieldUpdate[attribute] = user._id
  63. entity.update { $addToSet: fieldUpdate }, callback
  64. removeUserFromEntity = (entity, attribute, userId, callback = (error)->) ->
  65. fieldUpdate = {}
  66. fieldUpdate[attribute] = userId
  67. entity.update { $pull: fieldUpdate }, callback
  68. buildEntityQuery = (entityId, entityConfig, loggedInUser) ->
  69. entityId = ObjectId(entityId) if ObjectId.isValid(entityId.toString())
  70. query = Object.assign({}, entityConfig.baseQuery)
  71. query[entityConfig.fields.primaryKey] = entityId
  72. query