overleaf/services/web/app/src/infrastructure/GeoIpLookup.js

110 lines
2.5 KiB
JavaScript
Raw Normal View History

/* eslint-disable
max-len,
no-return-assign,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* DS103: Rewrite code to no longer use __guard__
* DS207: Consider shorter variations of null checks
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
let GeoIpLookup
const request = require('request')
const settings = require('settings-sharelatex')
const _ = require('underscore')
const logger = require('logger-sharelatex')
const URL = require('url')
const currencyMappings = {
GB: 'GBP',
US: 'USD',
CH: 'CHF',
NZ: 'NZD',
AU: 'AUD',
DK: 'DKK',
NO: 'NOK',
CA: 'CAD',
SE: 'SEK'
}
// Countries which would likely prefer Euro's
const EuroCountries = [
'AT',
'BE',
'BG',
'HR',
'CY',
'CZ',
'EE',
'FI',
'FR',
'DE',
'EL',
'HU',
'IE',
'IT',
'LV',
'LT',
'LU',
'MT',
'NL',
'PL',
'PT',
'RO',
'SK',
'SI',
'ES'
]
_.each(EuroCountries, country => (currencyMappings[country] = 'EUR'))
module.exports = GeoIpLookup = {
getDetails(ip, callback) {
if (ip == null) {
const e = new Error('no ip passed')
return callback(e)
}
ip = ip.trim().split(' ')[0]
const opts = {
url: URL.resolve(settings.apis.geoIpLookup.url, ip),
timeout: 1000,
json: true
}
logger.log({ ip, opts }, 'getting geo ip details')
return request.get(opts, function (err, res, ipDetails) {
if (err != null) {
logger.warn({ err, ip }, 'error getting ip details')
}
return callback(err, ipDetails)
})
},
getCurrencyCode(ip, callback) {
return GeoIpLookup.getDetails(ip, function (err, ipDetails) {
if (err != null || ipDetails == null) {
logger.err(
{ err, ip },
'problem getting currencyCode for ip, defaulting to USD'
)
return callback(null, 'USD')
}
const countryCode = __guard__(
ipDetails != null ? ipDetails.country_code : undefined,
x => x.toUpperCase()
)
const currencyCode = currencyMappings[countryCode] || 'USD'
logger.log({ ip, currencyCode, ipDetails }, 'got currencyCode for ip')
return callback(err, currencyCode, countryCode)
})
}
}
function __guard__(value, transform) {
return typeof value !== 'undefined' && value !== null
? transform(value)
: undefined
}