all files / common/ network.js

94.29% Statements 33/35
95.83% Branches 23/24
100% Functions 6/6
94.29% Lines 33/35
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73             31× 31×   31×               31×   31×   29×     29×   28× 28× 28×   26×   28×   26×               22×                      
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 Iif (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
};