client/src/api/APIClient.js
author ymh <ymh.work@gmail.com>
Fri, 30 Nov 2018 10:53:15 +0100
changeset 183 f8f3af9e5c83
parent 134 be36eed5e6e0
permissions -rw-r--r--
Change the settings to avoid using Session authentication for rest framework as it raise exceptions in case client and backend are on the same domain On the filter, adapt to take into account new version of django_filters
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