UNPKG

aquameta-datum

Version:

Service layer for the Aquameta database API

124 lines (102 loc) 13 kB
import { fetch } from './fetch.js'; /** * Fetch query results client-side * @returns {Promise} */ export default async function executeEndpoint(client, query) { const requestUrl = `/${client.url}/${client.version}/${query.url}`.replace(/\/+/g, '/') // remove duplicate slashes .replace(/\/$/, ''); // remove tail slash const queryString = getQueryString(query.args); const options = { method: query.method, credentials: 'same-origin', headers: { 'Content-Type': 'application/json' } }; if (query.data) { options.body = JSON.stringify(query.data); } try { console.log(`endpoint: trying to fetch ${requestUrl}`, options); const response = await fetch(queryString ? `${requestUrl}?${queryString}` : requestUrl, options); // Let client deal with status codes if (client.rawResponse) { return response; } else { return response.json().then(r => { return r.result.map(({ row }) => row); }); } } catch (error) { // Log error in collapsed group console.groupCollapsed(query.method, error.statusCode, error.title); if ('message' in error) { console.error(error.message); } console.groupEnd(); throw error.title; } } // Map the keys of the args object to an array of encoded url components function getQueryString(args) { return Object.keys(args).sort().map(argName => argName in methods && methods[argName](args[argName])).filter(Boolean).join('&').replace(/&&/g, '&'); } const methods = { where(arg) { // where: [{ name: 'column_name', op: '=', value: 'value' }] return asArray(arg).map(w => `where=${urlEncode(w)}`).join('&'); }, order(arg) { // order_by: [{ column: 'column_name', direction: 'asc|desc' }] // TODO: random()? const columnList = asArray(arg).map(col => { const { column, direction = 'asc' } = col; return direction !== 'asc' ? `-${column}` : `${column}`; }); return `order_by=${encodeURIComponent(columnList.join(','))}`; }, limit(arg) { // limit: number const parsedNum = parseInt(arg); if (!isNaN(parsedNum)) { return `limit=${parsedNum}`; } else { return null; } }, offset(arg) { // offset: number const parsedNum = parseInt(arg); if (!isNaN(parsedNum)) { return `order=${parsedNum}`; } else { return null; } }, evented() { return 'session_id'; }, metaData(arg) { return `meta_data=${urlEncode(arg)}`; }, args(arg) { return `args=${urlEncode(arg)}`; }, exclude(arg) { return `exclude=${urlEncode(arg)}`; }, include(arg) { return `include=${urlEncode(arg)}`; } }; function urlEncode(str) { return encodeURIComponent(JSON.stringify(str)); } function asArray(arg) { return arg instanceof Array ? arg : [arg]; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVuZHBvaW50LmpzIl0sIm5hbWVzIjpbImZldGNoIiwiZXhlY3V0ZUVuZHBvaW50IiwiY2xpZW50IiwicXVlcnkiLCJyZXF1ZXN0VXJsIiwidXJsIiwidmVyc2lvbiIsInJlcGxhY2UiLCJxdWVyeVN0cmluZyIsImdldFF1ZXJ5U3RyaW5nIiwiYXJncyIsIm9wdGlvbnMiLCJtZXRob2QiLCJjcmVkZW50aWFscyIsImhlYWRlcnMiLCJkYXRhIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJjb25zb2xlIiwibG9nIiwicmVzcG9uc2UiLCJyYXdSZXNwb25zZSIsImpzb24iLCJ0aGVuIiwiciIsInJlc3VsdCIsIm1hcCIsInJvdyIsImVycm9yIiwiZ3JvdXBDb2xsYXBzZWQiLCJzdGF0dXNDb2RlIiwidGl0bGUiLCJtZXNzYWdlIiwiZ3JvdXBFbmQiLCJPYmplY3QiLCJrZXlzIiwic29ydCIsImFyZ05hbWUiLCJtZXRob2RzIiwiZmlsdGVyIiwiQm9vbGVhbiIsImpvaW4iLCJ3aGVyZSIsImFyZyIsImFzQXJyYXkiLCJ3IiwidXJsRW5jb2RlIiwib3JkZXIiLCJjb2x1bW5MaXN0IiwiY29sIiwiY29sdW1uIiwiZGlyZWN0aW9uIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwibGltaXQiLCJwYXJzZWROdW0iLCJwYXJzZUludCIsImlzTmFOIiwib2Zmc2V0IiwiZXZlbnRlZCIsIm1ldGFEYXRhIiwiZXhjbHVkZSIsImluY2x1ZGUiLCJzdHIiLCJBcnJheSJdLCJtYXBwaW5ncyI6IkFBRUEsU0FBUUEsS0FBUixRQUFvQixZQUFwQjs7QUFVQTs7OztBQUlBLGVBQWUsZUFBZUMsZUFBZixDQUNiQyxNQURhLEVBRWJDLEtBRmEsRUFHUztBQUN0QixRQUFNQyxVQUFVLEdBQUksSUFBR0YsTUFBTSxDQUFDRyxHQUFJLElBQUdILE1BQU0sQ0FBQ0ksT0FBUSxJQUFHSCxLQUFLLENBQUNFLEdBQUksRUFBOUMsQ0FDaEJFLE9BRGdCLENBQ1IsTUFEUSxFQUNBLEdBREEsRUFD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R0FBRCxFQUFtQjtBQUN4QixXQUFRLFdBQVVHLFNBQVMsQ0FBQ0gsR0FBRCxDQUFNLEVBQWpDO0FBQ0Q7O0FBaERhLENBQWhCOztBQW1EQSxTQUFTRyxTQUFULENBQW1CZ0IsR0FBbkIsRUFBcUM7QUFDbkMsU0FBT1Ysa0JBQWtCLENBQUNwQyxJQUFJLENBQUNDLFNBQUwsQ0FBZTZDLEdBQWYsQ0FBRCxDQUF6QjtBQUNEOztBQUVELFNBQVNsQixPQUFULENBQWlCRCxHQUFqQixFQUFnQztBQUM5QixTQUFPQSxHQUFHLFlBQVlvQixLQUFmLEdBQXVCcEIsR0FBdkIsR0FBNkIsQ0FBQ0EsR0FBRCxDQUFwQztBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQGZsb3dcblxuaW1wb3J0IHtmZXRjaH0gZnJvbSAnLi9mZXRjaC5qcyc7XG5pbXBvcnQgdHlwZSB7Q2xpZW50LCBFeGVjdXRhYmxlLCBRdWVyeVJlc3VsdCwgV2hlcmVPcHN9IGZyb20gJy4uL3R5cGVzLmpzJztcblxudHlwZSBSZXF1ZXN0ID0ge1xuICBtZXRob2Q6IHN0cmluZyxcbiAgY3JlZGVudGlhbHM/OiBzdHJpbmcsXG4gIGhlYWRlcnM6IHtbc3RyaW5nXTogc3RyaW5nfSxcbiAgYm9keT86IHN0cmluZyxcbn07XG5cbi8qKlxuICogRmV0Y2ggcXVlcnkgcmVzdWx0cyBjbGllbnQtc2lkZVxuICogQHJldHVybnMge1Byb21pc2V9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVFbmRwb2ludChcbiAgY2xpZW50OiBDbGllbnQsXG4gIHF1ZXJ5OiBFeGVjdXRhYmxlLFxuKTogUHJvbWlzZTxRdWVyeVJlc3VsdD4ge1xuICBjb25zdCByZXF1ZXN0VXJsID0gYC8ke2NsaWVudC51cmx9LyR7Y2xpZW50LnZlcnNpb259LyR7cXVlcnkudXJsfWBcbiAgICAucmVwbGFjZSgvXFwvKy9nLCAnLycpIC8vIHJlbW92ZSBkdXBsaWNhdGUgc2xhc2hlc1xuICAgIC5yZXBsYWNlKC9cXC8kLywgJycpOyAvLyByZW1vdmUgdGFpbCBzbGFzaFxuICBjb25zdCBxdWVyeVN0cmluZyA9IGdldFF1ZXJ5U3RyaW5nKHF1ZXJ5LmFyZ3MpO1xuICBjb25zdCBvcHRpb25zOiBSZXF1ZXN0ID0ge1xuICAgIG1ldGhvZDogcXVlcnkubWV0aG9kLFxuICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgfSxcbiAgfTtcbiAgaWYgKHF1ZXJ5LmRhdGEpIHtcbiAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShxdWVyeS5kYXRhKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc29sZS5sb2coYGVuZHBvaW50OiB0cnlpbmcgdG8gZmV0Y2ggJHtyZXF1ZXN0VXJsfWAsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICBxdWVyeVN0cmluZyA/IGAke3JlcXVlc3RVcmx9PyR7cXVlcnlTdHJpbmd9YCA6IHJlcXVlc3RVcmwsXG4gICAgICBvcHRpb25zLFxuICAgICk7XG5cbiAgICAvLyBMZXQgY2xpZW50IGRlYWwgd2l0aCBzdGF0dXMgY29kZXNcbiAgICBpZiAoY2xpZW50LnJhd1Jlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCkudGhlbihyID0+IHtcbiAgICAgICAgcmV0dXJuIHIucmVzdWx0Lm1hcCgoe3Jvd30pID0+IHJvdyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gTG9nIGVycm9yIGluIGNvbGxhcHNlZCBncm91cFxuICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQocXVlcnkubWV0aG9kLCBlcnJvci5zdGF0dXNDb2RlLCBlcnJvci50aXRsZSk7XG4gICAgaWYgKCdtZXNzYWdlJyBpbiBlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICB9XG4gICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgIHRocm93IGVycm9yLnRpdGxlO1xuICB9XG59XG5cbi8vIE1hcCB0aGUga2V5cyBvZiB0aGUgYXJncyBvYmplY3QgdG8gYW4gYXJyYXkgb2YgZW5jb2RlZCB1cmwgY29tcG9uZW50c1xuZnVuY3Rpb24gZ2V0UXVlcnlTdHJpbmcoYXJnczoge1tzdHJpbmddOiBtaXhlZH0pOiBzdHJpbmcge1xuICByZXR1cm4gT2JqZWN0LmtleXMoYXJncylcbiAgICAuc29ydCgpXG4gICAgLm1hcChhcmdOYW1lID0+IGFyZ05hbWUgaW4gbWV0aG9kcyAmJiBtZXRob2RzW2FyZ05hbWVdKGFyZ3NbYXJnTmFtZV0pKVxuICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAuam9pbignJicpXG4gICAgLnJlcGxhY2UoLyYmL2csICcmJyk7XG59XG5cbnR5cGUgV2hlcmVBcmcgPSB7XG4gIG5hbWU6IHN0cmluZyxcbiAgb3A6IFdoZXJlT3BzLFxuICB2YWx1ZTogYW55LFxufTtcbnR5cGUgT3JkZXJBcmcgPSB7XG4gIGNvbHVtbjogc3RyaW5nLFxuICBkaXJlY3Rpb24/OiBzdHJpbmcsXG59O1xuY29uc3QgbWV0aG9kcyA9IHtcbiAgd2hlcmUoYXJnOiBXaGVyZUFyZyB8IEFycmF5PFdoZXJlQXJnPik6IHN0cmluZyB7XG4gICAgLy8gd2hlcmU6IFt7IG5hbWU6ICdjb2x1bW5fbmFtZScsIG9wOiAnPScsIHZhbHVlOiAndmFsdWUnIH1dXG4gICAgcmV0dXJuIGFzQXJyYXkoYXJnKVxuICAgICAgLm1hcCh3ID0+IGB3aGVyZT0ke3VybEVuY29kZSh3KX1gKVxuICAgICAgLmpvaW4oJyYnKTtcbiAgfSxcbiAgb3JkZXIoYXJnOiBPcmRlckFyZyB8IEFycmF5PE9yZGVyQXJnPik6IHN0cmluZyB7XG4gICAgLy8gb3JkZXJfYnk6IFt7IGNvbHVtbjogJ2NvbHVtbl9uYW1lJywgZGlyZWN0aW9uOiAnYXNjfGRlc2MnIH1dXG4gICAgLy8gVE9ETzogcmFuZG9tKCk/XG4gICAgY29uc3QgY29sdW1uTGlzdCA9IGFzQXJyYXkoYXJnKS5tYXAoY29sID0+IHtcbiAgICAgIGNvbnN0IHtjb2x1bW4sIGRpcmVjdGlvbiA9ICdhc2MnfSA9IGNvbDtcbiAgICAgIHJldHVybiBkaXJlY3Rpb24gIT09ICdhc2MnID8gYC0ke2NvbHVtbn1gIDogYCR7Y29sdW1ufWA7XG4gICAgfSk7XG4gICAgcmV0dXJuIGBvcmRlcl9ieT0ke2VuY29kZVVSSUNvbXBvbmVudChjb2x1bW5MaXN0LmpvaW4oJywnKSl9YDtcbiAgfSxcbiAgbGltaXQoYXJnOiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAvLyBsaW1pdDogbnVtYmVyXG4gICAgY29uc3QgcGFyc2VkTnVtID0gcGFyc2VJbnQoYXJnKTtcbiAgICBpZiAoIWlzTmFOKHBhcnNlZE51bSkpIHtcbiAgICAgIHJldHVybiBgbGltaXQ9JHtwYXJzZWROdW19YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LFxuICBvZmZzZXQoYXJnOiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAvLyBvZmZzZXQ6IG51bWJlclxuICAgIGNvbnN0IHBhcnNlZE51bSA9IHBhcnNlSW50KGFyZyk7XG4gICAgaWYgKCFpc05hTihwYXJzZWROdW0pKSB7XG4gICAgICByZXR1cm4gYG9yZGVyPSR7cGFyc2VkTnVtfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSxcbiAgZXZlbnRlZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnc2Vzc2lvbl9pZCc7XG4gIH0sXG4gIG1ldGFEYXRhKGFyZzogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYG1ldGFfZGF0YT0ke3VybEVuY29kZShhcmcpfWA7XG4gIH0sXG4gIGFyZ3MoYXJnOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBgYXJncz0ke3VybEVuY29kZShhcmcpfWA7XG4gIH0sXG4gIGV4Y2x1ZGUoYXJnOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZXhjbHVkZT0ke3VybEVuY29kZShhcmcpfWA7XG4gIH0sXG4gIGluY2x1ZGUoYXJnOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBgaW5jbHVkZT0ke3VybEVuY29kZShhcmcpfWA7XG4gIH0sXG59O1xuXG5mdW5jdGlvbiB1cmxFbmNvZGUoc3RyOiBhbnkpOiBzdHJpbmcge1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHN0cikpO1xufVxuXG5mdW5jdGlvbiBhc0FycmF5KGFyZzogYW55KTogYW55IHtcbiAgcmV0dXJuIGFyZyBpbnN0YW5jZW9mIEFycmF5ID8gYXJnIDogW2FyZ107XG59XG4iXX0=