aquameta-datum
Version:
Service layer for the Aquameta database API
132 lines (107 loc) • 13.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = executeEndpoint;
var _fetch = require("./fetch.js");
/**
* Fetch query results client-side
* @returns {Promise}
*/
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 (0, _fetch.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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVuZHBvaW50LmpzIl0sIm5hbWVzIjpbImV4ZWN1dGVFbmRwb2ludCIsImNsaWVudCIsInF1ZXJ5IiwicmVxdWVzdFVybCIsInVybCIsInZlcnNpb24iLCJyZXBsYWNlIiwicXVlcnlTdHJpbmciLCJnZXRRdWVyeVN0cmluZyIsImFyZ3MiLCJvcHRpb25zIiwibWV0aG9kIiwiY3JlZGVudGlhbHMiLCJoZWFkZXJzIiwiZGF0YSIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwiY29uc29sZSIsImxvZyIsInJlc3BvbnNlIiwicmF3UmVzcG9uc2UiLCJqc29uIiwidGhlbiIsInIiLCJyZXN1bHQiLCJtYXAiLCJyb3ciLCJlcnJvciIsImdyb3VwQ29sbGFwc2VkIiwic3RhdHVzQ29kZSIsInRpdGxlIiwibWVzc2FnZSIsImdyb3VwRW5kIiwiT2JqZWN0Iiwia2V5cyIsInNvcnQiLCJhcmdOYW1lIiwibWV0aG9kcyIsImZpbHRlciIsIkJvb2xlYW4iLCJqb2luIiwid2hlcmUiLCJhcmciLCJhc0FycmF5IiwidyIsInVybEVuY29kZSIsIm9yZGVyIiwiY29sdW1uTGlzdCIsImNvbCIsImNvbHVtbiIsImRpcmVjdGlvbiIsImVuY29kZVVSSUNvbXBvbmVudCIsImxpbWl0IiwicGFyc2VkTnVtIiwicGFyc2VJbnQiLCJpc05hTiIsIm9mZnNldCIsImV2ZW50ZWQiLCJtZXRhRGF0YSIsImV4Y2x1ZGUiLCJpbmNsdWRlIiwic3RyIiwiQXJyYXkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFFQTs7QUFVQTs7OztBQUllLGVBQWVBLGVBQWYsQ0FDYkMsTUFEYSxFQUViQyxLQUZhLEVBR1M7QUFDdEIsUUFBTUMsVUFBVSxHQUFJLElBQUdGLE1BQU0sQ0FBQ0csR0FBSSxJQUFHSCxNQUFNLENBQUNJLE9BQVEsSUFBR0gsS0FBSyxDQUFDRSxHQUFJLEVBQTlDLENBQ2hCRSxPQURnQixDQUNSLE1BRFEsRUFDQSxHQURBLEVBQ0s7QUFETCxHQUVoQkEsT0FGZ0IsQ0FFUixLQUZR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QUFDSCxHQUFELENBQU0sRUFBakM7QUFDRDs7QUFoRGEsQ0FBaEI7O0FBbURBLFNBQVNHLFNBQVQsQ0FBbUJnQixHQUFuQixFQUFxQztBQUNuQyxTQUFPVixrQkFBa0IsQ0FBQ3BDLElBQUksQ0FBQ0MsU0FBTCxDQUFlNkMsR0FBZixDQUFELENBQXpCO0FBQ0Q7O0FBRUQsU0FBU2xCLE9BQVQsQ0FBaUJELEdBQWpCLEVBQWdDO0FBQzlCLFNBQU9BLEdBQUcsWUFBWW9CLEtBQWYsR0FBdUJwQixHQUF2QixHQUE2QixDQUFDQSxHQUFELENBQXBDO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAZmxvd1xuXG5pbXBvcnQge2ZldGNofSBmcm9tICcuL2ZldGNoLmpzJztcbmltcG9ydCB0eXBlIHtDbGllbnQsIEV4ZWN1dGFibGUsIFF1ZXJ5UmVzdWx0LCBXaGVyZU9wc30gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG50eXBlIFJlcXVlc3QgPSB7XG4gIG1ldGhvZDogc3RyaW5nLFxuICBjcmVkZW50aWFscz86IHN0cmluZyxcbiAgaGVhZGVyczoge1tzdHJpbmddOiBzdHJpbmd9LFxuICBib2R5Pzogc3RyaW5nLFxufTtcblxuLyoqXG4gKiBGZXRjaCBxdWVyeSByZXN1bHRzIGNsaWVudC1zaWRlXG4gKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUVuZHBvaW50KFxuICBjbGllbnQ6IENsaWVudCxcbiAgcXVlcnk6IEV4ZWN1dGFibGUsXG4pOiBQcm9taXNlPFF1ZXJ5UmVzdWx0PiB7XG4gIGNvbnN0IHJlcXVlc3RVcmwgPSBgLyR7Y2xpZW50LnVybH0vJHtjbGllbnQudmVyc2lvbn0vJHtxdWVyeS51cmx9YFxuICAgIC5yZXBsYWNlKC9cXC8rL2csICcvJykgLy8gcmVtb3ZlIGR1cGxpY2F0ZSBzbGFzaGVzXG4gICAgLnJlcGxhY2UoL1xcLyQvLCAnJyk7IC8vIHJlbW92ZSB0YWlsIHNsYXNoXG4gIGNvbnN0IHF1ZXJ5U3RyaW5nID0gZ2V0UXVlcnlTdHJpbmcocXVlcnkuYXJncyk7XG4gIGNvbnN0IG9wdGlvbnM6IFJlcXVlc3QgPSB7XG4gICAgbWV0aG9kOiBxdWVyeS5tZXRob2QsXG4gICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsXG4gICAgaGVhZGVyczoge1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICB9LFxuICB9O1xuICBpZiAocXVlcnkuZGF0YSkge1xuICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHF1ZXJ5LmRhdGEpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zb2xlLmxvZyhgZW5kcG9pbnQ6IHRyeWluZyB0byBmZXRjaCAke3JlcXVlc3RVcmx9YCwgb3B0aW9ucyk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgIHF1ZXJ5U3RyaW5nID8gYCR7cmVxdWVzdFVybH0/JHtxdWVyeVN0cmluZ31gIDogcmVxdWVzdFVybCxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcblxuICAgIC8vIExldCBjbGllbnQgZGVhbCB3aXRoIHN0YXR1cyBjb2Rlc1xuICAgIGlmIChjbGllbnQucmF3UmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKS50aGVuKHIgPT4ge1xuICAgICAgICByZXR1cm4gci5yZXN1bHQubWFwKCh7cm93fSkgPT4gcm93KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBMb2cgZXJyb3IgaW4gY29sbGFwc2VkIGdyb3VwXG4gICAgY29uc29sZS5ncm91cENvbGxhcHNlZChxdWVyeS5tZXRob2QsIGVycm9yLnN0YXR1c0NvZGUsIGVycm9yLnRpdGxlKTtcbiAgICBpZiAoJ21lc3NhZ2UnIGluIGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgIH1cbiAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgdGhyb3cgZXJyb3IudGl0bGU7XG4gIH1cbn1cblxuLy8gTWFwIHRoZSBrZXlzIG9mIHRoZSBhcmdzIG9iamVjdCB0byBhbiBhcnJheSBvZiBlbmNvZGVkIHVybCBjb21wb25lbnRzXG5mdW5jdGlvbiBnZXRRdWVyeVN0cmluZyhhcmdzOiB7W3N0cmluZ106IG1peGVkfSk6IHN0cmluZyB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhhcmdzKVxuICAgIC5zb3J0KClcbiAgICAubWFwKGFyZ05hbWUgPT4gYXJnTmFtZSBpbiBtZXRob2RzICYmIG1ldGhvZHNbYXJnTmFtZV0oYXJnc1thcmdOYW1lXSkpXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5qb2luKCcmJylcbiAgICAucmVwbGFjZSgvJiYvZywgJyYnKTtcbn1cblxudHlwZSBXaGVyZUFyZyA9IHtcbiAgbmFtZTogc3RyaW5nLFxuICBvcDogV2hlcmVPcHMsXG4gIHZhbHVlOiBhbnksXG59O1xudHlwZSBPcmRlckFyZyA9IHtcbiAgY29sdW1uOiBzdHJpbmcsXG4gIGRpcmVjdGlvbj86IHN0cmluZyxcbn07XG5jb25zdCBtZXRob2RzID0ge1xuICB3aGVyZShhcmc6IFdoZXJlQXJnIHwgQXJyYXk8V2hlcmVBcmc+KTogc3RyaW5nIHtcbiAgICAvLyB3aGVyZTogW3sgbmFtZTogJ2NvbHVtbl9uYW1lJywgb3A6ICc9JywgdmFsdWU6ICd2YWx1ZScgfV1cbiAgICByZXR1cm4gYXNBcnJheShhcmcpXG4gICAgICAubWFwKHcgPT4gYHdoZXJlPSR7dXJsRW5jb2RlKHcpfWApXG4gICAgICAuam9pbignJicpO1xuICB9LFxuICBvcmRlcihhcmc6IE9yZGVyQXJnIHwgQXJyYXk8T3JkZXJBcmc+KTogc3RyaW5nIHtcbiAgICAvLyBvcmRlcl9ieTogW3sgY29sdW1uOiAnY29sdW1uX25hbWUnLCBkaXJlY3Rpb246ICdhc2N8ZGVzYycgfV1cbiAgICAvLyBUT0RPOiByYW5kb20oKT9cbiAgICBjb25zdCBjb2x1bW5MaXN0ID0gYXNBcnJheShhcmcpLm1hcChjb2wgPT4ge1xuICAgICAgY29uc3Qge2NvbHVtbiwgZGlyZWN0aW9uID0gJ2FzYyd9ID0gY29sO1xuICAgICAgcmV0dXJuIGRpcmVjdGlvbiAhPT0gJ2FzYycgPyBgLSR7Y29sdW1ufWAgOiBgJHtjb2x1bW59YDtcbiAgICB9KTtcbiAgICByZXR1cm4gYG9yZGVyX2J5PSR7ZW5jb2RlVVJJQ29tcG9uZW50KGNvbHVtbkxpc3Quam9pbignLCcpKX1gO1xuICB9LFxuICBsaW1pdChhcmc6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIC8vIGxpbWl0OiBudW1iZXJcbiAgICBjb25zdCBwYXJzZWROdW0gPSBwYXJzZUludChhcmcpO1xuICAgIGlmICghaXNOYU4ocGFyc2VkTnVtKSkge1xuICAgICAgcmV0dXJuIGBsaW1pdD0ke3BhcnNlZE51bX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sXG4gIG9mZnNldChhcmc6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIC8vIG9mZnNldDogbnVtYmVyXG4gICAgY29uc3QgcGFyc2VkTnVtID0gcGFyc2VJbnQoYXJnKTtcbiAgICBpZiAoIWlzTmFOKHBhcnNlZE51bSkpIHtcbiAgICAgIHJldHVybiBgb3JkZXI9JHtwYXJzZWROdW19YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LFxuICBldmVudGVkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdzZXNzaW9uX2lkJztcbiAgfSxcbiAgbWV0YURhdGEoYXJnOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBgbWV0YV9kYXRhPSR7dXJsRW5jb2RlKGFyZyl9YDtcbiAgfSxcbiAgYXJncyhhcmc6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBhcmdzPSR7dXJsRW5jb2RlKGFyZyl9YDtcbiAgfSxcbiAgZXhjbHVkZShhcmc6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBleGNsdWRlPSR7dXJsRW5jb2RlKGFyZyl9YDtcbiAgfSxcbiAgaW5jbHVkZShhcmc6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBpbmNsdWRlPSR7dXJsRW5jb2RlKGFyZyl9YDtcbiAgfSxcbn07XG5cbmZ1bmN0aW9uIHVybEVuY29kZShzdHI6IGFueSk6IHN0cmluZyB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc3RyKSk7XG59XG5cbmZ1bmN0aW9uIGFzQXJyYXkoYXJnOiBhbnkpOiBhbnkge1xuICByZXR1cm4gYXJnIGluc3RhbmNlb2YgQXJyYXkgPyBhcmcgOiBbYXJnXTtcbn1cbiJdfQ==