Delay Dropbox polling by 5 seconds and dispatch only a single request
This commit is contained in:
@@ -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)
|
||||
)
|
||||
Reference in New Issue
Block a user