| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694 | 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) {                    try {                        reject(new Error('Upload failed: ' + JSON.parse(xhr.responseText).error.message));                    } catch (err) {                        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 && data.meta && 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);        }    }};
 |