@xervo/api-util
Version:
wrapper to make API request simpler
131 lines (103 loc) • 3.25 kB
JavaScript
const Assign = require('lodash.assign');
const Pick = require('lodash.pick');
const Superagent = require('superagent');
const URL = require('url');
const Util = require('util');
const API_URL = {
protocol: 'https:',
hostname: 'api.xervo.io',
port: 443
};
const HEADERS = {
'Content-Type': 'application/json',
'Accept': 'application/json'
};
function validData(data) {
var isObject = {}.toString.call(data) === '[object Object]';
var isArray = Array.isArray(data);
return isObject || isArray;
}
function makeRequest(agent, headers, token, done) {
if (token) agent = agent.set('Authorization', Util.format('Token %s', token));
agent
.set(headers)
.end(function (err, response) {
if (err) return done(err);
return done(null, response.body);
});
}
module.exports = function (options) {
var urlObject, headers;
options = options || {};
urlObject = Assign({}, API_URL, Pick(options, Object.keys(API_URL)));
headers = Assign({}, HEADERS, {
'API-Version': options.version || 'v2'
});
function getURL(path) {
var bits = path.split('?');
var obj = { pathname: bits[0], search: bits[1] };
return URL.format(Assign({}, urlObject, obj));
}
return {
get: function (endpoint, token, done) {
var agent;
if (typeof token === 'function') {
done = token;
token = options.token;
}
agent = Superagent.get(getURL(endpoint));
return makeRequest(agent, headers, token, done);
},
post: function (endpoint, data, token, done) {
var agent;
// post('/path', done)
if (typeof data === 'function') {
done = data;
return done(new Error('data required'));
}
// post('/path', '1234', done)
if (typeof data === 'string' && typeof token === 'function') {
done = token;
return done(new Error('data required'));
}
// post('/path', {}, done)
if (typeof token === 'function') {
done = token;
token = options.token;
}
if (!validData(data)) return done(new Error('data required'));
agent = Superagent.post(getURL(endpoint)).send(data);
return makeRequest(agent, headers, token, done);
},
put: function (endpoint, data, token, done) {
var agent;
// put('/path', done)
if (typeof data === 'function') {
done = data;
return done(new Error('data required'));
}
// put('/path', '1234', done)
if (typeof data === 'string' && typeof token === 'function') {
done = token;
return done(new Error('data required'));
}
// put('/path', {}, done)
if (typeof token === 'function') {
done = token;
token = options.token;
}
if (!validData(data)) return done(new Error('data required'));
agent = Superagent.put(getURL(endpoint)).send(data);
return makeRequest(agent, headers, token, done);
},
delete: function (endpoint, token, done) {
var agent;
if (typeof token === 'function') {
done = token;
token = options.token;
}
agent = Superagent.delete(getURL(endpoint));
return makeRequest(agent, headers, token, done);
}
};
};