client/src/api/APIClient.js
author ymh <ymh.work@gmail.com>
Fri, 28 Jul 2017 19:40:35 +0200
changeset 129 d48946d164c6
parent 97 69eaef18b01b
child 134 be36eed5e6e0
permissions -rw-r--r--
Add a first version of synchronisation Remove redux-offline dependency make the redux state fully immutable TODO: better error management TODO: make syncronization work automatically
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
129
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
     1
import qs from 'qs';
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
     2
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
class APIClient {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
  constructor(baseURL) {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
    this.baseURL = baseURL;
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
  }
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
  setStore = (store) => {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
    this.store = store;
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
  }
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
  createRequest = (method, uri, data, headers) => {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
    headers = headers || new Headers();
97
69eaef18b01b Improve the network saga. Try to avoid unnecessary token refresh
ymh <ymh.work@gmail.com>
parents: 87
diff changeset
    15
    if(method !== 'HEAD') {
69eaef18b01b Improve the network saga. Try to avoid unnecessary token refresh
ymh <ymh.work@gmail.com>
parents: 87
diff changeset
    16
      headers.append("Content-Type", "application/json");
69eaef18b01b Improve the network saga. Try to avoid unnecessary token refresh
ymh <ymh.work@gmail.com>
parents: 87
diff changeset
    17
    } else {
69eaef18b01b Improve the network saga. Try to avoid unnecessary token refresh
ymh <ymh.work@gmail.com>
parents: 87
diff changeset
    18
      headers.append("Content-Type", "text/plain");
69eaef18b01b Improve the network saga. Try to avoid unnecessary token refresh
ymh <ymh.work@gmail.com>
parents: 87
diff changeset
    19
    }
69eaef18b01b Improve the network saga. Try to avoid unnecessary token refresh
ymh <ymh.work@gmail.com>
parents: 87
diff changeset
    20
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
    var options = {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
      method: method,
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
      headers: headers,
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
    };
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
129
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    27
    let queryparams = '';
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
    if (data) {
129
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    29
      if(method !== 'HEAD' && method !== 'GET' && data) {
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    30
        options.body = JSON.stringify(data);
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    31
      }
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    32
      else {
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    33
        queryparams = "?"+qs.stringify(data);
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    34
      }
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
    }
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
    // TODO : use URL-module to build URL
129
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    38
    return new Request(this.baseURL + uri + queryparams, options);
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
  }
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
  getToken = () => {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
    const state = this.store.getState();
129
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    43
    return state.getIn(['authStatus', 'token']);
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    44
  }
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    45
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    46
  getClientId = () => {
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    47
    const state = this.store.getState();
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    48
    return state.getIn(['authStatus', 'clientId']);
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
  }
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
  hasToken = () => {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
    const token = this.getToken();
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
    return token !== null && token !== '';
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
  }
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
129
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    57
  hasClientId = () => {
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    58
    const clientId = this.getClientId();
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    59
    return clientId !== null && clientId !== '';
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    60
  }
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
129
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    62
  createAuthorizedHeader = (headers) => {
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    63
    const token = this.getToken() || '';
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
    headers.append("Authorization", "JWT " + token);
129
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    65
    return headers;
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    66
  }
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
129
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    68
  createClientIdHeader = (headers) => {
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    69
    const clientId = this.getClientId() || '';
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    70
    headers.append("Auditlog-Client", clientId);
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    71
    return headers;
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
  }
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
  request = (method, uri, data) => {
129
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    75
    var headers = new Headers();
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    76
    if(this.hasToken()) {
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    77
      headers = this.createAuthorizedHeader(headers);
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    78
    }
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    79
    if(this.hasClientId()) {
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    80
      headers = this.createClientIdHeader(headers);
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    81
    }
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    82
    var req = this.createRequest(method, uri, data, headers);
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
    return this.fetch(req, { credentials: 'include' });
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
  }
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
  get = (uri, data) => {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
    return this.request('GET', uri, data);
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
  }
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
  post = (uri, data) => {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
    return this.request('POST', uri, data);
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
  }
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
  put = (uri, data) => {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
    return this.request('PUT', uri, data);
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
  }
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
129
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    98
  delete = (uri, data) => {
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    99
    return this.request('DELETE', uri, data);
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
   100
  }
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
   101
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
  fetch = (req) => {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
    return new Promise((resolve, reject) => {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
      fetch(req)
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
        .then((response) => {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
          if (response.ok) {
83
76a4e4b11762 add server request for note update and delete
ymh <ymh.work@gmail.com>
parents: 62
diff changeset
   107
            let resJsonPromise;
76a4e4b11762 add server request for note update and delete
ymh <ymh.work@gmail.com>
parents: 62
diff changeset
   108
            if(response.status === 204) {
76a4e4b11762 add server request for note update and delete
ymh <ymh.work@gmail.com>
parents: 62
diff changeset
   109
              resJsonPromise = Promise.resolve({});
76a4e4b11762 add server request for note update and delete
ymh <ymh.work@gmail.com>
parents: 62
diff changeset
   110
            } else {
97
69eaef18b01b Improve the network saga. Try to avoid unnecessary token refresh
ymh <ymh.work@gmail.com>
parents: 87
diff changeset
   111
              resJsonPromise = response.text().then(data => {
69eaef18b01b Improve the network saga. Try to avoid unnecessary token refresh
ymh <ymh.work@gmail.com>
parents: 87
diff changeset
   112
                if(data.length > 0) {
69eaef18b01b Improve the network saga. Try to avoid unnecessary token refresh
ymh <ymh.work@gmail.com>
parents: 87
diff changeset
   113
                  return JSON.parse(data);
69eaef18b01b Improve the network saga. Try to avoid unnecessary token refresh
ymh <ymh.work@gmail.com>
parents: 87
diff changeset
   114
                } else {
69eaef18b01b Improve the network saga. Try to avoid unnecessary token refresh
ymh <ymh.work@gmail.com>
parents: 87
diff changeset
   115
                  return {};
69eaef18b01b Improve the network saga. Try to avoid unnecessary token refresh
ymh <ymh.work@gmail.com>
parents: 87
diff changeset
   116
                }
69eaef18b01b Improve the network saga. Try to avoid unnecessary token refresh
ymh <ymh.work@gmail.com>
parents: 87
diff changeset
   117
              });
83
76a4e4b11762 add server request for note update and delete
ymh <ymh.work@gmail.com>
parents: 62
diff changeset
   118
            }
97
69eaef18b01b Improve the network saga. Try to avoid unnecessary token refresh
ymh <ymh.work@gmail.com>
parents: 87
diff changeset
   119
            return resJsonPromise.then(data => resolve(data));
83
76a4e4b11762 add server request for note update and delete
ymh <ymh.work@gmail.com>
parents: 62
diff changeset
   120
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
          } else {
129
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
   122
            let errorResp = {
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
   123
              status: response.status,
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
   124
              statusText: response.statusText
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
   125
            }
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
   126
            return response.json().then(data => reject({...errorResp,data }));
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
          }
87
dbcee57de2c6 Add first implementation of network monitor
ymh <ymh.work@gmail.com>
parents: 83
diff changeset
   128
        })
dbcee57de2c6 Add first implementation of network monitor
ymh <ymh.work@gmail.com>
parents: 83
diff changeset
   129
        .catch((error) => {
dbcee57de2c6 Add first implementation of network monitor
ymh <ymh.work@gmail.com>
parents: 83
diff changeset
   130
          reject({error});
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
        });
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
    });
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
  }
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
}
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
export default APIClient