UNPKG

aquameta-datum

Version:

Service layer for the Aquameta database API

165 lines (138 loc) 17.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createTable = createTable; exports.dropTable = dropTable; exports.getRows = getRows; exports.insertRows = insertRows; exports.updateRows = updateRows; exports.deleteRows = deleteRows; exports.tableExists = tableExists; var _index = _interopRequireDefault(require("../query/index.js")); var client = _interopRequireWildcard(require("../client.js")); var db = _interopRequireWildcard(require("../database/index.js")); var _ramda = require("ramda"); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const c = false ? client.connection() : client.endpoint(); const go = (0, _index.default)(c); const select = (0, _ramda.compose)(go, db.select); const insert = (0, _ramda.compose)(go, db.insert); const del = (0, _ramda.compose)(go, db.del); // TODO: should query be able to run multiple queries in a single transaction? // TODO: you'd want to be able to do order/limit/include/exlude from these functions too const metaSchema = db.relation('meta.schema'); const metaTable = db.relation('meta.table'); const metaColumn = db.relation('meta.column'); async function createTable(table, columns) { if (await tableExists(table)) { return; } const rel = db.relation(table); await ensureSchema(rel); await ensureTable(rel); await ensureColumns(rel, columns); } async function dropTable(table) { const rel = db.relation(table); try { await deleteRows(table); await deleteRows(metaColumn.qualified, { schema_name: rel.schemaName, relation_name: rel.relationName }); await deleteRows(metaTable.qualified, { schema_name: rel.schemaName, name: rel.relationName }); } catch (e) { console.error(e); return false; } return true; } function getRows(table) { return select(db.relation(table)); } function insertRows(table, rows) { return insert(db.relation(table), rows); } async function updateRows(table, fields, equalities) { if (equalities) { const wheres = Object.entries(equalities).map(([key, value]) => { return db.where(key, value); }); await (0, _ramda.compose)(go, ...wheres)(db.update(db.relation(table), fields)); } else { return db.update(db.relation(table), fields); } } async function deleteRows(table, equalities) { if (equalities) { const wheres = Object.entries(equalities).map(([key, value]) => { return db.where(key, value); }); await (0, _ramda.compose)(del, ...wheres)(db.relation(table)); } else { return del(db.relation(table)); } } async function tableExists(table) { const rel = db.relation(table); const rows = await (0, _ramda.compose)(select, db.where('schema_name', rel.schemaName), db.where('name', rel.relationName))(metaTable); return rows.length === 1; } async function ensureSchema(rel) { const schemaRows = db.select(metaSchema); const rows = await go(db.where('name', rel.schemaName, schemaRows)); if (rows.length === 0) { return insert(metaSchema, { name: rel.schemaName }); } } async function ensureTable(rel) { const exec = (0, _ramda.compose)(select, db.where('name', rel.relationName), db.where('schema_name', rel.schemaName)); const rows = await exec(metaTable); if (rows.length === 0) { return insert(metaTable, { name: rel.relationName, schema_name: rel.schemaName }); } } async function ensureColumns(rel, columns) { const exec = (0, _ramda.compose)(select, db.include('type_name'), db.include('name'), db.where('relation_name', rel.relationName), db.where('schema_name', rel.schemaName)); const rows = await exec(metaColumn); const columnArray = Object.entries(columns).map(([name, type_name]) => ({ schema_name: rel.schemaName, relation_name: rel.relationName, name, type_name })); if (!rows || !columnsMatch(rows, columnArray)) { // TODO: so many ways to do a full migration return insert(metaColumn, columnArray); } } function columnsMatch(columns = [], targetColumns = []) { // TODO: // So many possibilities here // May need a map of pg types to user types /* const rowMap = rows.reduce( (m, {name, type_name}) => m.set(name, type_name), new Map(), ); return cols.every( ({name, type_name}) => rowMap.has(name) && rowMap.get(name) === type_name, ); */ const colNames = columns.map(({ name }) => name); return targetColumns.every(({ name }) => colNames.includes(name)); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbImMiLCJjbGllbnQiLCJjb25uZWN0aW9uIiwiZW5kcG9pbnQiLCJnbyIsInNlbGVjdCIsImRiIiwiaW5zZXJ0IiwiZGVsIiwibWV0YVNjaGVtYSIsInJlbGF0aW9uIiwibWV0YVRhYmxlIiwibWV0YUNvbHVtbiIsImNyZWF0ZVRhYmxlIiwidGFibGUiLCJjb2x1bW5zIiwidGFibGVFeGlzdHMiLCJyZWwiLCJlbnN1cmVTY2hlbWEiLCJlbnN1cmVUYWJsZSIsImVuc3VyZUNvbHVtbnMiLCJkcm9wVGFibGUiLCJkZWxldGVSb3dzIiwicXVhbGlmaWVkIiwic2NoZW1hX25hbWUiLCJzY2hlbWFOYW1lIiwicmVsYXRpb25fbmFtZSIsInJlbGF0aW9uTmFtZSIsIm5hbWUiLCJlIiwiY29uc29sZSIsImVycm9yIiwiZ2V0Um93cyIsImluc2VydFJvd3MiLCJyb3dzIiwidXBkYXRlUm93cyIsImZpZWxkcyIsImVxdWFsaXRpZXMiLCJ3aGVyZXMiLCJPYmplY3QiLCJlbnRyaWVzIiwibWFwIiwia2V5IiwidmFsdWUiLCJ3aGVyZSIsInVwZGF0ZSIsImxlbmd0aCIsInNjaGVtYVJvd3MiLCJleGVjIiwiaW5jbHVkZSIsImNvbHVtbkFycmF5IiwidHlwZV9uYW1lIiwiY29sdW1uc01hdGNoIiwidGFyZ2V0Q29sdW1ucyIsImNvbE5hbWVzIiwiZXZlcnkiLCJpbmNsdWRlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7QUFFQSxNQUFNQSxDQUFDLEdBQUcsUUFBV0MsTUFBTSxDQUFDQyxVQUFQLEVBQVgsR0FBaUNELE1BQU0sQ0FBQ0UsUUFBUCxFQUEzQztBQUNBLE1BQU1DLEVBQUUsR0FBRyxvQkFBTUosQ0FBTixDQUFYO0FBQ0EsTUFBTUssTUFBTSxHQUFHLG9CQUNiRCxFQURhLEVBRWJFLEVBQUUsQ0FBQ0QsTUFGVSxDQUFmO0FBSUEsTUFBTUUsTUFBTSxHQUFHLG9CQUNiSCxF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RyxDQUFDUSxVQUE1QixDQUxXLENBQWI7QUFPQSxRQUFNUyxJQUFJLEdBQUcsTUFBTWMsSUFBSSxDQUFDcEMsVUFBRCxDQUF2QjtBQUNBLFFBQU1zQyxXQUFXLEdBQUdYLE1BQU0sQ0FBQ0MsT0FBUCxDQUFlekIsT0FBZixFQUF3QjBCLEdBQXhCLENBQTRCLENBQUMsQ0FBQ2IsSUFBRCxFQUFPdUIsU0FBUCxDQUFELE1BQXdCO0FBQ3RFM0IsSUFBQUEsV0FBVyxFQUFFUCxHQUFHLENBQUNRLFVBRHFEO0FBRXRFQyxJQUFBQSxhQUFhLEVBQUVULEdBQUcsQ0FBQ1UsWUFGbUQ7QUFHdEVDLElBQUFBLElBSHNFO0FBSXRFdUIsSUFBQUE7QUFKc0UsR0FBeEIsQ0FBNUIsQ0FBcEI7O0FBTUEsTUFBSSxDQUFDakIsSUFBRCxJQUFTLENBQUNrQixZQUFZLENBQUNsQixJQUFELEVBQU9nQixXQUFQLENBQTFCLEVBQStDO0FBQzdDO0FBQ0EsV0FBTzNDLE1BQU0sQ0FBQ0ssVUFBRCxFQUFhc0MsV0FBYixDQUFiO0FBQ0Q7QUFDRjs7QUFFRCxTQUFTRSxZQUFULENBQXNCckMsT0FBTyxHQUFHLEVBQWhDLEVBQW9Dc0MsYUFBYSxHQUFHLEVBQXBELEVBQXdEO0FBQ3REO0FBQ0E7QUFDQTs7QUFDQTs7Ozs7Ozs7O0FBU0EsUUFBTUMsUUFBUSxHQUFHdkMsT0FBTyxDQUFDMEIsR0FBUixDQUFZLENBQUM7QUFBQ2IsSUFBQUE7QUFBRCxHQUFELEtBQVlBLElBQXhCLENBQWpCO0FBQ0EsU0FBT3lCLGFBQWEsQ0FBQ0UsS0FBZCxDQUFvQixDQUFDO0FBQUMzQixJQUFBQTtBQUFELEdBQUQsS0FBWTBCLFFBQVEsQ0FBQ0UsUUFBVCxDQUFrQjVCLElBQWxCLENBQWhDLENBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBxdWVyeSBmcm9tICcuLi9xdWVyeS9pbmRleC5qcyc7XG5pbXBvcnQgKiBhcyBjbGllbnQgZnJvbSAnLi4vY2xpZW50LmpzJztcbmltcG9ydCAqIGFzIGRiIGZyb20gJy4uL2RhdGFiYXNlL2luZGV4LmpzJztcbmltcG9ydCB7Y29tcG9zZX0gZnJvbSAncmFtZGEnO1xuXG5jb25zdCBjID0gX19OT0RFX18gPyBjbGllbnQuY29ubmVjdGlvbigpIDogY2xpZW50LmVuZHBvaW50KCk7XG5jb25zdCBnbyA9IHF1ZXJ5KGMpO1xuY29uc3Qgc2VsZWN0ID0gY29tcG9zZShcbiAgZ28sXG4gIGRiLnNlbGVjdCxcbik7XG5jb25zdCBpbnNlcnQgPSBjb21wb3NlKFxuICBnbyxcbiAgZGIuaW5zZXJ0LFxuKTtcbmNvbnN0IGRlbCA9IGNvbXBvc2UoXG4gIGdvLFxuICBkYi5kZWwsXG4pO1xuXG4vLyBUT0RPOiBzaG91bGQgcXVlcnkgYmUgYWJsZSB0byBydW4gbXVsdGlwbGUgcXVlcmllcyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvbj9cbi8vIFRPRE86IHlvdSdkIHdhbnQgdG8gYmUgYWJsZSB0byBkbyBvcmRlci9saW1pdC9pbmNsdWRlL2V4bHVkZSBmcm9tIHRoZXNlIGZ1bmN0aW9ucyB0b29cblxuY29uc3QgbWV0YVNjaGVtYSA9IGRiLnJlbGF0aW9uKCdtZXRhLnNjaGVtYScpO1xuY29uc3QgbWV0YVRhYmxlID0gZGIucmVsYXRpb24oJ21ldGEudGFibGUnKTtcbmNvbnN0IG1ldGFDb2x1bW4gPSBkYi5yZWxhdGlvbignbWV0YS5jb2x1bW4nKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRhYmxlKHRhYmxlLCBjb2x1bW5zKSB7XG4gIGlmIChhd2FpdCB0YWJsZUV4aXN0cyh0YWJsZSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCByZWwgPSBkYi5yZWxhdGlvbih0YWJsZSk7XG5cbiAgYXdhaXQgZW5zdXJlU2NoZW1hKHJlbCk7XG4gIGF3YWl0IGVuc3VyZVRhYmxlKHJlbCk7XG4gIGF3YWl0IGVuc3VyZUNvbHVtbnMocmVsLCBjb2x1bW5zKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRyb3BUYWJsZSh0YWJsZSkge1xuICBjb25zdCByZWwgPSBkYi5yZWxhdGlvbih0YWJsZSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZGVsZXRlUm93cyh0YWJsZSk7XG4gICAgYXdhaXQgZGVsZXRlUm93cyhtZXRhQ29sdW1uLnF1YWxpZmllZCwge1xuICAgICAgc2NoZW1hX25hbWU6IHJlbC5zY2hlbWFOYW1lLFxuICAgICAgcmVsYXRpb25fbmFtZTogcmVsLnJlbGF0aW9uTmFtZSxcbiAgICB9KTtcbiAgICBhd2FpdCBkZWxldGVSb3dzKG1ldGFUYWJsZS5xdWFsaWZpZWQsIHtcbiAgICAgIHNjaGVtYV9uYW1lOiByZWwuc2NoZW1hTmFtZSxcbiAgICAgIG5hbWU6IHJlbC5yZWxhdGlvbk5hbWUsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJvd3ModGFibGUpIHtcbiAgcmV0dXJuIHNlbGVjdChkYi5yZWxhdGlvbih0YWJsZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0Um93cyh0YWJsZSwgcm93cykge1xuICByZXR1cm4gaW5zZXJ0KGRiLnJlbGF0aW9uKHRhYmxlKSwgcm93cyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVSb3dzKFxuICB0YWJsZTogc3RyaW5nLFxuICBmaWVsZHM6IHtbc3RyaW5nXTogYW55fSxcbiAgZXF1YWxpdGllcz86IHtbc3RyaW5nXTogYW55fSxcbikge1xuICBpZiAoZXF1YWxpdGllcykge1xuICAgIGNvbnN0IHdoZXJlcyA9IE9iamVjdC5lbnRyaWVzKGVxdWFsaXRpZXMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICByZXR1cm4gZGIud2hlcmUoa2V5LCB2YWx1ZSk7XG4gICAgfSk7XG4gICAgYXdhaXQgY29tcG9zZShcbiAgICAgIGdvLFxuICAgICAgLi4ud2hlcmVzLFxuICAgICkoZGIudXBkYXRlKGRiLnJlbGF0aW9uKHRhYmxlKSwgZmllbGRzKSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRiLnVwZGF0ZShkYi5yZWxhdGlvbih0YWJsZSksIGZpZWxkcyk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVJvd3ModGFibGU6IHN0cmluZywgZXF1YWxpdGllcz86IHtbc3RyaW5nXTogYW55fSkge1xuICBpZiAoZXF1YWxpdGllcykge1xuICAgIGNvbnN0IHdoZXJlcyA9IE9iamVjdC5lbnRyaWVzKGVxdWFsaXRpZXMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICByZXR1cm4gZGIud2hlcmUoa2V5LCB2YWx1ZSk7XG4gICAgfSk7XG4gICAgYXdhaXQgY29tcG9zZShcbiAgICAgIGRlbCxcbiAgICAgIC4uLndoZXJlcyxcbiAgICApKGRiLnJlbGF0aW9uKHRhYmxlKSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRlbChkYi5yZWxhdGlvbih0YWJsZSkpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0YWJsZUV4aXN0cyh0YWJsZSkge1xuICBjb25zdCByZWwgPSBkYi5yZWxhdGlvbih0YWJsZSk7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCBjb21wb3NlKFxuICAgIHNlbGVjdCxcbiAgICBkYi53aGVyZSgnc2NoZW1hX25hbWUnLCByZWwuc2NoZW1hTmFtZSksXG4gICAgZGIud2hlcmUoJ25hbWUnLCByZWwucmVsYXRpb25OYW1lKSxcbiAgKShtZXRhVGFibGUpO1xuICByZXR1cm4gcm93cy5sZW5ndGggPT09IDE7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZVNjaGVtYShyZWwpIHtcbiAgY29uc3Qgc2NoZW1hUm93cyA9IGRiLnNlbGVjdChtZXRhU2NoZW1hKTtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IGdvKGRiLndoZXJlKCduYW1lJywgcmVsLnNjaGVtYU5hbWUsIHNjaGVtYVJvd3MpKTtcbiAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGluc2VydChtZXRhU2NoZW1hLCB7bmFtZTogcmVsLnNjaGVtYU5hbWV9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVUYWJsZShyZWwpIHtcbiAgY29uc3QgZXhlYyA9IGNvbXBvc2UoXG4gICAgc2VsZWN0LFxuICAgIGRiLndoZXJlKCduYW1lJywgcmVsLnJlbGF0aW9uTmFtZSksXG4gICAgZGIud2hlcmUoJ3NjaGVtYV9uYW1lJywgcmVsLnNjaGVtYU5hbWUpLFxuICApO1xuICBjb25zdCByb3dzID0gYXdhaXQgZXhlYyhtZXRhVGFibGUpO1xuICBpZiAocm93cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gaW5zZXJ0KG1ldGFUYWJsZSwge1xuICAgICAgbmFtZTogcmVsLnJlbGF0aW9uTmFtZSxcbiAgICAgIHNjaGVtYV9uYW1lOiByZWwuc2NoZW1hTmFtZSxcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVDb2x1bW5zKHJlbCwgY29sdW1ucykge1xuICBjb25zdCBleGVjID0gY29tcG9zZShcbiAgICBzZWxlY3QsXG4gICAgZGIuaW5jbHVkZSgndHlwZV9uYW1lJyksXG4gICAgZGIuaW5jbHVkZSgnbmFtZScpLFxuICAgIGRiLndoZXJlKCdyZWxhdGlvbl9uYW1lJywgcmVsLnJlbGF0aW9uTmFtZSksXG4gICAgZGIud2hlcmUoJ3NjaGVtYV9uYW1lJywgcmVsLnNjaGVtYU5hbWUpLFxuICApO1xuICBjb25zdCByb3dzID0gYXdhaXQgZXhlYyhtZXRhQ29sdW1uKTtcbiAgY29uc3QgY29sdW1uQXJyYXkgPSBPYmplY3QuZW50cmllcyhjb2x1bW5zKS5tYXAoKFtuYW1lLCB0eXBlX25hbWVdKSA9PiAoe1xuICAgIHNjaGVtYV9uYW1lOiByZWwuc2NoZW1hTmFtZSxcbiAgICByZWxhdGlvbl9uYW1lOiByZWwucmVsYXRpb25OYW1lLFxuICAgIG5hbWUsXG4gICAgdHlwZV9uYW1lLFxuICB9KSk7XG4gIGlmICghcm93cyB8fCAhY29sdW1uc01hdGNoKHJvd3MsIGNvbHVtbkFycmF5KSkge1xuICAgIC8vIFRPRE86IHNvIG1hbnkgd2F5cyB0byBkbyBhIGZ1bGwgbWlncmF0aW9uXG4gICAgcmV0dXJuIGluc2VydChtZXRhQ29sdW1uLCBjb2x1bW5BcnJheSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sdW1uc01hdGNoKGNvbHVtbnMgPSBbXSwgdGFyZ2V0Q29sdW1ucyA9IFtdKSB7XG4gIC8vIFRPRE86XG4gIC8vIFNvIG1hbnkgcG9zc2liaWxpdGllcyBoZXJlXG4gIC8vIE1heSBuZWVkIGEgbWFwIG9mIHBnIHR5cGVzIHRvIHVzZXIgdHlwZXNcbiAgLypcbiAgY29uc3Qgcm93TWFwID0gcm93cy5yZWR1Y2UoXG4gICAgKG0sIHtuYW1lLCB0eXBlX25hbWV9KSA9PiBtLnNldChuYW1lLCB0eXBlX25hbWUpLFxuICAgIG5ldyBNYXAoKSxcbiAgKTtcbiAgcmV0dXJuIGNvbHMuZXZlcnkoXG4gICAgKHtuYW1lLCB0eXBlX25hbWV9KSA9PiByb3dNYXAuaGFzKG5hbWUpICYmIHJvd01hcC5nZXQobmFtZSkgPT09IHR5cGVfbmFtZSxcbiAgKTtcbiAgKi9cbiAgY29uc3QgY29sTmFtZXMgPSBjb2x1bW5zLm1hcCgoe25hbWV9KSA9PiBuYW1lKTtcbiAgcmV0dXJuIHRhcmdldENvbHVtbnMuZXZlcnkoKHtuYW1lfSkgPT4gY29sTmFtZXMuaW5jbHVkZXMobmFtZSkpO1xufVxuIl19