DropboxWebhookHandler.coffee 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. logger = require("logger-sharelatex")
  2. settings = require("settings-sharelatex")
  3. async = require "async"
  4. User = require("../../models/User").User
  5. TpdsUpdateSender = require "../ThirdPartyDataStore/TpdsUpdateSender"
  6. redis = require('redis')
  7. rclient = redis.createClient(settings.redis.web.port, settings.redis.web.host)
  8. rclient.auth(settings.redis.web.password)
  9. module.exports = DropboxWebhookHandler =
  10. pollDropboxUids: (dropbox_uids, callback = (error) ->) ->
  11. jobs = []
  12. for uid in dropbox_uids
  13. do (uid) ->
  14. jobs.push (callback) ->
  15. DropboxWebhookHandler.pollDropboxUid uid, callback
  16. async.series jobs, callback
  17. pollDropboxUid: (dropbox_uid, callback = (error) ->) ->
  18. DropboxWebhookHandler._delayAndBatchPoll dropbox_uid, (error, shouldPoll) ->
  19. return callback(error) if error?
  20. return callback() if !shouldPoll
  21. User.find {
  22. "dropbox.access_token.uid": dropbox_uid.toString()
  23. "features.dropbox": true
  24. }, (error, users = []) ->
  25. return callback(error) if error?
  26. user = users[0]
  27. if !user?
  28. logger.log dropbox_uid: dropbox_uid, "no sharelatex user found"
  29. return callback()
  30. TpdsUpdateSender.pollDropboxForUser user._id, callback
  31. POLL_DELAY_IN_MS: 5000 # 5 seconds
  32. _delayAndBatchPoll: (dropbox_uid, callback = (error, shouldPoll) ->) ->
  33. rclient.set(
  34. "dropbox-poll-lock:#{dropbox_uid}", "LOCK",
  35. "PX", DropboxWebhookHandler.POLL_DELAY_IN_MS,
  36. "NX",
  37. (error, gotLock) ->
  38. return callback(error) if error?
  39. if gotLock
  40. setTimeout () ->
  41. callback(null, true)
  42. , DropboxWebhookHandler.POLL_DELAY_IN_MS
  43. else
  44. callback(null, false)
  45. )