client/src/api/APIClient.js
author Alexandre Segura <mex.zktk@gmail.com>
Tue, 20 Jun 2017 16:08:12 +0200
changeset 63 4088f8dc6b52
parent 62 b2514a9bcd49
child 83 76a4e4b11762
permissions -rw-r--r--
Improve session page layout, introduce summary.

class APIClient {
  constructor(baseURL) {
    this.baseURL = baseURL;
  }

  setStore = (store) => {
    this.store = store;
  }

  createRequest = (method, uri, data, headers) => {

    headers = headers || new Headers();
    headers.append("Content-Type", "application/json");

    var options = {
      method: method,
      headers: headers,
    };

    if (data) {
      options.body = JSON.stringify(data);
    }

    // TODO : use URL-module to build URL
    return new Request(this.baseURL + uri, options);
  }

  getToken = () => {
    const state = this.store.getState();
    return state['token'];
  }

  hasToken = () => {
    const token = this.getToken();

    return token !== null && token !== '';
  }

  createAuthorizedRequest = (method, uri, data) => {

    var headers = new Headers(),
        token = this.getToken() || '';
    headers.append("Authorization", "JWT " + token);

    return this.createRequest(method, uri, data, headers);
  }

  request = (method, uri, data) => {
    console.log(method + ' ' + uri);
    var req = this.hasToken() ? this.createAuthorizedRequest(method, uri, data) : this.createRequest(method, uri, data);
    return this.fetch(req, { credentials: 'include' });
  }

  get = (uri, data) => {
    return this.request('GET', uri, data);
  }

  post = (uri, data) => {
    return this.request('POST', uri, data);
  }

  put = (uri, data) => {
    return this.request('PUT', uri, data);
  }

  fetch = (req) => {
    return new Promise((resolve, reject) => {
      fetch(req)
        .then((response) => {
          if (response.ok) {
            return response.json().then((data) => resolve(data));
          } else {
            return response.json().then((data) => reject(data));
          }
        });
    });
  }
}

export default APIClient