client.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. const logger = require('./logger');
  2. const axios = require('axios').default;
  3. const BackendApi = function(config, token) {
  4. this.config = config;
  5. this.token = token;
  6. this.axios = axios.create({
  7. baseURL: config.baseUrl,
  8. timeout: 90000,
  9. });
  10. };
  11. /**
  12. * @param {string} token
  13. */
  14. BackendApi.prototype.setToken = function(token) {
  15. this.token = token;
  16. };
  17. /**
  18. * @param {bool} returnOnError
  19. */
  20. BackendApi.prototype._prepareOptions = function(returnOnError) {
  21. let options = {
  22. headers: {
  23. Accept: 'application/json'
  24. }
  25. }
  26. if (this.token) {
  27. options.headers.Authorization = 'Bearer ' + this.token;
  28. }
  29. if (returnOnError) {
  30. options.validateStatus = function () {
  31. return true;
  32. }
  33. }
  34. return options;
  35. };
  36. /**
  37. * @param {*} response
  38. * @param {function} resolve
  39. * @param {function} reject
  40. * @param {bool} returnOnError
  41. */
  42. BackendApi.prototype._handleResponse = function(response, resolve, reject, returnOnError) {
  43. logger('Response data:', response.data);
  44. if (!returnOnError && typeof response.data === 'object' && typeof response.data.error === 'object') {
  45. if (typeof response.data === 'object' && typeof response.data.error === 'object' && typeof response.data.error.message !== 'undefined') {
  46. reject(new Error(response.data.error.code + ': ' + response.data.error.message));
  47. } else {
  48. reject(new Error('Error ' + response.status));
  49. }
  50. } else {
  51. resolve(response.data);
  52. }
  53. };
  54. /**
  55. * @param {*} err
  56. * @param {function} resolve
  57. * @param {function} reject
  58. * @param {bool} returnOnError
  59. */
  60. BackendApi.prototype._handleError = function(err, resolve, reject, returnOnError) {
  61. logger('Axios Error:', err);
  62. if (returnOnError) {
  63. resolve(typeof err.response.data !== 'undefined' ? err.response.data : err);
  64. } else {
  65. reject(err);
  66. }
  67. };
  68. /**
  69. * @param {string} method
  70. * @param {string} path
  71. * @param {bool} [returnOnError]
  72. * @param {*} [data]
  73. * @returns {Promise<object>}
  74. */
  75. BackendApi.prototype.request = function (method, path, returnOnError, data) {
  76. logger(method.toUpperCase(), path);
  77. const options = this._prepareOptions(returnOnError);
  78. return new Promise((resolve, reject) => {
  79. let opts = {
  80. method: method,
  81. url: path,
  82. ...options
  83. }
  84. if (data !== undefined && data !== null) {
  85. opts.data = data;
  86. }
  87. this.axios(opts)
  88. .then((response) => {
  89. this._handleResponse(response, resolve, reject, returnOnError);
  90. })
  91. .catch((err) => {
  92. this._handleError(err, resolve, reject, returnOnError);
  93. });
  94. });
  95. };
  96. /**
  97. * @param {string} path
  98. * @param {form} form
  99. * @param {bool} [returnOnError]
  100. * @returns {Promise<object>}
  101. */
  102. BackendApi.prototype.postForm = function (path, form, returnOnError) {
  103. logger('POST', this.config.baseUrl + path);
  104. const options = this._prepareOptions(returnOnError);
  105. return new Promise((resolve, reject) => {
  106. const opts = {
  107. ...options,
  108. ...form.getHeaders(),
  109. }
  110. this.axios.post(path, form, opts)
  111. .then((response) => {
  112. this._handleResponse(response, resolve, reject, returnOnError);
  113. })
  114. .catch((err) => {
  115. this._handleError(err, resolve, reject, returnOnError);
  116. });
  117. });
  118. };
  119. module.exports = BackendApi;