aquameta-datum
Version:
Service layer for the Aquameta database API
124 lines (102 loc) • 13 kB
JavaScript
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=