overleaf/services/web/app/coffee/Features/Analytics/AnalyticsManager.coffee
Alberto Fernández Capel fef7601433 Early return only applies to fault tolerant request
We need to return the data to other requests like getLastOccurrence.
2018-03-23 10:02:11 +00:00

109 lines
2.6 KiB
CoffeeScript

settings = require "settings-sharelatex"
logger = require "logger-sharelatex"
_ = require "underscore"
request = require "requestretry"
Errors = require '../Errors/Errors'
makeFaultTolerantRequest = (userId, options, callback) ->
if userId+"" == settings.smokeTest?.userId+""
return callback()
options = Object.assign(options, {
delayStrategy: exponentialBackoffStrategy()
timeout: 30000
})
if settings.overleaf?
options.qs = Object.assign({}, options.qs, { fromV2: 1 })
makeRequest options, (err) ->
if err?
logger.err { err: err }, 'Request to analytics failed'
callback() # Do not wait for all the attempts
makeRequest = (opts, callback)->
if settings.apis?.analytics?.url?
urlPath = opts.url
opts.url = "#{settings.apis.analytics.url}#{urlPath}"
request opts, callback
else
callback(new Errors.ServiceNotConfiguredError('Analytics service not configured'))
# Set an exponential backoff to retry calls to analytics. First retry will
# happen after 4s, then 8, 16, 32, 64...
exponentialBackoffStrategy = () ->
attempts = 1 # This won't be called until there has been 1 failure
() ->
attempts += 1
exponentialBackoffDelay(attempts)
exponentialBackoffDelay = (attempts) ->
delay = 2 ** attempts * 1000
logger.warn "Error comunicating with the analytics service. " +
"Will try again attempt #{attempts} in #{delay}ms"
delay
module.exports =
identifyUser: (user_id, old_user_id, callback = (error)->)->
opts =
body:
old_user_id:old_user_id
json:true
method:"POST"
timeout:1000
url: "/user/#{user_id}/identify"
makeRequest opts, callback
recordEvent: (user_id, event, segmentation = {}, callback = (error) ->) ->
opts =
body:
event:event
segmentation:segmentation
json:true
method:"POST"
url: "/user/#{user_id}/event"
maxAttempts: 7 # Give up after ~ 8min
makeFaultTolerantRequest user_id, opts, callback
updateEditingSession: (userId, projectId, countryCode, callback = (error) ->) ->
query =
userId: userId
projectId: projectId
if countryCode
query.countryCode = countryCode
opts =
method: "PUT"
url: "/editingSession"
qs: query
maxAttempts: 6 # Give up after ~ 4min
makeFaultTolerantRequest userId, opts, callback
getLastOccurrence: (user_id, event, callback = (error) ->) ->
opts =
body:
event:event
json:true
method:"POST"
timeout:1000
url: "/user/#{user_id}/event/last_occurrence"
makeRequest opts, (err, response, body)->
if err?
console.log response, opts
logger.err {user_id, err}, "error getting last occurance of event"
return callback err
else
return callback null, body