skull-island
Version:
A tool for diffable Kong configuration
65 lines (55 loc) • 2.35 kB
JavaScript
;
const request = require('request-promise-native');
const {merge, mergeDeepLeft, compose} = require('ramda');
module.exports = function connectionContext(username, password, adminUrl) {
const authentication = "Basic " + new Buffer(username + ":" + password).toString("base64");
const baseConfiguration = {
headers: {"Authorization": authentication},
json: true
};
function retrievalAdminRequest(resource, additionalConfiguration = {}, offset = null) {
function standardKongResponseSemigroup(responseA, responseB) {
const combinedData = responseA.data.concat(responseB.data);
return merge(responseB, {data: combinedData});
}
function retrieveData(nextOffset) {
const configuration = compose(
mergeDeepLeft(additionalConfiguration),
mergeDeepLeft(baseConfiguration)
)({url: `${adminUrl}/${resource}`});
if (!nextOffset) {
return request(configuration)
} else {
const updatedConfiguration = mergeDeepLeft(configuration, {qs: {offset: nextOffset}});
return request(updatedConfiguration)
}
}
return retrieveData(offset)
.then(result => {
if (result.next) {
return retrievalAdminRequest(resource, additionalConfiguration, result.offset)
.then(nextResult => standardKongResponseSemigroup(result, nextResult));
} else {
return result;
}
});
}
function createOrUpdateAdminRequest(resource, body, additionalConfiguration = {}) {
const configuration = compose(
mergeDeepLeft(baseConfiguration),
mergeDeepLeft(additionalConfiguration)
)({url: `${adminUrl}/${resource}`, method: 'PUT', body});
return request(configuration);
}
function deleteAdminRequest(resource, entityNameOrId) {
const configuration = mergeDeepLeft(
baseConfiguration, {url: `${adminUrl}/${resource}/${entityNameOrId}`, method: 'DELETE'}
);
return request(configuration);
}
return {
retrievalAdminRequest,
createOrUpdateAdminRequest,
deleteAdminRequest
};
};