ConnectedUsersManager.coffee 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. _ = require("underscore")
  2. async = require("async")
  3. Settings = require('settings-sharelatex')
  4. logger = require("logger-sharelatex")
  5. redis = require('redis')
  6. rclient = redis.createClient(Settings.redis.web.port, Settings.redis.web.host)
  7. rclient.auth(Settings.redis.web.password)
  8. ONE_HOUR_IN_S = 60 * 60
  9. buildProjectSetKey = (project_id)-> return "users_in_project:#{project_id}"
  10. buildUserKey = (project_id, user_id)-> return "connected_user:#{project_id}:#{user_id}"
  11. module.exports =
  12. markUserAsConnected: (project_id, user_id, callback = (err)->)->
  13. logger.log project_id:project_id, user_id:user_id, "marking user as connected"
  14. async.series [
  15. (cb)->
  16. rclient.sadd buildProjectSetKey(project_id), user_id, cb
  17. (cb)->
  18. ttl = ONE_HOUR_IN_S * 6
  19. rclient.setex buildUserKey(project_id, user_id), ttl, new Date(), cb
  20. ], (err)->
  21. if err?
  22. logger.err err:err, project_id:project_id, user_id:user_id, "problem marking user as connected"
  23. callback(err)
  24. markUserAsDisconnected: (project_id, user_id, callback)->
  25. logger.log project_id:project_id, user_id:user_id, "marking user as disconnected"
  26. async.series [
  27. (cb)->
  28. rclient.srem buildProjectSetKey(project_id), user_id, cb
  29. (cb)->
  30. rclient.del buildUserKey(project_id, user_id), cb
  31. ], callback
  32. _getConnectedUser: (project_id, user_id, callback)->
  33. rclient.get buildUserKey(project_id, user_id), (err, result)->
  34. if !result?
  35. connected = false
  36. else
  37. connected = true
  38. callback err, {connected:connected, user_id:user_id}
  39. getConnectedUsers: (project_id, callback)->
  40. self = @
  41. rclient.smembers buildProjectSetKey(project_id), (err, results)->
  42. jobs = results.map (user_id)->
  43. (cb)->
  44. self._getConnectedUser(project_id, user_id, cb)
  45. async.series jobs, (err, users)->
  46. users = _.filter users, (user)->
  47. user.connected
  48. user_ids = _.map users, (user)->
  49. user.user_id
  50. callback err, user_ids