polyglot-cli
Version:
Infinum Polyglot CLI
73 lines (64 loc) • 2.01 kB
JavaScript
const fetch = require('node-fetch');
const config = require('./config');
const utils = require('./utils');
const store = require('./store');
function serialize(attributes, type) {
return {
data: {type, attributes}
};
}
function request(url, method, data, apiResponseData = null, absolute = false) {
utils.debug(method, absolute ? url : `${config.hostname}${config.apiPath}${url}`);
if (data) {
utils.debug('Request:', JSON.stringify(data));
}
return fetch(absolute ? url : `${config.hostname}${config.apiPath}${url}`, {
method,
headers: {
Accept: 'application/vnd.api+json',
'Content-Type': 'application/json',
'X-Auth-Token': config.auth ? config.auth.token : null
},
body: data ? JSON.stringify(data) : null
}).then((res) => Promise.all([res, res.json()]))
.then(([res, response]) => {
if (response.errors) {
response.errors.forEach((error) => {
utils.debug('JSON API error:', error.detail, '@', error.source && error.source.pointer);
});
throw response.errors[0].detail;
} else if (response.error) {
utils.debug('Response error:', response.error);
throw response.error;
} else if (res.status > 210) {
utils.debug('Status error:', res.status);
throw res.status;
}
const parsedResponse = store.sync(response);
let apiResponse;
if (apiResponseData) {
apiResponse = apiResponseData.concat(parsedResponse);
} else {
apiResponse = parsedResponse;
}
if (response.links && response.links.next) {
return request(response.links.next, method, data, apiResponse, true);
}
return apiResponse;
});
}
module.exports = {
create(url, data) {
return request(url, 'POST', data);
},
read(url) {
return request(url, 'GET');
},
update(url, data) {
return request(url, 'PATCH', data);
},
remove(url, data) {
return request(url, 'DELETE', data);
},
serialize
};