Home Reference Source Test

src/services/requestService.js

import { RequestError, ServerError } from '../services/errors'
import FilterBuilder from './filterBuilder' // eslint-disable-line no-unused-vars
import rp from 'request-promise'

class RequestService {
  /**
   * Initialize
   * @param {string} host
   * @param {string} apiToken
   * @param {string} accountId
   */
  init (host, apiToken, accountId) {
    this.host = host
    this.apiToken = apiToken
    this.accountId = accountId
    this.requester = rp.defaults({
      baseUrl: this.host,
      headers: {
        Authorization: this.apiToken
      }
    })
  }

  /**
   *
   * @param {string} endpoint
   * @param {string} method
   * @param {null|object} data
   * @param {null|FilterBuilder} filter
   *
   * @returns {Promise<Object|Object[], RequestError|ServerError>}
   */
  call (endpoint, method = 'GET', data = null, filter = null) {
    if (filter !== null) {
      endpoint = filter.buildUri(endpoint)
    }

    let requestProps = {
      method,
      uri: endpoint,
      resolveWithFullResponse: true,
      simple: true,
      json: true
    }

    if (data) {
      requestProps = Object.assign(requestProps, {
        body: data
      })
    }

    return this.requester(requestProps).then(response => {
      return response.body
    }).catch(response => {
      if (response.statusCode >= 400 && response.statusCode < 500) {
        return Promise.reject(new RequestError(response.statusCode, response.response.body.error))
      } else {
        return Promise.reject(new ServerError(response.statusCode, response.response.body.error))
      }
    })
  }
}

export const requestService = new RequestService()