123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689 |
- const $ = require('jquery');
- const _ = require('underscore');
- const Tokens = require('./tokens');
- /**
- * @param {String} message
- * @param {*} debug
- * @param {Number} code
- * @constructor
- */
- const ApiError = function (message, debug, code) {
- let temp = Error.call(this, message);
- temp.name = this.name = 'ApiError';
- this.stack = temp.stack;
- this.message = temp.message;
- this.debug = debug;
- this.code = code;
- };
- ApiError.prototype = Object.create(Error.prototype, {
- constructor: {
- value: ApiError,
- writable: true,
- configurable: true
- }
- });
- /**
- *
- * @param {String} verb
- * @param {String} path
- * @param {Object} [data]
- * @param {Object} [options]
- * @returns {Promise}
- */
- function fetch(verb, path, data, options) {
- options = options || {};
- return new Promise(function (resolve, reject) {
- let api_url = '/api/';
- let url = api_url + path;
- let token = Tokens.getTopToken();
- if ((typeof options.contentType === 'undefined' || options.contentType.match(/json/im)) && typeof data === 'object') {
- data = JSON.stringify(data);
- }
- $.ajax({
- url: url,
- data: typeof data === 'object' ? JSON.stringify(data) : data,
- type: verb,
- dataType: 'json',
- contentType: options.contentType || 'application/json; charset=UTF-8',
- processData: options.processData || true,
- crossDomain: true,
- timeout: options.timeout ? options.timeout : 180000,
- xhrFields: {
- withCredentials: true
- },
- beforeSend: function (xhr) {
- xhr.setRequestHeader('Authorization', 'Bearer ' + (token ? token.t : null));
- },
- success: function (data, textStatus, response) {
- let total = response.getResponseHeader('X-Dataset-Total');
- if (total !== null) {
- resolve({
- data: data,
- pagination: {
- total: parseInt(total, 10),
- offset: parseInt(response.getResponseHeader('X-Dataset-Offset'), 10),
- limit: parseInt(response.getResponseHeader('X-Dataset-Limit'), 10)
- }
- });
- } else {
- resolve(response);
- }
- },
- error: function (xhr, status, error_thrown) {
- let code = 400;
- if (typeof xhr.responseJSON !== 'undefined' && typeof xhr.responseJSON.error !== 'undefined' && typeof xhr.responseJSON.error.message !== 'undefined') {
- error_thrown = xhr.responseJSON.error.message;
- code = xhr.responseJSON.error.code || 500;
- }
- reject(new ApiError(error_thrown, xhr.responseText, code));
- }
- });
- });
- }
- /**
- *
- * @param {Array} expand
- * @returns {String}
- */
- function makeExpansionString(expand) {
- let items = [];
- _.forEach(expand, function (exp) {
- items.push(encodeURIComponent(exp));
- });
- return items.join(',');
- }
- /**
- * @param {String} path
- * @param {Array} [expand]
- * @param {String} [query]
- * @returns {Promise}
- */
- function getAllObjects(path, expand, query) {
- let params = [];
- if (typeof expand === 'object' && expand !== null && expand.length) {
- params.push('expand=' + makeExpansionString(expand));
- }
- if (typeof query === 'string') {
- params.push('query=' + query);
- }
- return fetch('get', path + (params.length ? '?' + params.join('&') : ''));
- }
- function FileUpload(path, fd) {
- return new Promise((resolve, reject) => {
- let xhr = new XMLHttpRequest();
- let token = Tokens.getTopToken();
- xhr.open('POST', '/api/' + path);
- xhr.overrideMimeType('text/plain');
- xhr.setRequestHeader('Authorization', 'Bearer ' + (token ? token.t : null));
- xhr.send(fd);
- xhr.onreadystatechange = function () {
- if (this.readyState === XMLHttpRequest.DONE) {
- if (xhr.status !== 200 && xhr.status !== 201) {
- reject(new Error('Upload failed: ' + xhr.status));
- } else {
- resolve(xhr.responseText);
- }
- }
- };
- });
- }
- module.exports = {
- status: function () {
- return fetch('get', '');
- },
- Tokens: {
- /**
- * @param {String} identity
- * @param {String} secret
- * @param {Boolean} [wipe] Will wipe the stack before adding to it again if login was successful
- * @returns {Promise}
- */
- login: function (identity, secret, wipe) {
- return fetch('post', 'tokens', {identity: identity, secret: secret})
- .then(response => {
- if (response.token) {
- if (wipe) {
- Tokens.clearTokens();
- }
- // Set storage token
- Tokens.addToken(response.token);
- return response.token;
- } else {
- Tokens.clearTokens();
- throw(new Error('No token returned'));
- }
- });
- },
- /**
- * @returns {Promise}
- */
- refresh: function () {
- return fetch('get', 'tokens')
- .then(response => {
- if (response.token) {
- Tokens.setCurrentToken(response.token);
- return response.token;
- } else {
- Tokens.clearTokens();
- throw(new Error('No token returned'));
- }
- });
- }
- },
- Users: {
- /**
- * @param {Number|String} user_id
- * @param {Array} [expand]
- * @returns {Promise}
- */
- getById: function (user_id, expand) {
- return fetch('get', 'users/' + user_id + (typeof expand === 'object' && expand.length ? '?expand=' + makeExpansionString(expand) : ''));
- },
- /**
- * @param {Array} [expand]
- * @param {String} [query]
- * @returns {Promise}
- */
- getAll: function (expand, query) {
- return getAllObjects('users', expand, query);
- },
- /**
- * @param {Object} data
- * @returns {Promise}
- */
- create: function (data) {
- return fetch('post', 'users', data);
- },
- /**
- * @param {Object} data
- * @param {Number} data.id
- * @returns {Promise}
- */
- update: function (data) {
- let id = data.id;
- delete data.id;
- return fetch('put', 'users/' + id, data);
- },
- /**
- * @param {Number} id
- * @returns {Promise}
- */
- delete: function (id) {
- return fetch('delete', 'users/' + id);
- },
- /**
- *
- * @param {Number} id
- * @param {Object} auth
- * @returns {Promise}
- */
- setPassword: function (id, auth) {
- return fetch('put', 'users/' + id + '/auth', auth);
- },
- /**
- * @param {Number} id
- * @returns {Promise}
- */
- loginAs: function (id) {
- return fetch('post', 'users/' + id + '/login');
- },
- /**
- *
- * @param {Number} id
- * @param {Object} perms
- * @returns {Promise}
- */
- setPermissions: function (id, perms) {
- return fetch('put', 'users/' + id + '/permissions', perms);
- }
- },
- Nginx: {
- ProxyHosts: {
- /**
- * @param {Array} [expand]
- * @param {String} [query]
- * @returns {Promise}
- */
- getAll: function (expand, query) {
- return getAllObjects('nginx/proxy-hosts', expand, query);
- },
- /**
- * @param {Object} data
- */
- create: function (data) {
- return fetch('post', 'nginx/proxy-hosts', data);
- },
- /**
- * @param {Object} data
- * @param {Number} data.id
- * @returns {Promise}
- */
- update: function (data) {
- let id = data.id;
- delete data.id;
- return fetch('put', 'nginx/proxy-hosts/' + id, data);
- },
- /**
- * @param {Number} id
- * @returns {Promise}
- */
- delete: function (id) {
- return fetch('delete', 'nginx/proxy-hosts/' + id);
- },
- /**
- * @param {Number} id
- * @returns {Promise}
- */
- get: function (id) {
- return fetch('get', 'nginx/proxy-hosts/' + id);
- },
- /**
- * @param {Number} id
- * @returns {Promise}
- */
- enable: function (id) {
- return fetch('post', 'nginx/proxy-hosts/' + id + '/enable');
- },
- /**
- * @param {Number} id
- * @returns {Promise}
- */
- disable: function (id) {
- return fetch('post', 'nginx/proxy-hosts/' + id + '/disable');
- }
- },
- RedirectionHosts: {
- /**
- * @param {Array} [expand]
- * @param {String} [query]
- * @returns {Promise}
- */
- getAll: function (expand, query) {
- return getAllObjects('nginx/redirection-hosts', expand, query);
- },
- /**
- * @param {Object} data
- */
- create: function (data) {
- return fetch('post', 'nginx/redirection-hosts', data);
- },
- /**
- * @param {Object} data
- * @param {Number} data.id
- * @returns {Promise}
- */
- update: function (data) {
- let id = data.id;
- delete data.id;
- return fetch('put', 'nginx/redirection-hosts/' + id, data);
- },
- /**
- * @param {Number} id
- * @returns {Promise}
- */
- delete: function (id) {
- return fetch('delete', 'nginx/redirection-hosts/' + id);
- },
- /**
- * @param {Number} id
- * @returns {Promise}
- */
- get: function (id) {
- return fetch('get', 'nginx/redirection-hosts/' + id);
- },
- /**
- * @param {Number} id
- * @param {FormData} form_data
- * @params {Promise}
- */
- setCerts: function (id, form_data) {
- return FileUpload('nginx/redirection-hosts/' + id + '/certificates', form_data);
- },
- /**
- * @param {Number} id
- * @returns {Promise}
- */
- enable: function (id) {
- return fetch('post', 'nginx/redirection-hosts/' + id + '/enable');
- },
- /**
- * @param {Number} id
- * @returns {Promise}
- */
- disable: function (id) {
- return fetch('post', 'nginx/redirection-hosts/' + id + '/disable');
- }
- },
- Streams: {
- /**
- * @param {Array} [expand]
- * @param {String} [query]
- * @returns {Promise}
- */
- getAll: function (expand, query) {
- return getAllObjects('nginx/streams', expand, query);
- },
- /**
- * @param {Object} data
- */
- create: function (data) {
- return fetch('post', 'nginx/streams', data);
- },
- /**
- * @param {Object} data
- * @param {Number} data.id
- * @returns {Promise}
- */
- update: function (data) {
- let id = data.id;
- delete data.id;
- return fetch('put', 'nginx/streams/' + id, data);
- },
- /**
- * @param {Number} id
- * @returns {Promise}
- */
- delete: function (id) {
- return fetch('delete', 'nginx/streams/' + id);
- },
- /**
- * @param {Number} id
- * @returns {Promise}
- */
- get: function (id) {
- return fetch('get', 'nginx/streams/' + id);
- },
- /**
- * @param {Number} id
- * @returns {Promise}
- */
- enable: function (id) {
- return fetch('post', 'nginx/streams/' + id + '/enable');
- },
- /**
- * @param {Number} id
- * @returns {Promise}
- */
- disable: function (id) {
- return fetch('post', 'nginx/streams/' + id + '/disable');
- }
- },
- DeadHosts: {
- /**
- * @param {Array} [expand]
- * @param {String} [query]
- * @returns {Promise}
- */
- getAll: function (expand, query) {
- return getAllObjects('nginx/dead-hosts', expand, query);
- },
- /**
- * @param {Object} data
- */
- create: function (data) {
- return fetch('post', 'nginx/dead-hosts', data);
- },
- /**
- * @param {Object} data
- * @param {Number} data.id
- * @returns {Promise}
- */
- update: function (data) {
- let id = data.id;
- delete data.id;
- return fetch('put', 'nginx/dead-hosts/' + id, data);
- },
- /**
- * @param {Number} id
- * @returns {Promise}
- */
- delete: function (id) {
- return fetch('delete', 'nginx/dead-hosts/' + id);
- },
- /**
- * @param {Number} id
- * @returns {Promise}
- */
- get: function (id) {
- return fetch('get', 'nginx/dead-hosts/' + id);
- },
- /**
- * @param {Number} id
- * @param {FormData} form_data
- * @params {Promise}
- */
- setCerts: function (id, form_data) {
- return FileUpload('nginx/dead-hosts/' + id + '/certificates', form_data);
- },
- /**
- * @param {Number} id
- * @returns {Promise}
- */
- enable: function (id) {
- return fetch('post', 'nginx/dead-hosts/' + id + '/enable');
- },
- /**
- * @param {Number} id
- * @returns {Promise}
- */
- disable: function (id) {
- return fetch('post', 'nginx/dead-hosts/' + id + '/disable');
- }
- },
- AccessLists: {
- /**
- * @param {Array} [expand]
- * @param {String} [query]
- * @returns {Promise}
- */
- getAll: function (expand, query) {
- return getAllObjects('nginx/access-lists', expand, query);
- },
- /**
- * @param {Object} data
- */
- create: function (data) {
- return fetch('post', 'nginx/access-lists', data);
- },
- /**
- * @param {Object} data
- * @param {Number} data.id
- * @returns {Promise}
- */
- update: function (data) {
- let id = data.id;
- delete data.id;
- return fetch('put', 'nginx/access-lists/' + id, data);
- },
- /**
- * @param {Number} id
- * @returns {Promise}
- */
- delete: function (id) {
- return fetch('delete', 'nginx/access-lists/' + id);
- }
- },
- Certificates: {
- /**
- * @param {Array} [expand]
- * @param {String} [query]
- * @returns {Promise}
- */
- getAll: function (expand, query) {
- return getAllObjects('nginx/certificates', expand, query);
- },
- /**
- * @param {Object} data
- */
- create: function (data) {
- const timeout = 180000 + (data.meta.propagation_seconds ? Number(data.meta.propagation_seconds) * 1000 : 0);
- return fetch('post', 'nginx/certificates', data, {timeout});
- },
- /**
- * @param {Object} data
- * @param {Number} data.id
- * @returns {Promise}
- */
- update: function (data) {
- let id = data.id;
- delete data.id;
- return fetch('put', 'nginx/certificates/' + id, data);
- },
- /**
- * @param {Number} id
- * @returns {Promise}
- */
- delete: function (id) {
- return fetch('delete', 'nginx/certificates/' + id);
- },
- /**
- * @param {Number} id
- * @param {FormData} form_data
- * @params {Promise}
- */
- upload: function (id, form_data) {
- return FileUpload('nginx/certificates/' + id + '/upload', form_data);
- },
- /**
- * @param {FormData} form_data
- * @params {Promise}
- */
- validate: function (form_data) {
- return FileUpload('nginx/certificates/validate', form_data);
- },
- /**
- * @param {Number} id
- * @returns {Promise}
- */
- renew: function (id, timeout = 180000) {
- return fetch('post', 'nginx/certificates/' + id + '/renew', undefined, {timeout});
- }
- }
- },
- AuditLog: {
- /**
- * @param {Array} [expand]
- * @param {String} [query]
- * @returns {Promise}
- */
- getAll: function (expand, query) {
- return getAllObjects('audit-log', expand, query);
- }
- },
- Reports: {
- /**
- * @returns {Promise}
- */
- getHostStats: function () {
- return fetch('get', 'reports/hosts');
- }
- },
- Settings: {
- /**
- * @param {String} setting_id
- * @returns {Promise}
- */
- getById: function (setting_id) {
- return fetch('get', 'settings/' + setting_id);
- },
- /**
- * @returns {Promise}
- */
- getAll: function () {
- return getAllObjects('settings');
- },
- /**
- * @param {Object} data
- * @param {Number} data.id
- * @returns {Promise}
- */
- update: function (data) {
- let id = data.id;
- delete data.id;
- return fetch('put', 'settings/' + id, data);
- }
- }
- };
|