client/src/api/APIClient.js
author ymh <ymh.work@gmail.com>
Wed, 05 Sep 2018 12:27:52 +0200
changeset 155 e55ae84508bf
parent 134 be36eed5e6e0
permissions -rw-r--r--
Clean CreateSession component and remove trace of previous create session button
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';
134
be36eed5e6e0 add menu to change current group and create a new group
ymh <ymh.work@gmail.com>
parents: 129
diff changeset
     2
import { getToken, getClientId } from '../selectors/authSelectors'
129
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
     3
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
class APIClient {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
  constructor(baseURL) {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
    this.baseURL = baseURL;
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
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
  setStore = (store) => {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
    this.store = store;
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
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
  createRequest = (method, uri, data, headers) => {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
    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
    16
    if(method !== 'HEAD') {
69eaef18b01b Improve the network saga. Try to avoid unnecessary token refresh
ymh <ymh.work@gmail.com>
parents: 87
diff changeset
    17
      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
    18
    } else {
69eaef18b01b Improve the network saga. Try to avoid unnecessary token refresh
ymh <ymh.work@gmail.com>
parents: 87
diff changeset
    19
      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
    20
    }
69eaef18b01b Improve the network saga. Try to avoid unnecessary token refresh
ymh <ymh.work@gmail.com>
parents: 87
diff changeset
    21
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
    var options = {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
      method: method,
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
      headers: headers,
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
    };
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
129
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    28
    let queryparams = '';
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
    if (data) {
129
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    30
      if(method !== 'HEAD' && method !== 'GET' && data) {
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    31
        options.body = JSON.stringify(data);
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    32
      }
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    33
      else {
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    34
        queryparams = "?"+qs.stringify(data);
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    35
      }
62
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
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    // TODO : use URL-module to build URL
129
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    39
    return new Request(this.baseURL + uri + queryparams, options);
62
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
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
  getToken = () => {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
    const state = this.store.getState();
134
be36eed5e6e0 add menu to change current group and create a new group
ymh <ymh.work@gmail.com>
parents: 129
diff changeset
    44
    return getToken(state);
129
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
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    47
  getClientId = () => {
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    48
    const state = this.store.getState();
134
be36eed5e6e0 add menu to change current group and create a new group
ymh <ymh.work@gmail.com>
parents: 129
diff changeset
    49
    return getClientId(state);
62
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
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
  hasToken = () => {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
    const token = this.getToken();
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
    return token !== null && token !== '';
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
  }
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
129
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    58
  hasClientId = () => {
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    59
    const clientId = this.getClientId();
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    60
    return clientId !== null && clientId !== '';
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    61
  }
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
129
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    63
  createAuthorizedHeader = (headers) => {
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    64
    const token = this.getToken() || '';
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
    headers.append("Authorization", "JWT " + token);
129
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    66
    return headers;
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    67
  }
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
129
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    69
  createClientIdHeader = (headers) => {
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    70
    const clientId = this.getClientId() || '';
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    71
    headers.append("Auditlog-Client", clientId);
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    72
    return headers;
62
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
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
  request = (method, uri, data) => {
129
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    76
    var headers = new Headers();
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    77
    if(this.hasToken()) {
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    78
      headers = this.createAuthorizedHeader(headers);
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    79
    }
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    80
    if(this.hasClientId()) {
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    81
      headers = this.createClientIdHeader(headers);
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    82
    }
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    83
    var req = this.createRequest(method, uri, data, headers);
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
    return this.fetch(req, { credentials: 'include' });
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
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
  get = (uri, data) => {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
    return this.request('GET', uri, data);
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
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
  post = (uri, data) => {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
    return this.request('POST', uri, data);
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
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
  put = (uri, data) => {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
    return this.request('PUT', uri, data);
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
  }
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
129
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
    99
  delete = (uri, data) => {
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
   100
    return this.request('DELETE', uri, data);
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
   101
  }
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
   102
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
  fetch = (req) => {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
    return new Promise((resolve, reject) => {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
      fetch(req)
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
        .then((response) => {
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
          if (response.ok) {
83
76a4e4b11762 add server request for note update and delete
ymh <ymh.work@gmail.com>
parents: 62
diff changeset
   108
            let resJsonPromise;
76a4e4b11762 add server request for note update and delete
ymh <ymh.work@gmail.com>
parents: 62
diff changeset
   109
            if(response.status === 204) {
76a4e4b11762 add server request for note update and delete
ymh <ymh.work@gmail.com>
parents: 62
diff changeset
   110
              resJsonPromise = Promise.resolve({});
76a4e4b11762 add server request for note update and delete
ymh <ymh.work@gmail.com>
parents: 62
diff changeset
   111
            } else {
97
69eaef18b01b Improve the network saga. Try to avoid unnecessary token refresh
ymh <ymh.work@gmail.com>
parents: 87
diff changeset
   112
              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
   113
                if(data.length > 0) {
69eaef18b01b Improve the network saga. Try to avoid unnecessary token refresh
ymh <ymh.work@gmail.com>
parents: 87
diff changeset
   114
                  return JSON.parse(data);
69eaef18b01b Improve the network saga. Try to avoid unnecessary token refresh
ymh <ymh.work@gmail.com>
parents: 87
diff changeset
   115
                } else {
69eaef18b01b Improve the network saga. Try to avoid unnecessary token refresh
ymh <ymh.work@gmail.com>
parents: 87
diff changeset
   116
                  return {};
69eaef18b01b Improve the network saga. Try to avoid unnecessary token refresh
ymh <ymh.work@gmail.com>
parents: 87
diff changeset
   117
                }
69eaef18b01b Improve the network saga. Try to avoid unnecessary token refresh
ymh <ymh.work@gmail.com>
parents: 87
diff changeset
   118
              });
83
76a4e4b11762 add server request for note update and delete
ymh <ymh.work@gmail.com>
parents: 62
diff changeset
   119
            }
97
69eaef18b01b Improve the network saga. Try to avoid unnecessary token refresh
ymh <ymh.work@gmail.com>
parents: 87
diff changeset
   120
            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
   121
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
          } else {
129
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
   123
            let errorResp = {
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
   124
              status: response.status,
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
   125
              statusText: response.statusText
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
   126
            }
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 97
diff changeset
   127
            return response.json().then(data => reject({...errorResp,data }));
62
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
          }
87
dbcee57de2c6 Add first implementation of network monitor
ymh <ymh.work@gmail.com>
parents: 83
diff changeset
   129
        })
dbcee57de2c6 Add first implementation of network monitor
ymh <ymh.work@gmail.com>
parents: 83
diff changeset
   130
        .catch((error) => {
dbcee57de2c6 Add first implementation of network monitor
ymh <ymh.work@gmail.com>
parents: 83
diff changeset
   131
          reject({error});
62
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
b2514a9bcd49 migrate to redux-offline + various optimisation
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
export default APIClient