UserMembershipHandler.coffee 3.1 KB

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