DropboxWebhookHandler.coffee 1.5 KB

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