overleaf/services/track-changes/app/coffee/WebApiManager.coffee
Brian Gough 1ec9f87542 update timeouts to allow for 5 second retry delay
now using requestretry module, which has a five second delay between
retries. Need to increase the timeout on the health checks to allow for
this, as the timeout is currently shorter than the retry delay.
2017-04-12 16:47:34 +01:00

69 lines
2.4 KiB
CoffeeScript

request = require "requestretry" # allow retry on error https://github.com/FGRibreau/node-request-retry
logger = require "logger-sharelatex"
Settings = require "settings-sharelatex"
# Don't let HTTP calls hang for a long time
MAX_HTTP_REQUEST_LENGTH = 15000 # 15 seconds
# DEPRECATED! This method of getting user details via track-changes is deprecated
# in the way we lay out our services.
# Instead, web should be responsible for collecting the raw data (user_ids) and
# filling it out with calls to other services. All API calls should create a
# tree-like structure as much as possible, with web as the root.
module.exports = WebApiManager =
sendRequest: (url, callback = (error, body) ->) ->
request.get {
url: "#{Settings.apis.web.url}#{url}"
timeout: MAX_HTTP_REQUEST_LENGTH
maxAttempts: 2 # for node-request-retry
auth:
user: Settings.apis.web.user
pass: Settings.apis.web.pass
sendImmediately: true
}, (error, res, body)->
if error?
return callback(error)
if res.statusCode == 404
logger.log url: url, "got 404 from web api"
return callback null, null
if res.statusCode >= 200 and res.statusCode < 300
return callback null, body
else
error = new Error("web returned a non-success status code: #{res.statusCode} (attempts: #{res.attempts})")
callback error
getUserInfo: (user_id, callback = (error, userInfo) ->) ->
url = "/user/#{user_id}/personal_info"
logger.log user_id: user_id, "getting user info from web"
WebApiManager.sendRequest url, (error, body) ->
if error?
logger.error err: error, user_id: user_id, url: url, "error accessing web"
return callback error
if body == null
logger.error user_id: user_id, url: url, "no user found"
return callback null, null
try
user = JSON.parse(body)
catch error
return callback(error)
callback null, {
id: user.id
email: user.email
first_name: user.first_name
last_name: user.last_name
}
getProjectDetails: (project_id, callback = (error, details) ->) ->
url = "/project/#{project_id}/details"
logger.log project_id: project_id, "getting project details from web"
WebApiManager.sendRequest url, (error, body) ->
if error?
logger.error err: error, project_id: project_id, url: url, "error accessing web"
return callback error
try
project = JSON.parse(body)
catch error
return callback(error)
callback null, project