UNPKG

polyglot-cli

Version:
73 lines (64 loc) 2.01 kB
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 };