aquameta-datum
Version:
Service layer for the Aquameta database API
78 lines (72 loc) • 9.67 kB
JavaScript
import url from 'url';
import { __, curry } from 'ramda';
import { DELETE, INSERT, SELECT, UPDATE, getMethodFromType } from './constants.js';
import { compose } from 'ramda';
import { addArg } from './args.js';
import { fn } from './chainable.js'; // TODO move this
import { parseSourceUrl } from '../query/connection.js';
const EXECUTABLE = Symbol.for('executable');
const createExecutable = curry((method, chainable, data) => ({
method,
url: chainable.url,
args: chainable.args,
// SELECT, UPDATE, DELETE use args
version: chainable.version || null,
data,
// UPDATE and INSERT use data
type: EXECUTABLE
}));
export function isInvalidExecutable(executable) {
return !(executable.type === EXECUTABLE);
} // $FlowFixMe
export const del = createExecutable(getMethodFromType(DELETE), __, null);
export const insert = createExecutable(getMethodFromType(INSERT));
export const select = createExecutable(getMethodFromType(SELECT), __, null);
export const update = createExecutable(getMethodFromType(UPDATE));
/**
* Parse http request and return executable
*
* e.g.
* query(
* client.connection(),
* database.http(req)
* ).then(...).catch(...)
*
* http requests are either datum calls or source urls
* source urls return a single column and have the format: /db/schema/rel/name.column
*/
const sourceUrlRegex = /^\/db\/.+\/.+\/.+\..+/;
const source = addArg('source', true);
export const http = true ? function http(req) {
const parsed = url.parse(req.url, true);
const {
pathname
} = parsed;
if (pathname && sourceUrlRegex.test(pathname)) {
// return createExecutable('GET', {url: pathname, args: {source: true}}, null);
if (true) {
const {
schemaName,
relationName,
column,
name
} = parseSourceUrl(pathname);
const func = fn('endpoint.source', [schemaName, relationName, column, name]); // $FlowFixMe
return compose(select, source)(func);
}
} else if (pathname) {
// TODO: does something need to happen here with versions?
/*
const [, version] = /\/?(.+)\//.exec(pathname);
console.log(version);
*/
const url = pathname.replace(/\/?.+?\//, '');
return createExecutable(req.method, {
url,
args: parsed.query || {}
}, req.body || null);
} else {
return null;
}
} : null;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV4ZWN1dGFibGUuanMiXSwibmFtZXMiOlsidXJsIiwiX18iLCJjdXJyeSIsIkRFTEVURSIsIklOU0VSVCIsIlNFTEVDVCIsIlVQREFURSIsImdldE1ldGhvZEZyb21UeXBlIiwiY29tcG9zZSIsImFkZEFyZyIsImZuIiwicGFyc2VTb3VyY2VVcmwiLCJFWEVDVVRBQkxFIiwiU3ltYm9sIiwiZm9yIiwiY3JlYXRlRXhlY3V0YWJsZSIsIm1ldGhvZCIsImNoYWluYWJsZSIsImRhdGEiLCJhcmdzIiwidmVyc2lvbiIsInR5cGUiLCJpc0ludmFsaWRFeGVjdXRhYmxlIiwiZXhlY3V0YWJsZSIsImRlbCIsImluc2VydCIsInNlbGVjdCIsInVwZGF0ZSIsInNvdXJjZVVybFJlZ2V4Iiwic291cmNlIiwiaHR0cCIsInJlcSIsInBhcnNlZCIsInBhcnNlIiwicGF0aG5hbWUiLCJ0ZXN0Iiwic2NoZW1hTmFtZSIsInJlbGF0aW9uTmFtZSIsImNvbHVtbiIsIm5hbWUiLCJmdW5jIiwicmVwbGFjZSIsInF1ZXJ5IiwiYm9keSJdLCJtYXBwaW5ncyI6IkFBRUEsT0FBT0EsR0FBUCxNQUFnQixLQUFoQjtBQUNBLFNBQVFDLEVBQVIsRUFBWUMsS0FBWixRQUF3QixPQUF4QjtBQUNBLFNBQ0VDLE1BREYsRUFFRUMsTUFGRixFQUdFQyxNQUhGLEVBSUVDLE1BSkYsRUFLRUMsaUJBTEYsUUFNTyxnQkFOUDtBQVFBLFNBQVFDLE9BQVIsUUFBc0IsT0FBdEI7QUFDQSxTQUFRQyxNQUFSLFFBQXFCLFdBQXJCO0FBQ0EsU0FBUUMsRUFBUixRQUFpQixnQkFBakIsQyxDQUVBOztBQUNBLFNBQVFDLGNBQVIsUUFBNkIsd0JBQTdCO0FBRUEsTUFBTUMsVUFBVSxHQUFHQyxNQUFNLENBQUNDLEdBQVAsQ0FBVyxZQUFYLENBQW5CO0FBRUEsTUFBTUMsZ0JBQWdCLEdBQUdiLEtBQUssQ0FNNUIsQ0FDRWMsTUFERixFQUVFQyxTQUZGLEVBR0VDLElBSEYsTUFJa0I7QUFDaEJGLEVBQUFBLE1BRGdCO0FBRWhCaEIsRUFBQUEsR0FBRyxFQUFFaUIsU0FBUyxDQUFDakIsR0FGQztBQUdoQm1CLEVBQUFBLElBQUksRUFBRUYsU0FBUyxDQUFDRSxJQUhBO0FBR007QUFDdEJDLEVBQUFBLE9BQU8sRUFBRUgsU0FBUyxDQUFDRyxPQUFWLElBQXFCLElBSmQ7QUFLaEJGLEVBQUFBLElBTGdCO0FBS1Y7QUFDTkcsRUFBQUEsSUFBSSxFQUFFVDtBQU5VLENBSmxCLENBTjRCLENBQTlCO0FBb0JBLE9BQU8sU0FBU1UsbUJBQVQsQ0FBNkJDLFVBQTdCLEVBQThEO0FBQ25FLFNBQU8sRUFBRUEsVUFBVSxDQUFDRixJQUFYLEtBQW9CVCxVQUF0QixDQUFQO0FBQ0QsQyxDQUVEOztBQUNBLE9BQU8sTUFBTVksR0FBRyxHQUFHVCxnQkFBZ0IsQ0FBQ1IsaUJBQWlCLENBQUNKLE1BQUQsQ0FBbEIsRUFBNkJGLEVBQTdCLEVBQXVDLElBQXZDLENBQTVCO0FBQ1AsT0FBTyxNQUFNd0IsTUFBTSxHQUFHVixnQkFBZ0IsQ0FBQ1IsaUJBQWlCLENBQUNILE1BQUQsQ0FBbEIsQ0FBL0I7QUFDUCxPQUFPLE1BQU1zQixNQUFNLEdBQUdYLGdCQUFnQixDQUNwQ1IsaUJBQWlCLENBQUNGLE1BQUQsQ0FEbUIsRUFFbkNKLEVBRm1DLEVBR3BDLElBSG9DLENBQS9CO0FBS1AsT0FBTyxNQUFNMEIsTUFBTSxHQUFHWixnQkFBZ0IsQ0FBQ1IsaUJBQWlCLENBQUNELE1BQUQsQ0FBbEIsQ0FBL0I7O0FBT1A7Ozs7Ozs7Ozs7OztBQVlBLE1BQU1zQixjQUFjLEdBQUcsdUJBQXZCO0FBQ0EsTUFBTUMsTUFBTSxHQUFHcEIsTUFBTSxDQUFDLFFBQUQsRUFBVyxJQUFYLENBQXJCO0FBQ0EsT0FBTyxNQUFNcUIsSUFBSSxHQUFHLE9BQVcsU0FBU0EsSUFBVCxDQUFjQyxHQUFkLEVBQW1EO0FBQ2hGLFFBQU1DLE1BQWlCLEdBQUdoQyxHQUFHLENBQUNpQyxLQUFKLENBQVVGLEdBQUcsQ0FBQy9CLEdBQWQsRUFBbUIsSUFBbkIsQ0FBMUI7QUFDQSxRQUFNO0FBQUNrQyxJQUFBQTtBQUFELE1BQWFGLE1BQW5COztBQUVBLE1BQUlFLFFBQVEsSUFBSU4sY0FBYyxDQUFDTyxJQUFmLENBQW9CRCxRQUFwQixDQUFoQixFQUErQztBQUM3QztBQUNBLGNBQWM7QUFDWixZQUFNO0FBQUNFLFFBQUFBLFVBQUQ7QUFBYUMsUUFBQUEsWUFBYjtBQUEyQkMsUUFBQUEsTUFBM0I7QUFBbUNDLFFBQUFBO0FBQW5DLFVBQTJDNUIsY0FBYyxDQUFDdUIsUUFBRCxDQUEvRDtBQUNBLFlBQU1NLElBQUksR0FBRzlCLEVBQUUsQ0FBQyxpQkFBRCxFQUFvQixDQUNqQzBCLFVBRGlDLEVBRWpDQyxZQUZpQyxFQUdqQ0MsTUFIaUMsRUFJakNDLElBSmlDLENBQXBCLENBQWYsQ0FGWSxDQVFaOztBQUNBLGFBQU8vQixPQUFPLENBQ1prQixNQURZLEVBRVpHLE1BRlksQ0FBUCxDQUdMVyxJQUhLLENBQVA7QUFJRDtBQUNGLEdBaEJELE1BZ0JPLElBQUlOLFFBQUosRUFBYztBQUNuQjs7QUFDQTs7OztBQUlBLFVBQU1sQyxHQUFHLEdBQUdrQyxRQUFRLENBQUNPLE9BQVQsQ0FBaUIsVUFBakIsRUFBNkIsRUFBN0IsQ0FBWjtBQUNBLFdBQU8xQixnQkFBZ0IsQ0FDckJnQixHQUFHLENBQUNmLE1BRGlCLEVBRXJCO0FBQUNoQixNQUFBQSxHQUFEO0FBQU1tQixNQUFBQSxJQUFJLEVBQUVhLE1BQU0sQ0FBQ1UsS0FBUCxJQUFnQjtBQUE1QixLQUZxQixFQUdyQlgsR0FBRyxDQUFDWSxJQUFKLElBQVksSUFIUyxDQUF2QjtBQUtELEdBWk0sTUFZQTtBQUNMLFdBQU8sSUFBUDtBQUNEO0FBQ0YsQ0FuQ21CLEdBbUNoQixJQW5DRyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEBmbG93XG5cbmltcG9ydCB1cmwgZnJvbSAndXJsJztcbmltcG9ydCB7X18sIGN1cnJ5fSBmcm9tICdyYW1kYSc7XG5pbXBvcnQge1xuICBERUxFVEUsXG4gIElOU0VSVCxcbiAgU0VMRUNULFxuICBVUERBVEUsXG4gIGdldE1ldGhvZEZyb21UeXBlLFxufSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgdHlwZSB7RXhlY3V0YWJsZSwgSFRUUFJlcXVlc3R9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7Y29tcG9zZX0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHthZGRBcmd9IGZyb20gJy4vYXJncy5qcyc7XG5pbXBvcnQge2ZufSBmcm9tICcuL2NoYWluYWJsZS5qcyc7XG5cbi8vIFRPRE8gbW92ZSB0aGlzXG5pbXBvcnQge3BhcnNlU291cmNlVXJsfSBmcm9tICcuLi9xdWVyeS9jb25uZWN0aW9uLmpzJztcblxuY29uc3QgRVhFQ1VUQUJMRSA9IFN5bWJvbC5mb3IoJ2V4ZWN1dGFibGUnKTtcblxuY29uc3QgY3JlYXRlRXhlY3V0YWJsZSA9IGN1cnJ5PFxuICBzdHJpbmcsXG4gIEV4ZWN1dGFibGUsXG4gIHtbc3RyaW5nXTogbWl4ZWR9LFxuICBFeGVjdXRhYmxlLFxuPihcbiAgKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIGNoYWluYWJsZTogRXhlY3V0YWJsZSxcbiAgICBkYXRhOiA/e1tzdHJpbmddOiBtaXhlZH0sXG4gICk6IEV4ZWN1dGFibGUgPT4gKHtcbiAgICBtZXRob2QsXG4gICAgdXJsOiBjaGFpbmFibGUudXJsLFxuICAgIGFyZ3M6IGNoYWluYWJsZS5hcmdzLCAvLyBTRUxFQ1QsIFVQREFURSwgREVMRVRFIHVzZSBhcmdzXG4gICAgdmVyc2lvbjogY2hhaW5hYmxlLnZlcnNpb24gfHwgbnVsbCxcbiAgICBkYXRhLCAvLyBVUERBVEUgYW5kIElOU0VSVCB1c2UgZGF0YVxuICAgIHR5cGU6IEVYRUNVVEFCTEUsXG4gIH0pLFxuKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzSW52YWxpZEV4ZWN1dGFibGUoZXhlY3V0YWJsZTogRXhlY3V0YWJsZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gIShleGVjdXRhYmxlLnR5cGUgPT09IEVYRUNVVEFCTEUpO1xufVxuXG4vLyAkRmxvd0ZpeE1lXG5leHBvcnQgY29uc3QgZGVsID0gY3JlYXRlRXhlY3V0YWJsZShnZXRNZXRob2RGcm9tVHlwZShERUxFVEUpLCAoX186IGFueSksIG51bGwpO1xuZXhwb3J0IGNvbnN0IGluc2VydCA9IGNyZWF0ZUV4ZWN1dGFibGUoZ2V0TWV0aG9kRnJvbVR5cGUoSU5TRVJUKSk7XG5leHBvcnQgY29uc3Qgc2VsZWN0ID0gY3JlYXRlRXhlY3V0YWJsZShcbiAgZ2V0TWV0aG9kRnJvbVR5cGUoU0VMRUNUKSxcbiAgKF9fOiBhbnkpLFxuICBudWxsLFxuKTtcbmV4cG9ydCBjb25zdCB1cGRhdGUgPSBjcmVhdGVFeGVjdXRhYmxlKGdldE1ldGhvZEZyb21UeXBlKFVQREFURSkpO1xuXG50eXBlIFBhcnNlZFVybCA9IHtcbiAgcGF0aG5hbWU/OiBzdHJpbmcsXG4gIHF1ZXJ5Pzoge1tzdHJpbmddOiBtaXhlZH0sXG59O1xuXG4vKipcbiAqIFBhcnNlIGh0dHAgcmVxdWVzdCBhbmQgcmV0dXJuIGV4ZWN1dGFibGVcbiAqXG4gKiBlLmcuXG4gKiBxdWVyeShcbiAqICAgY2xpZW50LmNvbm5lY3Rpb24oKSxcbiAqICAgZGF0YWJhc2UuaHR0cChyZXEpXG4gKiApLnRoZW4oLi4uKS5jYXRjaCguLi4pXG4gKlxuICogaHR0cCByZXF1ZXN0cyBhcmUgZWl0aGVyIGRhdHVtIGNhbGxzIG9yIHNvdXJjZSB1cmxzXG4gKiBzb3VyY2UgdXJscyByZXR1cm4gYSBzaW5nbGUgY29sdW1uIGFuZCBoYXZlIHRoZSBmb3JtYXQ6IC9kYi9zY2hlbWEvcmVsL25hbWUuY29sdW1uXG4gKi9cbmNvbnN0IHNvdXJjZVVybFJlZ2V4ID0gL15cXC9kYlxcLy4rXFwvLitcXC8uK1xcLi4rLztcbmNvbnN0IHNvdXJjZSA9IGFkZEFyZygnc291cmNlJywgdHJ1ZSk7XG5leHBvcnQgY29uc3QgaHR0cCA9IF9fTk9ERV9fID8gZnVuY3Rpb24gaHR0cChyZXE6IEhUVFBSZXF1ZXN0KTogRXhlY3V0YWJsZSB8IG51bGwge1xuICBjb25zdCBwYXJzZWQ6IFBhcnNlZFVybCA9IHVybC5wYXJzZShyZXEudXJsLCB0cnVlKTtcbiAgY29uc3Qge3BhdGhuYW1lfSA9IHBhcnNlZDtcblxuICBpZiAocGF0aG5hbWUgJiYgc291cmNlVXJsUmVnZXgudGVzdChwYXRobmFtZSkpIHtcbiAgICAvLyByZXR1cm4gY3JlYXRlRXhlY3V0YWJsZSgnR0VUJywge3VybDogcGF0aG5hbWUsIGFyZ3M6IHtzb3VyY2U6IHRydWV9fSwgbnVsbCk7XG4gICAgaWYgKF9fTk9ERV9fKSB7XG4gICAgICBjb25zdCB7c2NoZW1hTmFtZSwgcmVsYXRpb25OYW1lLCBjb2x1bW4sIG5hbWV9ID0gcGFyc2VTb3VyY2VVcmwocGF0aG5hbWUpO1xuICAgICAgY29uc3QgZnVuYyA9IGZuKCdlbmRwb2ludC5zb3VyY2UnLCBbXG4gICAgICAgIHNjaGVtYU5hbWUsXG4gICAgICAgIHJlbGF0aW9uTmFtZSxcbiAgICAgICAgY29sdW1uLFxuICAgICAgICBuYW1lLFxuICAgICAgXSk7XG4gICAgICAvLyAkRmxvd0ZpeE1lXG4gICAgICByZXR1cm4gY29tcG9zZShcbiAgICAgICAgc2VsZWN0LFxuICAgICAgICBzb3VyY2UsXG4gICAgICApKGZ1bmMpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChwYXRobmFtZSkge1xuICAgIC8vIFRPRE86IGRvZXMgc29tZXRoaW5nIG5lZWQgdG8gaGFwcGVuIGhlcmUgd2l0aCB2ZXJzaW9ucz9cbiAgICAvKlxuICAgIGNvbnN0IFssIHZlcnNpb25dID0gL1xcLz8oLispXFwvLy5leGVjKHBhdGhuYW1lKTtcbiAgICBjb25zb2xlLmxvZyh2ZXJzaW9uKTtcbiAgICAqL1xuICAgIGNvbnN0IHVybCA9IHBhdGhuYW1lLnJlcGxhY2UoL1xcLz8uKz9cXC8vLCAnJyk7XG4gICAgcmV0dXJuIGNyZWF0ZUV4ZWN1dGFibGUoXG4gICAgICByZXEubWV0aG9kLFxuICAgICAge3VybCwgYXJnczogcGFyc2VkLnF1ZXJ5IHx8IHt9fSxcbiAgICAgIHJlcS5ib2R5IHx8IG51bGwsXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufSA6IG51bGw7XG4iXX0=