Delay Dropbox polling by 5 seconds and dispatch only a single request

This commit is contained in:
James Allen
2014-08-14 13:48:23 +01:00
parent 7816810249
commit 9be7228247
3 changed files with 98 additions and 22 deletions
@@ -10,6 +10,10 @@ module.exports = DropboxWebhookController =
logger.log dropbox_uids: dropbox_uids, "received webhook request from Dropbox"
if !dropbox_uids?
return res.send(400) # Bad Request
# Do this in the background so as not to keep Dropbox waiting
DropboxWebhookHandler.pollDropboxUids dropbox_uids, (error) ->
return next(error) if error?
res.send(200)
if error?
logger.error err: error, dropbox_uids: dropbox_uids, "error in webhook"
res.send(200)
@@ -1,8 +1,13 @@
logger = require("logger-sharelatex")
settings = require("settings-sharelatex")
async = require "async"
User = require("../../models/User").User
TpdsUpdateSender = require "../ThirdPartyDataStore/TpdsUpdateSender"
redis = require('redis')
rclient = redis.createClient(settings.redis.web.port, settings.redis.web.host)
rclient.auth(settings.redis.web.password)
module.exports = DropboxWebhookHandler =
pollDropboxUids: (dropbox_uids, callback = (error) ->) ->
jobs = []
@@ -13,13 +18,32 @@ module.exports = DropboxWebhookHandler =
async.series jobs, callback
pollDropboxUid: (dropbox_uid, callback = (error) ->) ->
User.find {
"dropbox.access_token.uid": dropbox_uid.toString()
"features.dropbox": true
}, (error, users = []) ->
DropboxWebhookHandler._delayAndBatchPoll dropbox_uid, (error, shouldPoll) ->
return callback(error) if error?
user = users[0]
if !user?
logger.log dropbox_uid: dropbox_uid, "no sharelatex user found"
return callback()
TpdsUpdateSender.pollDropboxForUser user._id, callback
return callback() if !shouldPoll
User.find {
"dropbox.access_token.uid": dropbox_uid.toString()
"features.dropbox": true
}, (error, users = []) ->
return callback(error) if error?
user = users[0]
if !user?
logger.log dropbox_uid: dropbox_uid, "no sharelatex user found"
return callback()
TpdsUpdateSender.pollDropboxForUser user._id, callback
POLL_DELAY_IN_MS: 5000 # 5 seconds
_delayAndBatchPoll: (dropbox_uid, callback = (error, shouldPoll) ->) ->
rclient.set(
"dropbox-poll-lock:#{dropbox_uid}", "LOCK",
"PX", DropboxWebhookHandler.POLL_DELAY_IN_MS,
"NX",
(error, gotLock) ->
return callback(error) if error?
if gotLock
setTimeout () ->
callback(null, true)
, DropboxWebhookHandler.POLL_DELAY_IN_MS
else
callback(null, false)
)