thng-query
Version:
DSL for querying EVRYTHNG API
64 lines (53 loc) • 1.42 kB
JavaScript
;
const axios = require('axios');
const _ = require('lodash');
const url = require('url');
const qs = require('qs');
const signals = require('../signals');
const settings = require('../settings');
const linkUrlRegex = /<?([^>]*)>/;
module.exports = config => {
if (config.done) {
return Promise.reject(signals.terminate);
}
_.merge(config, {
params: {
perPage: settings.perPage,
sortOrder: 'DESCENDING'
}
});
return axios(config)
.then(processResponseFor(config))
.catch(err => {
if (err.response) {
throw new Error(`Fetch Stage: request not fulfilled ${err}`);
} else {
throw new Error(`Fetch Stage: ${err}`);
}
});
};
function processResponseFor(config) {
return response => {
if (response.headers) {
if (response.headers.link) {
config.done = false;
const link = decodeURIComponent(response.headers.link);
const urlMatch = link.match(linkUrlRegex);
if (urlMatch[1]) {
const linkUrl = urlMatch[1];
const linkParams = qs.parse(url.parse(linkUrl).query);
if (linkParams.nextPageToken) {
_.merge(config, {
params: {
nextPageToken: linkParams.nextPageToken
}
});
}
}
} else {
config.done = true;
}
}
return response.data;
}
}